MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议是即时通信协议,是物联网的重要组成部分。
MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2. 对负载内容屏蔽的消息传输;
3. 使用 TCP/IP 提供网络连接;
4. 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
5. 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;
6. 有三种消息发布服务质量:a.“至多一次”,消息至多发送一次。
b.“至少一次”,确保消息到达,但消息重复可能会发生。
c.“只有一次”,确保消息到达一次。
OneNET物联网MQTT协议接入
我们首先登录进入OneNET开发者中心

“多协议接入” ==》 “MQTT(旧版)”

点击“添加产品”按钮


填写相关的信息,点击“确定按钮”

点击“立即添加设备”来添加一个新的测试设备

点击“添加设备”

填写相关的信息(其中鉴权信息可以随便填写,但是要注意产品内唯一),然后点击“添加”按钮。

可以看到,我们已经成功添加了一个设备。

我们点击“详情”,去查看一些开发需要的参数。


我们点击“添加APIKey”来添加设备自己的Key,

输入Key的内容(内容可以随便填写),然后点击“提交”。

可以看到已经生成了加密后的Key,我们把``设备ID和APIKey`复制一下,后面会需要。
设备ID:610170361

点击左侧的产品概况,进入产品概况。

将产品ID复制,后面也会用到。
产品ID:360633
接下来,我们使用工具和编写Python代码使用TCP方式连接进行MQTT通信。
从官方文档中,可以获取到使用TCP方式连接时的服务器地址和端口号分别是:
服务器地址:183.230.40.39
服务器端口号:6002
用Python3进行测试
用Python3进行测试,MQTT框架用的是赫赫有名的
paho.mqtt.python
创建一个新的文件夹OneNET,并编写mqtt_connect_tcp.py,内容如下:
import paho.mqtt.client as mqtt
BrokerHost = '183.230.40.39' # OneNET使用TCP方式连接时的主机地址
BrokerPort = 6002 # OneNET使用TCP方式连接时的主机端口号
DeviceId = '610170361' # 设备ID
ProductId = '360633' # 产品ID
APIKey = "J0UL5YvdDB3=20qE9ByeLGYctcI=" # 可以是设备单独的APIKey,也可以是产品的MasterAPIKey
# 连接结果
def on_connect(client, userdata, flags, rc):
if rc != 0:
print("连接失败:" + mqtt.connack_string(rc))
return
print("连接成功")
# 从服务器接收发布消息时的回调
def on_message(client, userdata, msg):
print("***** 接收到消息 *****")
print(msg.topic + ":" + msg.payload.decode("utf-8"))
# 当broker响应订阅请求时被调用
def on_subscribe(client, userdata, mid, granted_qos):
print("***** Broker响应订阅请求*****")
print(granted_qos)
# 消息发送回调
def on_publish(client, userdata, mid):
print("[on_publish] mid:" + str(mid))
def main():
mqtt_broker_host = BrokerHost
mqtt_broker_port = BrokerPort
mqtt_user_name = ProductId
mqtt_password = APIKey
mqtt_client_id = DeviceId
client = mqtt.Client(client_id=mqtt_client_id, protocol=mqtt.MQTTv311)
client.on_connect = on_connect
client.on_publish = on_publish
client.on_message = on_message
client.on_subscribe = on_subscribe
client.username_pw_set(username=mqtt_user_name, password=mqtt_password)
client.connect(host=mqtt_broker_host, port=mqtt_broker_port, keepalive=60)
client.loop_forever()
if __name__ == "__main__":
main()
运行程序

可以看到已经成功连接至服务器。

我们再试试在控制台下发命令:



可以看到python收到了指令。

当然你可以再多添加几个设备测试订阅、发布等更多的功能。