如何通过Google Apps Script访问IoT Core设备及多设备适配问题
问题解决方案
一、解决多设备场景下的「设备未找到」问题
问题根源
你的脚本硬编码了PROJECT_ID(对应SMD API中的enterprise ID),但每个Nest用户的设备都隶属于自己独有的enterprise ID,而非开发者的项目ID。其他用户使用脚本时,用你的PROJECT_ID拼接设备name进行匹配,自然找不到他们自己的设备。
修复方案
修改设备匹配逻辑,无需依赖硬编码的PROJECT_ID,直接通过设备ID后缀匹配:
// 替换原查找逻辑 const device = devices.find(d => d.name.endsWith('/' + THERMOSTAT));
用户设备的name格式为enterprises/{用户自己的enterprise_id}/devices/{设备ID},使用endsWith可忽略前面的enterprise ID部分,只匹配设备ID后缀,确保能找到用户自己的设备。
同时优化用户体验,自动列出可选设备避免手动输入错误:
// 在获取devices后添加 if (devices.length > 0) { console.log("可用设备列表:"); devices.forEach(d => { const deviceId = d.name.split('/').pop(); console.log(`名称:${d.displayName},ID:${deviceId}`); }); }
二、访问Google Cloud Console中的Dummy设备
必要条件与操作步骤
- 绑定正确的Cloud项目:确保脚本的OAuth配置关联到你创建dummy设备的Google Cloud项目,这样获取的access token才有访问权限。
- 使用正确的项目ID:dummy设备的enterprise ID就是你的Cloud项目ID,调用API时需用该ID拼接端点:
const PROJECT_ID = "你的Google Cloud项目ID"; // 填入创建dummy设备的项目ID const endpoint = '/enterprises/' + PROJECT_ID + '/devices'; - 配置权限:
- 自己使用时,确保你的Google账号在该Cloud项目中拥有
Smart Device Management Viewer或更高权限角色; - 分享给其他用户时,需在Cloud Console中给该用户添加对应角色,同时脚本的OAuth范围要包含
https://www.googleapis.com/auth/sdm.service。
- 自己使用时,确保你的Google账号在该Cloud项目中拥有
- 匹配dummy设备:可使用完整name拼接(此时PROJECT_ID正确)或
endsWith匹配设备ID:// 假设dummy设备ID为"DUMMY_ID" const device = devices.find(d => d.name === 'enterprises/' + PROJECT_ID + '/devices/DUMMY_ID');
优化后的changetemp函数示例
function changetemp() { // 运行makerequesttest后复制设备ID填入 const THERMOSTAT = ''; const smartService = getSmartService(); const access_token = smartService.getAccessToken(); const url = 'https://smartdevicemanagement.googleapis.com/v1'; // 若脚本已关联正确项目,可动态获取项目ID const endpoint = '/enterprises/' + smartService.getProjectId() + '/devices'; const headers = { 'Authorization': 'Bearer ' + access_token, 'Content-Type': 'application/json' } const params = { 'headers': headers, 'method': 'get', 'muteHttpExceptions': true } try { const response = UrlFetchApp.fetch(url + endpoint, params); const responseCode = response.getResponseCode(); const responseBody = JSON.parse(response.getContentText()); console.log("响应状态码: " + responseCode); console.log(responseBody); const devices = responseBody['devices']; if (!devices) { console.log("未找到任何设备"); return; } // 列出所有可用设备 console.log("可用设备列表:"); devices.forEach(d => { const deviceId = d.name.split('/').pop(); console.log(`名称:${d.displayName},ID:${deviceId}`); }); // 匹配目标设备 const device = devices.find(d => d.name.endsWith('/' + THERMOSTAT)); if (!device) { console.log(`未找到ID为${THERMOSTAT}的设备,请检查设备ID是否正确`); return; } // 后续温度控制逻辑 console.log(`找到目标设备:${device.displayName}`); } catch(e) { console.log("请求出错:" + e); } }
内容的提问来源于stack exchange,提问作者Permafrost
相关产品推荐
相关产品推荐

