用于操作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的连接时生成的密钥。我们会在不久的将来的另一篇文章中讨论连接的问题。!)

PDF

本次使用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,以备后续步骤使用。

Valiable Info
Thing

准备Arduino板

以下是配线图。LED的阳极(长针)连接到13号引脚,阴极(短针)连接到GND。
另外,考虑到使用了带有电阻的LED,使用常规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秒点亮/熄灭一次。

就是这样了。

广告
将在 10 秒后关闭
bannerAds