1. 程式人生 > >煙感器裝置接入AWS IOT的一種方法

煙感器裝置接入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