- 一个基于Mqtt的小项目,服务器采用mosquitto,客户端有Python,C,Android三种,涉及SSL加密,传输内容:文字图片。
- 时间推移,难免忘记当时学习配置的细节,已经没有再做了,有问题的请参考一下其他资料。
- 环境:Ubuntu 16.04
目录
一.Mqtt相关
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。
###1.1 延伸阅读
推荐一些背景补充:
-
协议详细内容,我肯定说得不如协议内容中文版,建议大家先扫一下,对一些名词有印象,后续再查看。
其中,比较重要的部分,也是代码里需要设置的可变头部部分, -
推荐几个比较好的学习地方:
1.2 协议特点
- Mqtt使用发布/订阅的消息模式,提供一对多消息分发.
- 对传输消息有三种服务质量(QoS):
- 最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
- 至多一次,这一级别会确保消息到达,但消息可能会重复。即:>=1
- 只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别
订阅和发布以及代理服务器的理解示意图:
工作流:
服务器先启动,然后客户端订阅相关的Topic。Client A 和C发布主题为:Question
的What's the temperature?
。Client B因为订阅了Question
这个Topic,所以可以收到信息,Client B收到信息做判断后发布答案Topic: Temperture
出去,订阅了相关Topic的Client A 和Client C能接收到37°。
- 实现MQTT协议需要:客户端和服务器端
- MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
- MQTT传输的消息分为:主题(Topic)和负载(payload)两部分
Topic,可以理解为消息的主题,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
payload,可以理解为消息的内容,是指订阅者具体要使用的内容
代理服务器,是用于服务客户端的,目前很多公司都有相关的服务: 列表
里面我只选用过Mosquitto,也就不做分析.
二.服务器
2.1 Mosquitto的安装与使用
- Mosquitto加入库并更新:
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
- 安装:
sudo apt-get install mosquitto
安装后位于:/etc/mosquitto
,里面可以看到默认配置文件mosquitto.conf
- 查看状态
sudo service mosquitto status
- 开启和停止Mosquitto服务:
sudo service mosquitto start
sudo service mosquitto stop (常用,在测试SSL的时候)
- Mosquittof服务器启动:
上面的指令是加载默认参数,大多时候喜欢自己启动,也不麻烦
mosquitto -v (加载默认配置)
mosquitto -v -c xx/xx/mosquitto.conf -p 8883 (加载指定配置)
避免麻烦,建议在使用SSL新建一个配置文件,这样不用一直改来改去。-c加载配置文件,-p端口。
TCP端口8883和1883已在IANA注册,分别用于MQTT的TLS和非TLS通信。
2.2 Mosquitto-clients
上一步只是安装了Mosquitto服务器,不包括客户端,安装这个是用于调试,可以在命令行测试证书、ip等,很方便。
- 安装
sudo apt-get install mosquitto-clients
- 订阅
mosquitto_sub -t temperature
- 发布
mosquitto_pub -t temperature -m 37°
结果:
三.Python客户端
服务器我们借助mosquitto软件来试下,那么客户端我们当然不会自己去写一个协议.显然已经有很多先驱写了,我们只需要导入就好了.这里采用比较出名的Eclipse Paho库,它包含的各种语言,或者库列表.
看图就明白了:
3.1 导入库
pip3 install paho-mqtt
3.2 Code
- 关键指令
#导入包
import paho.mqtt.client as mqtt
#创建client对象
client = mqtt.Client(id)
#连接
client.connect(host,post)
#订阅
client.subscribe(topic)
client.on_message = func #接收到信息后的处理函数
#发布
client.publish(topic, payload)
- 完整Code
import paho.mqtt.client as mqtt
import sys
#改成自己的ip,命令ifconfig可以查看
host = "xx.xxx.xxx.xxx"
topic_sub = "Question"
topic_pub = "temperature"
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
client.subscribe(topic_sub)
def on_message(client, userdata, msg):
print(msg.payload)
client.publish(topic_pub, "37°")
def ma