如何使用Google云函数和MQTT桥更新设备配置
我将谷歌云物联网用于发布/订阅 我有一个设备读取传感器数据并将其发送到Pub/Sub中的一个主题 我有一个由此消息触发的主题云功能,我希望更新设备配置,但由于以下权限错误,我无法更新 index.js:如何使用Google云函数和MQTT桥更新设备配置,mqtt,google-cloud-functions,google-cloud-pubsub,google-cloud-iot,Mqtt,Google Cloud Functions,Google Cloud Pubsub,Google Cloud Iot,我将谷歌云物联网用于发布/订阅 我有一个设备读取传感器数据并将其发送到Pub/Sub中的一个主题 我有一个由此消息触发的主题云功能,我希望更新设备配置,但由于以下权限错误,我无法更新 index.js: /** * Triggered from a message on a Cloud Pub/Sub topic. * * @param {!Object} event The Cloud Functions event. * @param {!Function} The callback
/**
* Triggered from a message on a Cloud Pub/Sub topic.
*
* @param {!Object} event The Cloud Functions event.
* @param {!Function} The callback function.
*/
var google = require('googleapis');
//var tt = google.urlshortener('v1');
//console.log(Object.getOwnPropertyNames(google.getAPIs()));
var cloudiot = google.cloudiot('v1');
function handleDeviceGet(authClient, name, device_id, err, data) {
if (err) {
console.log('Error with get device:', device_id);
console.log(err);
return;
}
console.log('Got device:', device_id);
console.log(data);
console.log(data.config);
var data2 = JSON.parse(
Buffer.from(data.config.binaryData, 'base64').toString());
console.log(data2);
data2.on = !data2.on;
console.log(data2);
var request2 = {
name: name,
resource: {
'versionToUpdate' : data.config.version,
'binaryData' : Buffer(JSON.stringify(data2)).toString('base64')
},
auth: authClient
};
console.log('request2' + request2);
var devices = cloudiot.projects.locations.registries.devices;
devices.modifyCloudToDeviceConfig(request2, (err, data) => {
if (err) {
console.log('Error patching device:', device_id);
console.log(err);
} else {
console.log('Patched device:', device_id);
console.log(data);
}
});
}
const handleAuth = (device_id) => {
console.log(device_id);
return (err, authClient) => {
const project_id = 'animated-bonsai-195009';
const cloud_region = 'us-central1';
const registry_id = 'reg1';
const name = `projects / ${project_id} /locations / ${cloud_region} /` +
`registries / ${registry_id} /devices / ${device_id}`;
if (err) {
console.log(err);
}
if (authClient.createScopedRequired &&
authClient.createScopedRequired()) {
authClient = authClient.createScoped(
['https://www.googleapis.com/auth/cloud-platforme']);
}
var request = {
name: name,
auth: authClient
};
// Get device version
var devices = cloudiot.projects.locations.registries.devices;
devices.get(request, (err, data) =>
handleDeviceGet(authClient, name, device_id, err, data));
}
};
exports.subscribe = (event, callback) => {
// The Cloud Pub/Sub Message object.
const pubsubMessage = event.data;
// We're just going to log the message to prove that
// it worked.
var obj = JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString());
console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
console.log(event);
console.log(Object.getOwnPropertyNames(event));
console.log(callback);
let message = {
"watter": 1
};
message = new Buffer(JSON.stringify(message));
const req = {
name: event.data.deviceId,
resource: message
};
console.log(obj.deviceId);
google.auth.getApplicationDefault(handleAuth(obj['deviceId']));
// Don't forget to call the callback.
callback();
};
package.json:
{
"name": "sample-pubsub",
"version": "0.0.1",
"dependencies": {
"googleapis": "25.0.0"
}
}
错误:
有几个选项:
- 检查您是否为创建Google Cloud函数时使用的项目启用了API访问
- 检查您的项目是否已完成
- 如果您正在使用
。。。从包含gcloud测试版函数部署您的谷歌云函数
和.js
文件的文件夹中,您可能需要设置环境变量(package.json
和GCLOUD\u项目
)或者在部署之前使用GOOGLE\u应用程序_凭据
,以防您有多个谷歌云项目,并且需要在配置的项目上启用APIgcloud auth application default login
更新向您展示了如何做到这一点-请注意,谷歌云功能的一些更新要求您使用更新版本的Node JS客户端库,如和中所述,请注意。请将错误消息文本复制到问题本身,以便更易于阅读和搜索。我复制了有用的部分:
错误:尝试检索计算引擎内置服务帐户的accesstoken时返回了未找到的错误。这可能是因为计算引擎实例没有指定任何权限范围。
我在云函数中遇到了相同的问题:我试图在云函数环境中获取defaultCredentials,但收到了相同的错误消息。