一、MQTT简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输IBM开发的即时通信协议可能成为物联网的重要组成部分。该协议支持几乎所有的网络项目都与外部连接,用作传感器和制动器(例如通过Twitter让房屋联网)通信协议。
二、MQTT特点
MQTT该协议是为大量计算能力有限、工作在低带宽、不可靠网络上的远程传感器和控制设备通信而设计的,具有以下主要特点:
1.利用发布/订阅消息模式提供一对多的消息发布,消除应用程序耦合;
2.屏蔽负载内容的消息传输;
3、使用 TCP/IP 提供网络连接;
4.发布服务质量有三种新闻:
最多一次的消息发布完全依赖于底层 TCP/IP 互联网。消息会丢失或重复。这个级别可以用于以下情况环境传感器数据丢失一次读取记录并不重要,因为很快就会有第二次发送。
至少一次确保信息到达,但可能会重复。
只有一次,以确保信息达到一次。此级别可用于以下情况。在计费系统中,重复或丢失消息会导致错误的结果。
5、小型传输,开销很小(固定长度的头部是 2 协议交换最小化字节,减少网络流量;
6、使用 Last Will 和 Testament 特征通知各方客户端异常中断机制;
三、OneNet平台MQTT接入说明
四、python(上传初始化值,实时接收服务端数值变化)
```python
#前期准备,注册OneNet物联网平台,创建项目,创建数据流
"""
-------------------------------------------------
File Name: Data From OneNet_Get
Description : MQTT协议提交中移物联网平台
-------------------------------------------------
"""
from __future__ import print_function
#pip install paho.mqtt
import paho.mqtt.client as mqtt
import struct
import json
# CONNECT 方式:
# client_id: DEV_ID
# username: PRO_ID
# password: AUTHINFO(鉴权信息)
# 可连接设备云,CONNECT 和 CONNACK握手成功
# temperature:已创建的数据流
#更多请参考OneNet官方mqtt文档与paho-mqtt开发文档
# 2. 连接上OneNet的服务器
#
# 需要设置
#
# clientId为deviceId,即创建设备时的设备号
#
# userName为productId,即创建产品号
#
# password为authInfo(即自行设置鉴权信息字符串)
#
# 因为APIkey记忆太长,所以我选择了权利鉴定
#修改成自己的
DEV_ID = "56902xxx" #设备ID
AUTH_INFO = "Temperature1" # 全鉴信息
API_KEY = 'Oy13Yi83ay1NZzA0xxxxxxxx=' #设备APIKEY
PRO_ID = "2945xx" #产品ID
TYPE_JSON = 0x01
TYPE_FLOAT = 0x17
#定义上传数据json格式 该格式是oneNET规定好的 根据格式修改变量
body = {
"datastreams":[
{
"id":"wendu", #对应OneNet数据流名称
"datapoints":[
{
"at":"2016-08-15T14:47:00", #数据提交时间可以通过函数获得实时间
"value":33 #数据值
}
]
}
]
}
def build_payload(type, payload):
datatype = type
packet = bytearray()
packet.extend(struct.pack("!B", datatype))
if isinstance(payload, str):
udata = payload.encode('utf-8')
length = len(udata)
packet.extend(struct.pack("!H" str(length) "s", length, udata))
return packet
# 当客户端收到来自服务器的CONNACK响应时的回调。即申请连接、服务器返回结果是否成功等
def on_connect(client, userdata, flags, rc):
print("连接结果:" mqtt.connack_string(rc))
#上传数据
json_body = json.dumps(body)
packet = build_payload(TYPE_JSON, json_body)
client.publish("$dp", packet, qos=1) #qos代表服务质量
# 从服务器收到发布消息时的回调。
def on_message(client, userdata, msg):
print("温度:" str(msg.payload,'utf-8') "°C")
#当消息发送给中间人时,on_publish()回调将会被触发
def on_publish(client, userdata, mid):
print("mid:" str(mid))
def main():
print(mqtt.MQTTv311)
client = mqtt.Client(client_id=DEV_ID, protocol=mqtt.MQTTv311)
client.on_connect = on_connect
client.on_publish = on_publish
client.on_message = on_message
client.username_pw_set(username=PRO_ID, password=AUTH_INFO)
# client.username_pw_set(username=PRO_ID, password=API_KEY)
client.connect('183.230.40.39', port=6002, keepalive=120)
client.loop_forever()
if __name__ == '__main__':
main()
```