Использование Google API в Firebase Funcion - PullRequest
0 голосов
/ 08 ноября 2018

Я хотел бы использовать API ядра Google iot из функции Firebase. Все работает, но очень медленно. Я думаю, что это связано с процессом аутентификации, который должен быть выполнен за один звонок. Есть ли способ ускорить это?

Прямо сейчас у меня есть это:

function getClient(cb) {
    const API_VERSION = 'v1';
    const DISCOVERY_API = 'https://cloudiot.googleapis.com/$discovery/rest';
    const jwtAccess = new google.auth.JWT();
    jwtAccess.fromJSON(serviceAccount);
    // Note that if you require additional scopes, they should be specified as a
    // string, separated by spaces.
    jwtAccess.scopes = 'https://www.googleapis.com/auth/cloud-platform';
    // Set the default authentication to the above JWT access.
    google.options({ auth: jwtAccess });
    const discoveryUrl = `${DISCOVERY_API}?version=${API_VERSION}`;
    google.discoverAPI(discoveryUrl, {}).then( end_point => {
        cb(end_point);
    });
}

И это позволяет мне сделать:

export function sendCommandToDevice(deviceId, subfolder, mqtt_data) {
    const cloudRegion = 'europe-west1';
    const projectId = 'my-project-id;
    const registryId = 'my-registry-id';

    getClient(client => {
        const parentName = `projects/${projectId}/locations/${cloudRegion}`;
        const registryName = `${parentName}/registries/${registryId}`;
        const binaryData = Buffer.from(mqtt_data).toString('base64');
        const request = {
            name: `${registryName}/devices/${deviceId}`,
            binaryData: binaryData,
            subfolder: subfolder
        };
        client.projects.locations.registries.devices.sendCommandToDevice(request,
            (err, data) => {
                if (err) {
                    console.log('Could not update config:', deviceId);
                }
            });
    });
}

Я нашел способ ускорить его, чтобы избежать аутентификации. Я решил это следующим образом:

const google = new GoogleApis();
const API_VERSION = 'v1';
const DISCOVERY_API = 'https://cloudiot.googleapis.com/$discovery/rest';
const jwtAccess = new google.auth.JWT();
jwtAccess.fromJSON(serviceAccount);
// Note that if you require additional scopes, they should be specified as a
// string, separated by spaces.
jwtAccess.scopes = 'https://www.googleapis.com/auth/cloud-platform';
// Set the default authentication to the above JWT access.
google.options({ auth: jwtAccess });
const discoveryUrl = `${DISCOVERY_API}?version=${API_VERSION}`;
var googleClient;
google.discoverAPI(discoveryUrl, {}).then( client => {
    //cb(end_point);
    googleClient = client;
});

// Returns an authorized API client by discovering the Cloud IoT Core API with
// the provided API key.
function getClient(cb) {
    cb(googleClient);
}

Но когда же происходит, когда истекает срок действия клиента? Есть ли хорошее решение от использования Google Apis из функций Firebase?

1 Ответ

0 голосов
/ 15 ноября 2018

Проблема может заключаться в обнаружении предметов. Существует прямой REST API администратора IoT Core, поэтому вам не нужно использовать обнаружение ... Я думаю. Я не работал с функциями Firebase, но они примерно эквивалентны облачным функциям Google, которые могут также работать здесь. Код, который мы (в живом демо) сделали для выполнения того, что вы делаете, это здесь , если вы хотите возиться и посмотреть, сможете ли вы запустить его в функции Firebase.

...