在学习MQTT的代码之前,先使用ubuntu实际测试一遍,加深其使用场景和过程。
mosquitto是一个开源的轻量级的C实现,完全兼容了MQTT 3.1和MQTT 3.1.1,在嵌入式系统上比较常用,这边介绍ubuntu上的安装使用,后面openwrt上也是使用mosquitto。
$sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
$sudo apt-get update
$sudo apt-get install mosquitto
$sudo apt-get install libmosquitto-dev
$sudo apt-get install mosquitto-clients
$sudo service mosquitto status
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消息的topic
mosquitto_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): 0
ubuntu发送
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): 0
python订阅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/
具体使用就不介绍了,看页面就大概知道了。