在学习MQTT的代码之前,先使用ubuntu实际测试一遍,加深其使用场景和过程。
mosquitto是一个开源的轻量级的C实现,完全兼容了MQTT 3.1和MQTT 3.1.1,在嵌入式系统上比较常用,这边介绍ubuntu上的安装使用,后面openwrt上也是使用mosquitto。
mosquitto安装完之后,有两个命令行工具,发布mosquitto_pub和订阅mosquitto_sub
mosquitto_pub 命令参数说明
1. -d 打印debug信息 2. -f 将指定文件的内容作为发送消息的内容 3. -h 指定要连接的域名 默认为localhost 4. -i 指定要给哪个clientId的用户发送消息 5. -I 指定给哪个clientId前缀的用户发送消息 6. -m 消息内容 7. -n 发送一个空(null)消息 8. -p 连接端口号 9. -q 指定QoS的值(0,1,2) 10. -t 指定topic 11. -u 指定broker访问用户 12. -P 指定broker访问密码 13. -V 指定MQTT协议版本 14. --will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用 15. --will-qos Will的QoS值。该参数需要与--will-topic一起使用 16. --will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用 17. --will-topic 用户发送Will消息的topicmosquitto_sub 命令参数说明
1. -c 设定‘clean session’为无效状态,这样一直保持订阅状态,即便是已经失去连接,如果再次连接仍旧能够接收的断开期间发送的消息。 2. -d 打印debug信息 3. -h 指定要连接的域名 默认为localhost 4. -i 指定clientId 5. -I 指定clientId前缀 6. -k keepalive 每隔一段时间,发PING消息通知broker,仍处于连接状态。 默认为60秒。 7. -q 指定希望接收到QoS为什么的消息 默认QoS为0 8. -R 不显示陈旧的消息 9. -t 订阅topic 10. -v 打印消息 11. --will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用 12. --will-qos Will的QoS值。该参数需要与--will-topic一起使用 13. --will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用 14. --will-topic 用户发送Will消息的topic先打开一个终端,ubuntu订阅local/test
ubuntu:~$ mosquitto_sub -t "local/test" -h 127.0.0.1 -p 1883 -d -i ubuntu_client1 Client ubuntu_client1 sending CONNECT Client ubuntu_client1 received CONNACK (0) Client ubuntu_client1 sending SUBSCRIBE (Mid: 1, Topic: local/test, QoS: 0, Options: 0x00) Client ubuntu_client1 received SUBACK Subscribed (mid: 1): 0ubuntu发送
ubuntu:~$ mosquitto_pub -t "local/test" -m "{test:111}" -h 127.0.0.1 -p 1883 -d -i ubuntu_client2 Client ubuntu_client2 sending CONNECT Client ubuntu_client2 received CONNACK (0) Client ubuntu_client2 sending PUBLISH (d0, q0, r0, m1, 'local/test', ... (10 bytes)) Client ubuntu_client2 sending DISCONNECT linye@linye-ubuntu:~$mosquitto_pub的终端发送后,mosquitto_sub终端就会收到如下信息
Client ubuntu_client1 sending PINGREQ Client ubuntu_client1 received PINGRESP Client ubuntu_client1 received PUBLISH (d0, q0, r0, m0, 'local/test', ... (10 bytes)) {test:111}ubuntu的和window下的python进行互相测试。ubuntu订阅local/test1,发布local/test2,python订阅local/test2,发布local/test1。
ubuntu下面有mqtt服务器
linye@ubuntu:~$ ps -aux | grep mos mosquit+ 815 0.0 0.0 37352 2644 ? Ss 08:51 0:02 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf先打开一个终端,ubuntu订阅local/test1
ubuntu:~$ mosquitto_sub -t "local/test2" -h 127.0.0.1 -p 1883 -d -i ubuntu_client1 Client ubuntu_client1 sending CONNECT Client ubuntu_client1 received CONNACK (0) Client ubuntu_client1 sending SUBSCRIBE (Mid: 1, Topic: local/test, QoS: 0, Options: 0x00) Client ubuntu_client1 received SUBACK Subscribed (mid: 1): 0python订阅local/test2,发布local/test1
#!/usr/bin/python3 # -*- coding:utf-8 -*- # Author: ye.lin # Time: 2019/10/21 # Describe: import logging import json import paho.mqtt.client as mqtt from paho.mqtt.client import Client MQTTHOST = "192.168.62.128" MQTTPORT = 1883 mqttClient: Client = mqtt.Client() def logging_init(): logging.basicConfig( # filename="log/test.log", # 指定输出的文件 level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') return True # 连接MQTT服务器 def on_mqtt_connect(): conn_result = mqttClient.connect(MQTTHOST, MQTTPORT, 15) logging.info(conn_result) mqttClient.loop_start() # mqttClient.loop_forever() # publish 消息 def on_publish(topic, payload, qos): mqttClient.publish(topic, payload, qos) # 消息处理函数 def on_message_come(lient, userdata, msg): print(msg.topic + " " + ":" + str(msg.payload)) # subscribe 消息 def on_subscribe(): mqttClient.subscribe("local/test2", 1) mqttClient.on_message = on_message_come # 消息到来处理函数 if __name__ == '__main__': logging_init() on_mqtt_connect() publish_data = { "test": "1111", "clientId": "XXXXX" } publist_result = on_publish("local/test1", json.dumps(publish_data), 0) logging.info(publist_result) on_subscribe() while True: pass再打开一个终端,ubuntu发送local/test2
ubuntu:~$ mosquitto_pub -t "local/test2" -m "{test:111}" -h 127.0.0.1 -p 1883 -d -i ubuntu_client2 Client ubuntu_client2 sending CONNECT Client ubuntu_client2 received CONNACK (0) Client ubuntu_client2 sending PUBLISH (d0, q0, r0, m1, 'local/test', ... (10 bytes)) Client ubuntu_client2 sending DISCONNECT linye@linye-ubuntu:~$window下可以使用eclipse paho软件测试mqtt通讯
官网可以下载:https://www.eclipse.org/paho/
具体使用就不介绍了,看页面就大概知道了。