用于操作Arduino IoT Cloud的Node.js的备忘录
首先
鉴于已经确认可以将Arduino IoT Cloud设置为付费计划并通过Node-RED进行操作,所以这次想要验证是否可以直接通过Node.js进行操作。
得出结论
使用包装器代码仍然可以进行L闪烁进行操作验证。
准备就绪
重要提示:由于需要获取API密钥,在这次使用Arduino IoT Cloud的过程中,需要选择付费计划。最低需要每月400日元左右的费用。
根据2021年12月11日的确认,Entry计划已经无法进行月付了。如果选择Entry计划,则需要年付大约24美元。
但是可以暂时将付费计划切换回免费计划。
-
- Arduino IoT Cloudアカウント(Entryプラン以上)
-
- Arduino MKR Wifi 1010
-
- ブレッドボード
-
- 抵抗付きLED(秋月電子通商)
- node.jsが使える環境(今回はv14.17.3を使用した。nodebrew/nodist等で切り替えて使用してもOK)
知識的基础
-
- Freeプランでも一度Arduino IoT Cloudを使ったことがある。
- npm initして自分でnode環境を構築することができる。
在您继续以下步骤之前,请预先将Arduino MKR Wifi 1010注册为Arduino IoT Cloud的设备。如果您使用的是Entry计划或更高级别,则可以注册10个以上的设备(截至2021年11月11日,星期四)。
关于Arduino IoT云API
选择“Integrations”菜单后,将显示生成API密钥的选项。另外,选择付费计划后,CREATE API KEY功能将激活。
必须记住已创建的API的Client ID和Secret Key。
另外,点击”下载PDF”按钮,会将以下的密钥保存下来。
(照片是在验证与Node-RED的连接时生成的密钥。我们会在不久的将来的另一篇文章中讨论连接的问题。!)
本次使用arduino/node-red-contrib-arduino-iot-cloud的一部分代码arduino-iot-cloud-api-wrapper.js来书写代码。
顺便提一下,作为wrapper基础的API参考文档在这里。
https://www.arduino.cc/reference/en/iot/api/?_gl=1*1267s7v*_ga*MjEyNDk3MDE1Ni4xNjE0MTY5MDA0*_ga_NEXN8H46L5*MTYzNTY1NzY3NC4zNy4xLjE2MzU2NTg4OTMuMA
Arduino IoT云平台的设置
使用注册的设备创建Things。
只准备一个变量,用于LED闪烁。
這次的設定如下。
设定变量
我准备了一个名为Button的变量。为什么选择Button呢?因为我直接使用了在仪表板上确认的内容。
我会保留这里写的ID,以备后续步骤使用。
准备Arduino板
以下是配线图。LED的阳极(长针)连接到13号引脚,阴极(短针)连接到GND。
另外,考虑到使用了带有电阻的LED,使用常规LED时请准备电阻。
以下是可用于Arduino MKR Wifi 1010的编程代码。
其中一部分应该是自动生成的,需要添加补充。
#include "thingProperties.h"
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
pinMode(13,OUTPUT);
}
void loop() {
ArduinoCloud.update();
}
void onButtonChange() {
// Add your code here to act upon Button change
if(button)
digitalWrite(13,HIGH);
else
digitalWrite(13,LOW);
}
在Things菜单中的Sketch功能里进行书写。
关于node.js的准备
在运行npm init之后,根据以下源代码参考修正packages.json的依赖项。修正完成后运行npm install。
{
"name": "任意のプロジェクト名",
"version": "1.0.0",
"description": "",
"main": "test.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@arduino/arduino-iot-client": "^1.3.8",
"request": "^2.88.2",
"request-promise": "^4.2.6"
}
}
实际执行的代码(test.js)在这里
const ArduinoClientHttp = require("./arduino-iot-cloud-api-wrapper");
var rp = require("request-promise");
async function getToken() {
var options = {
method: "POST",
url: "https://api2.arduino.cc/iot/v1/clients/token",
headers: { "content-type": "application/x-www-form-urlencoded" },
json: true,
form: {
grant_type: "client_credentials",
client_id: "キー取得時のクライアントIDを入れる",
client_secret:
"キー取得時のシークレットキーを入れる",
audience: "https://api2.arduino.cc/iot",
},
};
try {
const response = await rp(options);
return response["access_token"];
} catch (error) {
console.error("Failed getting an access token: " + error);
}
}
async function run() {
let token = await getToken();
clientHttp = new ArduinoClientHttp.ArduinoClientHttp(token);
let thing_id = "控えたThingのIDを入れる";
let property_id = "控えたpropertyのIDを入れる";
const _sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
let retStr = "";
for (let i = 0; i < 10; i++) {
retStr = clientHttp.setProperty(thing_id, property_id, true);
console.log("retStr:", JSON.stringify(retStr));
await _sleep(1000);
retStr = clientHttp.setProperty(thing_id, property_id, false);
console.log("retStr:", JSON.stringify(retStr));
await _sleep(1000);
}
}
run();
此外,将此代码下载到与test.js相同的层次结构中。
arduino-iot-cloud-api-wrapper.js
确认动作
当运行test.js时,LED会每隔1秒点亮/熄灭一次。
就是这样了。