煙感器裝置接入AWS IOT的一種方法
最近和同事一起做了一個煙感器接入 AWS IOT 的Demo ,遇到一些問題,想記錄下來,以備日後查閱。
需求:
1. 煙感器(WIFI方案)接入AWS IOT core 平臺,APP端也接入AWS IOT 端。
2. 煙感器收發訊息資料(jason格式)通過AWS IOT 與APP互動。
3.APP端可以控制煙感器端狀態,並獲取煙感器端的history Data.
環境:
1.device 端是使用的Free RTOS,下載AWS IOT 嵌入式C sdk
2.APP端 是IOS ,用的objective-C 開發。
3.註冊AWS 賬號(注意是Global Account),選擇地域。
架構示意圖:
一些要點:
1. 基於MQTT 3.1.1協議 通過Subscribe/Publish 進行訊息訂閱和釋出。
2.以 $aws/* 開頭的是AWS 預留主題$aws/things/SmokeSensor_Demo/shadow/update
3. 建立Things +Policy +Crt 注意policy 的許可權設定。
一些實驗:
1. https://aws.amazon.com/cn/iot-core/getting-started/#kits 模擬Device接入AWS IOT
步驟:
1. 在AWS IOT 端建立Things +Policy +Crt ,並將root-CA, Things.pem.crt ,Things.private.pem 下方給Device 端。
2. Device 端配置接入。可以在此驗證接入狀態:
3. APP 端 通過AWS Cognito 的Identity pool 進行身份認證,然後呼叫AWS 的Device shadow RestfulAPI 進行subscribed/Publish .
4. 在Rule Engine 中進行操作,資料流:Device-->AWS IOT--->Rule --->Lambda---->SNS(Topic)--->APP(SMS/SES/APNS)
5. Lambda 配置示例:
console.log('Loading function');
// Load the AWS SDK
var AWS = require("aws-sdk");
// Set up the code to call when the Lambda function is invoked
exports.handler = (event, context, callback) => {
// Load the message passed into the Lambda function into a JSON object
var eventText = JSON.stringify(event, null, 4);
// Log a message to the console, you can view this text in the Monitoring tab in the Lambda console or in the CloudWatch Logs console
console.log("Received event:", eventText);
// Create a string extracting the click type and serial number from the message sent by the AWS IoT button
var messageText = " CODensity is: " + event.state.desired.CODensity + " BatteryCapacity is: " + event.state.desired.BatteryCapacity ;
//CODensity is: undefined BatteryCapacity is: undefined
// Write the string to the console
console.log("Message to send: " + messageText);
// Create an SNS object
var sns = new AWS.SNS();
// Populate the parameters for the publish operation
// - Message : the text of the message to send
// - TopicArn : the ARN of the Amazon SNS topic to which you want to publish
var params = {
Message: messageText,
TopicArn: "arn:aws:sns:us-west-2:71******1465:lambda-x-account"
};
sns.publish(params, context.done);
};
6. Topic 示例:
7. device 端update 到"Reported": 欄位 ,APP端從Reported 欄位獲取資訊,並通過修改Desired 欄位的引數值 來控制device 端的狀態 。 device 端通過Subscribed $aws/***/update/delta 來獲取app端修改的值,然後在update 新的值 給Reported 欄位。並重置Desired:null