Python mqtt + protobuf 实战

1,468 阅读3分钟

什么是MQTT

MQTT 是用于物联网 (IoT) 的 OASIS 标准消息传递协议。它被设计为一种极其轻量级的发布/订阅消息传输,非常适合连接具有小代码足迹和最小网络带宽的远程设备。如今,MQTT 被广泛用于各种行业,例如汽车、制造、电信、石油和天然气等。

MQTT特点

  • 轻巧高效

    MQTT 客户端非常小,需要最少的资源,因此可以在小型微控制器上使用。MQTT 消息头很小,以优化网络带宽。

  • 双向通信

    MQTT 允许在设备到云和云到设备之间进行消息传递。这使得向事物组轻松广播消息变得容易。

  • 拓展数以百万计的事物

    MQTT 可以扩展以连接数百万个物联网设备。

  • 可靠的消息传递

    消息传递的可靠性对于许多物联网用例来说都很重要。这就是为什么 MQTT 有 3 个定义的服务质量级别:0 - 最多一次,1- 至少一次,2 - 恰好一次

  • 支持不可靠的网络

    许多物联网设备通过不可靠的蜂窝网络连接。MQTT 对持久会话的支持减少了客户端与代理重新连接的时间。

  • 启用安全性

    MQTT 使使用 TLS 加密消息和使用现代身份验证协议(例如 OAuth)对客户端进行身份验证变得容易。

MQTT订阅发布架构

image.png

MQTT服务器搭建

这里为了快速演示咱们直接使用docker搭建

  1. 拉取镜像
docker pull eclipse-mosquitto

2.创建文件

/mosquitto/config
/mosquitto/data
/mosquitto/log
  1. 编写配置文件
#注意文件位置 /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

  1. 启动容器

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


// 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()

效果展示

  1. 启动MQTT服务器
  2. 客户端连接 python3 client.py
  3. 服务端发布消息 python3 server.py image.png