AWS IOT Device SDK使用(nodejs )

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37263637/article/details/81096476

AWS IOT 基于是的mqtt协议,关于关于mqtt协议更详细内容可参见:
https://blog.csdn.net/m0_37263637/article/details/81087831
关于设备接入及创建请参考:

本文主要介绍如何通过mqtt协议进行点对点模式进行通信,并熟悉相关概念及node SDK。
关于设备的控制,可以采用直接发布控制命令的方式。但AWS更为推荐使用shadow(阴影)进行控制,关于这部分会后面文章中介绍:

1 AWS IOT 中通信基本概念

1.1 MQTT协议简介及基本概念

MQTT是基于二进制消息的发布/订阅编程模式的消息协议。
运用MQTT协议,设备可以很方便地连接到物联网云服务,管理设备并处理数据,最后应用到各种业务场景。

这里我们重点关注MQTT中主题(topic)的概念。MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串。设备直接发布/订阅相同主题的消息即可实现通信,详见可参考1.3中图。

1.2 在AWS IOT中MQTT

AWS IOT提供了一个支持mqtt协议具有特定功能的server作为设备网关。并具有以下特性:
这里写图片描述

1.3 使用IOT通信流程

mqtt通信示意图:
这里写图片描述

(1) 通信两端均接入同一个IOT网络
(2) 订阅者订阅某主题消息
(3) 发布者发布该主题消息
(4) 订阅者收到消息

2 两个设备互相通信

下面的代码功能是,发布者和订阅者均接入同一IOT网络, 发布者发布topic的消息CMD_test_device_tokyo,并订阅topic为RES_test_device_tokyo的消息。订阅端订阅该消息,收到发布端push后。订阅端发布RES_test_device_tokyo消息将想要返回的内容发回给发布端。

aws-iot-device-sdk API 文档:https://github.com/aws/aws-iot-device-sdk-js
C SDK及C++ SDK 请参考本博客其他文章

过程图为:
这里写图片描述

2.1 订阅者(device)代码:

var awsIot = require('aws-iot-device-sdk');
var device = awsIot.device({
    keyPath: `xxxxxx-private.pem.key`,//device 私匙
    caPath: 'root-CA.crt',//CA证书
    certPath: `xxxxxx-certificate.pem.crt`,//证书
    host: `xxxxxxxxx.iot.ap-northeast-1.amazonaws.com`//IOT 终端节点
});

var thingName = 'test_device_tokyo';// aws 后台创建的事物名称
device.on('connect', function(err) {//
    // if(err) console.error(err);
    console.log('connect');
    device.subscribe(`CMD_${thingName}`);//设备接入iot网络后订阅CMD_事物名的消息
});
device.on('message', function(topic, payload) {//收到消息触发的回调
    console.log('message', topic, payload.toString());
    if(topic.substring(0, 3) === "CMD"){
      topic = topic.replace("CMD_","RES_")
      console.info(topic);
      device.publish(topic, `device say hello to server ${thingName}`);//push消息回发布者
    }
});

2.2 发布者代码

var awsIot = require('aws-iot-device-sdk');
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {};
const myEmitter = new MyEmitter();//使用node event接收到返回值后触发send函数返回,表示发送成功
var thingName = "test_device_tokyo";//我们均为test_device_tokyo 作为消息topic,仅作为消息名称,并不是真正的事物名
var device = awsIot.device({//可以通过sdk直接连入aws iot server
    protocol:'wss',
    accessKeyId:"xxxxx",
    secretKey:"xxxxxx",
    host: `xxxxxxxxxxx.iot.us-east-1.amazonaws.com`
});

device.on('connect', function() {
    console.log('Connect AWS IOT server Success');
    Send(thingName, "hello devices", function() {//连接成功我们尝试向订阅者发送消息
        console.info("test ok")
    });
});

device.on('message', function(topic, payload) {
    console.log('message', topic, payload.toString());
    if(topic.substring(0, 3) === "RES"){//当收到订阅者 返回的topic为RES_test_device_tokyo的消息时,通过event通知send函数
        myEmitter.emit(topic, payload);
    }else{
        //dealwith code 
    }
});

var Send = function(thingName, data, callback) {
    device.publish(`CMD_${thingName}`, data);//push topic为CMD_test_device_tokyo的消息
    device.subscribe(`RES_${thingName}`);  //subscribe topic为RES_test_device_tokyo的消息
    myEmitter.once(`RES_${thingName}`, (payload) => {
        console.info(payload.toString());
        return callback(null, payload.toString());
    });
};

2.3 结果

发布端打印:

Connect AWS IOT server Success
message RES_test_device_tokyo device say hello to server test_device_tokyo
device say hello to server test_device_tokyo
test ok

订阅端打印

connect
message CMD_test_device_tokyo hello devices
RES_test_device_tokyo

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭