简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)通俗来讲是一个基于客户端-服务器的消息发布/订阅(publish/subscribe)模式的"轻量级"通讯传输协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
优势
(1)精简,不添加可有可无的功能;
(2)发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
(3)允许用户动态创建主题,零运维成本;
(4)把传输量降到最低以提高传输效率;
(5)把低带宽、高延迟、不稳定的网络等因素考虑在内;
(6)支持连续的会话控制;
(7)理解客户端计算能力可能很低;
(8)提供服务质量管理;
(9)假设数据不可知,不强求传输数据的类型与格式,保持灵活性。
应用场景
以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT协议原理
csdn:https://blog.csdn.net/jiesa/article/details/50635222 (比较详细,直白)
在web端的应用
1、mqtt下载
1、npm引入
npm install mqtt --save
2、CDN引入
https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js
https://unpkg.com/[email protected]/dist/mqtt.min.js; min版
3、本地引入下载地址
https://github.com/mqttjs/MQTT.js
4、接入阿里iot(物联网)平台的文档
https://help.aliyun.com/document_detail/63656.html?spm=a2c4g.11174283.6.651.25931668Dl46PQ
5、案例参考
https://github.com/mqttjs/MQTT.js/blob/master/examples/wss/client.js
注意事项
1、clientId随机性
症状:clientId每次连接必须不一样,否则连接超过一次后后面会出现连接异常,
原因:client id重复连接断开,broker反复踢掉client,导致系统反复重启。
2、不能再不同场景使用一个账号连接,一般出现再测试开发阶段
症状:反复重连,断开,导致消息接受遗漏
原因:client用户同时不同环境(A和B)重复连接,阿里针对client用户这一问题,采取限流方式,当client用环境A连接,这时又在环境B中连接,这时会把环境A中的mqtt强制断开,但mqtt有重连功能,所以有重连,又把环境B中的挤掉,导致环境A和B都在重复断开连接的状态
3、消息订阅/发布服务质量等级建议qos1
Qos0
发送者只发送一次消息,不进行重试,Broker不会返回确认消息。在Qos0情况下,Broker可能没有接受到消息
Qos1
发送者最少发送一次消息,确保消息到达Broker,Broker需要返回确认消息PUBACK。在Qos1情况下,Broker可能接受到重复消息
Qos2
Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下,Broker肯定会收到消息,且只收到一次
Qos1 VS Qos2
与Qos1相比,Qos2的开销会很大,因为Broker有额外的两个动作:
去重。为了保证消息不重复,Broker必须进行去重处理;
确保响应消息PUBREC到达客户端。Broker必须等待客户端对PUBREC消息的响应PUBREL,只有收到客户端的确认消息后,Broker才能对订阅者投递消息。
所以相比较建议选Qos1
4、mqttPassword密码加密 必须按字母顺序排序而且阿里文档提供的是java的HmacSHA1加密方式前端必须自己引入HmacSHA1(哈希1加密)文件在进行加密。
hmac-sha1加密下载地址:https://blog.csdn.net/disadministrator/article/details/81813738
而且加密的方法也有不同
阿里文档的java的HmacSHA1方式是sign_hmac(deviceSecret,content)。
前端文档的HmacSHA1方式是sign_hmac(content,deviceSecret)。
5、mqtt.js不仅仅可以完成阿里平台上设备信息的上报和下发,也可以代替websockt,进行其他自定义通信(服务端与前端约定好通信协议)。