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