AWS IoT Core v2
このライブラリは、AWS IoT Coreと通信する機能を提供する組み込みクラスです。
Library usage requirements | |
---|---|
Type | Integrations |
Name | AWS_IoT_Core_V2 |
Version | 2020-11-04 |
Code size used | 2.3KB |
Resources used | HTTPS x 1, MQTT x 1, Timers x 1 |
関連資料
このライブラリで使用しているAWS IoT APIの詳細については、ドキュメンテーションを参照してください。
Abstracts
Methods()/Properties | Summary |
---|---|
new AWS_IOT_CORE() | AWS_IOT_CORE オブジェクトを、渡された設定で初期化します。 |
{AWS_IOT_CORE} Instance
Methods()/Properties | Summary |
---|---|
.httpPost() | AWS IoT CoreエンドポイントにHTTPSでデータを送信します。 |
.abortHttpRequest() | 現在進行中のHTTPリクエストを中止します。 |
.mqttConnect() | AWS IoT CoreにMQTT接続します。 |
.errors | 無効なキー名を含む配列。 無効な構成が setConfig またはコンストラクターに渡された場合にのみ存在します。 |
Details
new AWS_IOT_CORE(config)
AWS_IOT_CORE
インスタンスを初期化します。
Configuration
AWS_IOT_CORE
インスタンスを生成する場合に、次の設定が必要です。
Name | Type | Default | Summary |
---|---|---|---|
host | string | MANDATORY | AWS IoT Coreコンソールの設定ページにあるリクエスト用のAWS IoTエンドポイント。 |
deviceCert | string | MANDATORY | このデバイスに関連付けられているX.509証明書。 |
devicePrivKey | string | MANDATORY | このデバイスに関連付けられている秘密鍵。 |
ca | string | MANDATORY | AWS IoT Coreと通信する際に使用するルートCA。 |
timeout | Number | 90000 | HTTPリクエストのタイムアウト(ms)。 |
config
は次の形式のJavaScriptオブジェクトである必要があります。
var config = {
host: "<String>",
deviceCert: "<String>",
devicePrivKey: "<String>",
ca: "<String>",
timeout: "<Number>"
};
config
オブジェクトを、AWS_IOT_CORE
に指定します。無効な値が渡された場合、setConfig
の結果はerrors
プロパティに格納されるため、適切に処理する必要があります。
var iot = new AWS_IOT_CORE(config);
if ('errors' in iot) {
// TODO: handle errors
}
Setter Methods
AWS_IOT_COREインスタンス作成後、それぞれの設定は、対応するセッターメソッドによって変更できます。無効な値がいずれかのセッターに渡されると、 false
が返されます。
Setter | Summary |
---|---|
.setHost(value: String) | AWS IoT Coreエンドポイントを設定します。 |
.setDeviceCert(deviceCert: String) | Thingの証明書を設定します。証明書は、AWS IoT CoreコンソールでThingを作成するときに生成できます。デバイス証明書の作成とアクティブ化の詳細については、AWS IoT Coreドキュメント を参照してください。この情報が必要な理由はこちらを参照して下さい。 |
.setDevicePrivKey(devicePrivKey: String) | Thingに設定した証明書の秘密鍵を設定します。秘密鍵は、AWS IoT CoreコンソールでThingを作成するときに生成できます。 秘密キーの作成の詳細については、AWS IoT Coreドキュメントを参照してください。 この情報が必要な理由はこちらを参照して下さい。 |
.setTimeout(value: Number) | HTTPリクエストのタイムアウトを設定します。 |
.setRootCA(value: String) | AWS IoT CoreのルートCAを設定します。 |
.setConfig(config)
setConfig
メソッド を用いると、複数の設定オプションを同時に設定したり変更したりすることができます。下記のようにJSONフォーマットで指定してください。無効な値が渡された場合、無効なキーの名前を含む配列を返し、その配列にerrors
プロパティを設定します。 有効な config
がsetConfig
に渡され、errors
が存在する場合、それは削除されます。
iot.setConfig({
host: "value",
deviceCert: "value",
devicePrivKey: "value",
ca: "value",
timeout: 90000
});
Instance Methods
.httpPost(topic,headers,getNextChunk,callback[,qos])
HTTPSを介して、topic
で指定されたAWS IoT Coreエンドポイントにデータを送信します。使用する前に、AWS IoT CoreのThingに適切な AWS IoT Coreポリシー が設定されている必要があります。
Name | Type | Default | Summary |
---|---|---|---|
topic | string | MANDATORY | MQTTトピック |
headers | object | MANDATORY | リクエストに使用するHTTPヘッダー。「Content-Length」を指定する必要があります。 |
getNextChunk | function | MANDATORY | 送信するデータを取得するためのコールバック。 データがなくなるまで4KB以下の[string/ArrayBuffer]チャンクでデータを返し、最後にnull を返します。 |
callback(err, resp) | function | MANDATORY | レスポンスを処理するためのコールバック関数。 エラーを err として返し、レスポンスをresp として返します。 |
qos | Number | 0 | リクエストに必要なQoS値。 QoSに関するAWSドキュメント |
return | undefined | - | - |
Responses
AWS IoT Coreのレスポンスは、次の形式で返します。
{
statusCode: <Number>,
statusMessage: <String>,
body: <String>
}
statusCode
と statusMessage
の詳細については、該当するデバイスのHTTPSドキュメントをご覧ください。(NEQTO Bridge | Spresense)
body
は、HTTPレスポンスのbodyデータが入ります。
Errors
neqto.jsのHTTPオブジェクトのエラーを返します。
{
errCode: <Number>
}
errCode
パラメータについてはneqto.jsドキュメントをご覧ください。(NEQTO Bridge | Spresense)
.abortHttpRequest()
現在進行中のHTTPリクエストを中止します。
Name | Type | Default | Summary |
---|---|---|---|
return | undefined | - | - |
.mqttConnect([options])
AWS IoT CoreにMQTT接続します。使用する前に、AWS IoT CoreのThingに適切な AWS IoT Coreポリシー が設定されている必要があります。
Name | Type | Default | Summary |
---|---|---|---|
options | object | {} | neqto.jsのmqtt.connectメソッドのoptionを指定します。 |
return | MQTT.Client | - | AWS IoT Coreに接続されたMQTTインスタンス。 - NEQTO Bridge - Spresense - QoSに関するAWSドキュメント |
Usage Examples
config
オプションで使用できる CA
の取得方法はこちら。
ルートCAがターゲットのIoT Coreエンドポイントに適切であることを確認してください。
var rootCa = '-----BEGIN CERTIFICATE-----\n...<CA>...\n-----END CERTIFICATE-----';
次のコードは、以降のサンプルコードの先頭に入ります。全ての設定を適切に置き換えて使用してください。
// IMPORTED LIBRARIES
// - AWS_IoT_Core_V2
// Logging setup
log.setLevel(0,2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE, 0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
// Device setup
var deviceCert = "[certificate]";
var deviceKey = "[key]";
var host = "host.iot.ap-northeast-170.amazon.aws.com"
var config = {
host: host,
deviceCert: deviceCert,
devicePrivKey: deviceKey,
ca: rootCa
}
var iotCore = new AWS_IOT_CORE(config);
if ('errors' in iotCore) {
// TODO: handle errors
throw 'Invalid configuration'
}
Sample 1: 自動再接続するMQTT通信
var client = iotCore.mqttConnect( {reconnectCount: 1855} );
if (!client) {
throw 'Failed to create mqtt instance';
}
client.on('error', function(err) {
print('ERROR: ' + err.code + ' ERRNO: ' + client.get('errnoConnect'));
//TODO: Error handling
});
client.on('message', function(topic, message) {
print('TOPIC: ' + topic + ' MESSAGE: ' + message);
//TODO: Message handling
});
client.on('connect', function() {
print("CONNECTED");
client.subscribe("testtopic/subtopic/#", { qos: 1 }, function(err) {
if (err.code > 0) {
print("MQTT SUBSCRIBE ERROR", err.code);
//TODO: Error handling
}
});
client.subscribe("shadowtopic/#", { qos: 1 }, function(err) {
if (err.code > 0) {
print("MQTT SUBSCRIBE ERROR", err.code);
//TODO: Error handling
}
});
});
setInterval(function() {
if (client.canPublish()) {
var body = JSON.stringify({ "message" : "dummy" })
client.publish("testtopic/subtopic/dummy", body, { qos: 1 }, function(err){
if(err.code == 0){
print('Publish OK');
} else {
print('Publish failed');
//TODO: Error handling
}
});
} else {
print('Cannot publish');
}
}, 15000);
Sample 2: 手動再接続するMQTT通信
var reconnectAttempts = 0;
var maxReconnectAttempts = 24;
var registerEventHandlers = function(mqClient) {
if (!mqClient) {
return;
}
mqClient.on('error', function(err) {
print('ERROR: ' + err.code + ' ERRNO: ' + mqClient.get('errnoConnect'));
if (err.code == 1) { //Connection failed
if (reconnectAttempts++ < maxReconnectAttempts) {
print('reconnectAttempts:', reconnectAttempts);
mqClient.reconnect();
} else {
print('ABORT');
reconnectAttempts = 0;
mqClient.end(); //Release mqtt instance
client = undefined;
}
}
});
mqClient.on('message', function(topic, message) {
print('TOPIC: ' + topic + ' MESSAGE: ' + message);
//TODO: Message handling
});
mqClient.on('close', function() {
print("DISCONNECTED");
mqClient.reconnect();
});
mqClient.on('connect', function() {
reconnectAttempts = 0;
print("CONNECTED");
mqClient.subscribe("testtopic/subtopic/#", { qos: 1 }, function(err) {
if (err.code > 0) {
print("MQTT SUBSCRIBE ERROR", err.code);
//TODO: Error handling
}
});
});
}
client = iotCore.mqttConnect();
if (!client) {
throw 'Failed to create mqtt instance';
}
registerEventHandlers(client);
setInterval(function() {
if (!client) {
print('mqtt instance recreate');
client = iotCore.mqttConnect();
registerEventHandlers(client);
}
if (client && client.canPublish()) {
var body = JSON.stringify({ "message" : "dummy" });
client.publish("testtopic/subtopic/dummy", body, { qos: 1 }, function(err){
if(err.code == 0){
print('Publish OK');
} else {
print('Publish failed');
//TODO: Error handling
}
});
}
}, 15000);
Sample 3: HTTPでデータを送信します
var body = JSON.stringify({
"message": "HTTP post"
});
var headers = {
"Content-Length": body.length.toString()
}
// A simple method that returns `body` once, then `null` all other times.
var getBody = function() {
var temp = body;
body = null;
return temp;
}
// A very simple callback to handle the HTTP response
var callback = function(err, res) {
if (err) print(JSON.stringify(err));
if (res) print(JSON.stringify(res));
}
iotCore.httpPost("testtopic/shadowtopic/dummy", headers, getBody, callback);
Sample 4: HTTPでデータを分割送信します
var body = JSON.stringify({
"message": "This is a really long string[...]"
});
var headers = {
"Content-Length": body.length.toString()
}
// This is a *dummy* example of how to chunk data for return.
// If the data is actually larger than 4KB, it is best to chunk it in the way that makes most sense.
var index = 0;
var getBody = function() {
var ival = 8;
var ret = body.substring(index, index + ival);
if (ret) {
index = index + ival;
return ret;
}
return null;
}
// A very simple callback to handle the HTTP response
var callback = function(err, res) {
if (err) print(JSON.stringify(err));
if (res) print(JSON.stringify(res));
}
iotCore.httpPost("testtopic/shadowtopic/dummy", headers, getBody, callback);