什么是MQTT
MQTT 是用于物联网 (IoT) 的 OASIS 标准消息传递协议。它被设计为一种极其轻量级的发布/订阅消息传输,非常适合连接具有小代码足迹和最小网络带宽的远程设备。如今,MQTT 被广泛用于各种行业,例如汽车、制造、电信、石油和天然气等。
MQTT特点
-
轻巧高效
MQTT 客户端非常小,需要最少的资源,因此可以在小型微控制器上使用。MQTT 消息头很小,以优化网络带宽。
-
双向通信
MQTT 允许在设备到云和云到设备之间进行消息传递。这使得向事物组轻松广播消息变得容易。
-
拓展数以百万计的事物
MQTT 可以扩展以连接数百万个物联网设备。
-
可靠的消息传递
消息传递的可靠性对于许多物联网用例来说都很重要。这就是为什么 MQTT 有 3 个定义的服务质量级别:0 - 最多一次,1- 至少一次,2 - 恰好一次
-
支持不可靠的网络
许多物联网设备通过不可靠的蜂窝网络连接。MQTT 对持久会话的支持减少了客户端与代理重新连接的时间。
-
启用安全性
MQTT 使使用 TLS 加密消息和使用现代身份验证协议(例如 OAuth)对客户端进行身份验证变得容易。
MQTT订阅发布架构
MQTT服务器搭建
这里为了快速演示咱们直接使用docker搭建
- 拉取镜像
docker pull eclipse-mosquitto
2.创建文件
/mosquitto/config
/mosquitto/data
/mosquitto/log
- 编写配置文件
#注意文件位置 /mosquitto/config/mosquitto.conf
persistence false
allow_anonymous true
connection_messages true
log_type all
listener 1883
# persistence_location /Users/admin/mine/python/mqtt/mosquitto/data/
log_dest file /Users/admin/mine/python/mqtt/mosquitto/log/mosquitto.log
- 启动容器
docker run -it --name=mqtt-server -d -p 1883:1883 -p 9001:9001 -v /Users/admin/mine/python/mqtt/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
!!注意docker volume挂载顺序,别问我怎么知道的
protobuf
- 写一个简单的proto 放着一会要用,不会的可以参照上一篇文章juejin.cn/post/700772…
// helloworld.proto
syntax = "proto3";
message HelloRequest {
string name = 1;
int32 age = 2;
}
- python 结构体转换
protoc --python_out=. helloworld.proto
Python 服务端
'''
Author: JackFly
since: 2022-02-08 15:36:54
lastTime: 2022-02-08 18:26:43
文件相对于项目的路径: /python/mqtt/server.py
LastAuthor: Do not edit
message:mqtt server
'''
import paho.mqtt.client as mqtt
import helloworld_pb2
# proto数据整理 不得不说python直接复制要比js爽太多了
hello = helloworld_pb2.HelloRequest()
hello.name = "jack"
hello.age = 18
# proto 序列化
data = hello.SerializeToString()
client = mqtt.Client()
# 参数有 Client(client_id="", clean_session=True, userdata=None, protocol=MQTTv311, transport="tcp")
client.connect("localhost", 1883, 60) # 连接服务器,端口为1883,维持心跳为60秒
#消息发布
client.publish('test', data,1)
print("send success")
Python 客户端
'''
Author: JackFly
since: 2022-02-07 14:41:23
lastTime: 2022-02-09 18:51:00
文件相对于项目的路径: /mqtt/client.py
LastAuthor: Do not edit
message:mqtt client
'''
import paho.mqtt.client as mqtt
import helloworld_pb2
def on_connect(client,userdata,flags,rc):
print("Connected with result code "+str(rc))
client.subscribe("test")
def on_message(client,userdata,msg):
data = helloworld_pb2.HelloRequest()
# proto 反序列化
data.ParseFromString(msg.payload)
print(data)
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost",1883,60)
client.loop_forever()
效果展示
- 启动MQTT服务器
- 客户端连接 python3 client.py
- 服务端发布消息 python3 server.py