中国企业国际化发展 粤港澳大湾区 上市公司内部控制 企业内部控制 董事之家 专精特新企业 企业内控与风险管理 集团管控 民营企业与经济 通商董事会馆 雏鹰企业 高新技术企业 瞪羚企业 企业治理
信息与软件 系统集成 创新创业创投创意 BIM工程 人工智能 互联网+ 网络工程 电子商务师 制造业创新 乡村振兴工委会 数字经济 价值共创 企业科创管理 视觉传达设计 《类似商品和服务区别分表》 创新创业与可持续 电子商务 数字媒体艺术 数字创新中心 全面质量管理 移动支付 私营经济 企业经营 商业模式创新 数字转型 灯塔工厂 企业产品创新 客户与营销 专利 商标 著作权 视觉传播设计与制作 商业规划 产品检测 金融科技 企业创新绩效 价值网络 企业创新管理 科技管理创新 集成电路布图设计 企业知识产权管理 发明专利 技术投资与并购 版权 新一代信息技术产业 精益创新 绿创中心
十四五规划专题 科技创新 全过程工程 转型升级 绿色建筑 环保技术 装配式建筑 并购重组动态 节能减排咨询 数字化转型 制造业转型升级 碳排放管理 工业转型升级 教育转型升级 外贸转型升级 能源转型升级 供给侧改革 企业转型升级 地产转型升级 制造业转型与高质量发展 产业转型升级 转创国际技术转移 数控工厂 工业互联网 绿色转型升级 碳排放管理会计 服务业转型升级 智能制造 全面绩效管理 工业物联网 组织变革与管理转型 产业科技管理 国有资产管理 绿色转型与可持续发展 低碳转型 盈利模式转型 绿色能源与碳核算
广东股权交易中心 私募热点 私募投资 投融资简报 案例研究 内保外贷 融资策划 气候投融资 供应链金融 银行境外贷款 前海港企贷 知识产权金融 股权投资 风险投资 股权质押 企业投资 股权激励 内部控制准则
工程造价 管理会计 企业内控管理 医院管理 物流与供应链 预算管理与会计 中小企业内部控制 财务经理人 转创产研 家族企业管理 企业价值 企业发展管理咨询 企业能源效率 管理培训 质量管理 流程管理 精益生产 商业策略 企业技术与绩效 中国卓越管理公司 数据分析 核心业务运营 制度智库 投资管理 管理信息系统 许可证 管理咨询 可行性研究 商业计划书 绩效评价 预算评审 绩效考核 企业运营 价值创造 商业模式评估 内部控制政策
建筑工程管理 消防企业管理 安全企业管理 乡村振兴 制造企业管理 卫生企业管理 工程管理中心 企业质量管理 科技企业管理 医药企业管理 产品质量管理 电力企业管理 企业经济管理 食品企业管理 工业企业管理 软件企业管理 能源企业管理 智能企业管理 汽车企业管理 环保企业管理 进出口企业管理
MQTT(消息队列遥测传输) 是基于 TCP/IP 协议栈而构建的支持在各方之间异步通信的消息协议。MQTT在空间和时间上将消息发送者与接收者分离,因此可以在不可靠的网络环境中进行扩展。虽然叫做消息队列遥测传输,但它与消息队列毫无关系,而是使用了发布和订阅(Pub/Sub)的模型。
MQTT 是一种轻量级的、灵活的网络协议,致力于为 IoT 开发人员实现适当的平衡:
这个轻量级协议可在严重受限的设备硬件和高延迟/带宽有限的网络上实现。
它的灵活性使得为 IoT 设备和服务的多样化应用场景提供支持成为可能。
MQTT Client 库在很多语言中都有实现,包括 Embedded C、C、Java、JavaScript、Python、C++、C#、Go、iOS、Android等。
Eclipse Paho的MQTT库下载地址: https://www.eclipse.org/paho/downloads.php
控制报文类型
控制报文类型标志位
剩余长度
某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。
以下MQTT控制报文在报文的最后部分包含一个有效载荷。对于PUBLISH来说有效载荷就是业务消息。
阿里云IoT物联网平台的MQTT协议不支持will消息,CONNECT 消息内容参数如下:
其中clientId,username,password由设备三元组(productKey,deviceName,deviceSecret)按照规则生成,具体规则如下:
官方文档:https://help.aliyun.com/document_detail/73742.html
设备端代码示例(Nodejs版) client.js
/**
"dependencies": { "mqtt": "2.18.8" }
*/
const crypto = require('crypto');
const mqtt = require('mqtt');
//设备身份三元组+区域const deviceConfig = {
productKey: "替换",
deviceName: "替换",
deviceSecret: "替换",
regionId: "cn-shanghai"
};
//根据三元组生成mqtt连接参数
const options = initMqttOptions(deviceConfig);
const url = `tcp://${deviceConfig.productKey}.iot-as-mqtt.${deviceConfig.regionId}.aliyuncs.com:1883`;
//2.建立连接
const client = mqtt.connect(url, options);
client.on('packetsend', function (packet){
console.log('send '+packet.cmd+' packet =>',packet)
})
client.on('packetreceive', function (packet){
console.log('receive '+packet.cmd+' packet =>',packet)
})
//IoT平台mqtt连接参数初始化
function initMqttOptions(deviceConfig) {
const params = {
productKey: deviceConfig.productKey,
deviceName: deviceConfig.deviceName,
timestamp: Date.now(),
clientId: Math.random().toString(36).substr(2),
}
//CONNECT参数
const options = {
keepalive: 60, //60s
clean: false, //cleanSession保持持久会话
protocolVersion: 4 //MQTT v3.1.1
}
//1.生成clientId,username,password
options.password = signHmacSha1(params, deviceConfig.deviceSecret);
options.clientId = `${params.clientId}|securemode=3,signmethod=hmacsha1,timestamp=${params.timestamp}|`;
options.username = `${params.deviceName}&${params.productKey}`;
return options;
}
/*
生成基于HmacSha1的password
参考文档:https://help.aliyun.com/document_detail/73742.html?#h2-url-1
*/
function signHmacSha1(params, deviceSecret) {
let keys = Object.keys(params).sort();
// 按字典序排序
keys = keys.sort();
const list = [];
keys.map((key) => {
list.push(`${key}${params[key]}`);
});
const contentStr = list.join('');
return crypto.createHmac('sha1', deviceSecret)
.update(contentStr)
.digest('hex');
}
receive connack packet => Packet { cmd: 'connack', retain: false, qos: 0, dup: false, length: 2, topic: null, payload: null, sessionPresent: false, returnCode: 0 }
send pingreq packet => { cmd: 'pingreq' }
receive pingresp packet => Packet { cmd: 'pingresp', retain: false, qos: 0, dup: false, length: 0, topic: null, payload: null }
//3.属性数据上报const topic = `/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/property/post`;
setInterval(function() {
//发布数据到topic
client.publish(topic, getPostData(),{qos:1});
}, 5 * 1000);
function getPostData() {
const payloadJson = {
id: Date.now(),
params: {
temperature: Math.floor((Math.random() * 20) + 10),
humidity: Math.floor((Math.random() * 20) + 60)
},
method: "thing.event.property.post"
}
console.log("===postData\n topic=" + topic)
console.log(payloadJson)
return JSON.stringify(payloadJson)
}
send publish packet => { cmd: 'publish', topic: '/sys/a1hQSwFledE/eud1jXfEgCsAiP2eId9Q/thing/event/property/post', payload: '{"id":1543896481106,"params":{"temperature":23,"humidity":73},"method":"thing.event.property.post"}', qos: 1, retain: false, messageId: 38850, dup: false }
receive puback packet => Packet { cmd: 'puback', retain: false, qos: 0, dup: false, length: 2, topic: null, payload: null, messageId: 38850 }
//4.订阅主题,接收指令const subTopic = `/${deviceConfig.productKey}/${deviceConfig.deviceName}/control`;
client.subscribe(subTopic)
client.on('message', function(topic, message) {
console.log("topic " + topic)
console.log("message " + message)
})
SUBSCRIBE消息体
send subscribe packet => { cmd: 'subscribe', subscriptions: [ { topic: '/a1hQSwFledE/eud1jXfEgCsAiP2eId9Q/control', qos: 0 } ], qos: 1, retain: false, dup: false, messageId: 38851 }
SUBACK消息体
receive suback packet => Packet { cmd: 'suback', retain: false, qos: 0, dup: false, length: 3, topic: null, payload: null, granted: [ 128 ], messageId: 38851 }
send unsubscribe packet => { cmd: 'unsubscribe', qos: 1, messageId: 34323, unsubscriptions: [ '/a1hQSwFledE/eud1jXfEgCsAiP2eId9Q/control' ] }
receive unsuback packet => Packet { cmd: 'unsuback', retain: false, qos: 0, dup: false, length: 2, topic: null, payload: null, messageId: 34323 }
设备与阿里云IoT的订阅关系在云端保持,除非设备主动unsubscribe,否则订阅关系不清理。设备重连后,依然保持之前的订阅关系,不需要重复订阅。
设备和IoT平台之间的链路可以通过TLS v1.2加密。
如果使用TLS加密,需要下载根证书。
© 2024 All rights reserved. 北京转创国际管理咨询有限公司 备案号: 京ICP备19055770号-4
Transverture International Group Co Ltd, Guangdong Branch
地址:广州市天河区天河北路179号尚层国际1601
深圳市福田区深南中路2066号华能大厦
汕头市金平区华坞路华坞村七巷三楼
梅州市丰顺县留隍镇新兴路881号
欢迎来到本网站,请问有什么可以帮您?
稍后再说 现在咨询