MQTT协议与ODOO的结合使用

二、设计规范
- (1)精简,不添加可有可无的功能;
- (2)发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
- (3)允许用户动态创建主题,零运维成本;
- (4)把传输量降到最低以提高传输效率;
- (5)把低带宽、高延迟、不稳定的网络等因素考虑在内;
- (6)支持连续的会话控制;
- (7)理解客户端计算能力可能很低;
- (8)提供服务质量管理;
- (9)假设数据不可知,不强求传输数据的类型与格式,保持灵活性。
2.1、灵活的发布订阅和主题设计
发布订阅模式是传统 Client/Server 模式的一种解耦方案。发布者通过 Broker 与消费者之间通信,
Broker 的作用是将收到的消息通过某种过滤规则
,正确地发送给消费者。发布/订阅模式 相对于 客户端/服务器模式 的好处在于:
2.1.1、发布者和消费者之间不必预先知道对方的存在,比如不需要预先沟通对方的 IP Address 和 Port
2.1.2、发布者和消费者之间不必同时运行。因为 Broker 是一直运行的。
在 MQTT 协议里,上面提到的 过滤规则
是 Topic
。比如:所有发布到 news
这个 Topic 的消息,都会被 Broker 转发给已经订阅了 news
的订阅者
2.2、MQTT 的 Topic 有层级结构,并且支持通配符 +
和 #
:
+
是匹配单层的通配符。比如 news/+
可以匹配 news/sports
,news/+/basketball
可匹配到 news/sports/basketball
。
#
是一到多层的通配符。比如 news/#
可以匹配 news
、 news/sports
、news/sports/basketball
以及 news/sports/basketball/x
等等。
MQTT 的主题是不要预先创建的,发布者发送消息到某个主题、或者订阅者订阅某个主题的时候,Broker 就会自动创建这个主题。
2.3、带宽消耗最小化
MQTT 协议将协议本身占用的额外消耗最小化,消息头部最小只需要占用 2 个字节。
2.3.1、MQTT 的消息格式分三部分:
2.3.2、MQTT 的主要消息类型有:
2.4、三个可选的 QoS 等级
2.4.1、为适应设备不同的网络环境,MQTT 设计了 3 个 QoS 等级,0, 1, 2:
At most once (0)
At least once (1)
Exactly once (2)
QoS 0 是一种 "fire and forget" 的消息发送模式:Sender (可能是 Publisher 或者 Broker) 发送一条消息之后,就不再关心它有没有发送到对方,也不设置任何重发机制。
QoS 1 包含了简单的重发机制,Sender 发送消息之后等待接收者的 ACK,如果没收到 ACK 则重新发送消息。这种模式能保证消息至少能到达一次,但无法保证消息重复。
QoS 2 设计了略微复杂的重发和重复消息发现机制,保证消息到达对方并且严格只到达一次。
2.5、会话保持
MQTT 没有假设设备或 Broker 使用了 TCP 的保活机制4,而是设计了协议层的保活机制:在 CONNECT 报文里可设置 Keepalive 字段,来设置保活心跳包 PINGREQ/PINGRESP 的发送时间间 隔。当长时间无法收到设备的 PINGREQ 的时候,Broker 就会认为设备已经下线。
总的来说,Keepalive 有两个作用:
2.5.1、发现对端死亡或者网络中断
2.5.2、在长时间无消息交互的情况下,保持连接不被网络设备断开
对于那些想要在重新上线后,重新收到离线期间错过的消息的设备,MQTT 设计了持久化连接:在 CONNECT 报文里可设置 CleanSession 字段为 False,则 Broker 会为终端存储:
设备所有的订阅
还未被设备确认的 QoS1 和 QoS 消息
设备离线时错过的消息
三、主要特性
1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
2)对负载内容屏蔽的消息传输。
3)使用TCP/IP提供网络连接。
4)有三种消息发布服务质量:
5)小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。
6)使用Last Will和Testament特性通知有关各方客户端异常中断的机制。
四、MQTT协议原理
4.1 MQTT协议实现方式
1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
4.2 网络传输与应用消息
4.3 MQTT客户端
1)发布其他客户端可能会订阅的信息;
2)订阅其它客户端发布的消息;
3)退订或删除应用程序的消息;
4)断开与服务器连接。
4.4 MQTT服务器
1)接受来自客户的网络连接;
2)接受客户发布的应用信息;
3)处理来自客户端的订阅和退订请求;
4)向订阅的客户转发应用程序消息。
4.5 MQTT协议中的订阅、主题、会话
4.6 MQTT协议中的方法
- (1)Connect。等待与服务器建立连接。
- (2)Disconnect。等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。
- (3)Subscribe。等待完成订阅。
- (4)UnSubscribe。等待服务器取消客户端的一个或多个topics订阅。
- (5)Publish。MQTT客户端发送消息请求,发送完成后返回应用程序线程。
五、MQTT协议数据包结构
1)固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
2)可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
3)消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。
5.1、 MQTT固定头
5.1.3 剩余长度(Remaining Length)
5.2 MQTT可变头
5.3 Payload消息体
1)CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
2)SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
3)SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
4)UNSUBSCRIBE,消息体内容是要订阅的主题。
六、项目案例:
第一步:申请一个云mqtt服务【https://cloud.emqx.com/console/】
第二步:编写pub.py
# python 3.8 import random
import time from paho.mqtt import client as mqtt_client broker = '39.108.126.105'
port = 1883
topic = "python-melon/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 1000)}'
username = 'melon1'
password = 'melon' """topic
定阅与发布必须要有主题,只有当定阅了某个主题后,
才能收到相应主题的payload,才能进⾏通信""" def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client def publish(client):
msg_count = 0
while True:
time.sleep(1)
msg = f"messages: {msg_count}"
result = client.publish(topic, msg)
# result: [0, 1]
status = result[0]
if status == 0:
print(f"Send `{msg}` to topic `{topic}`")
else:
print(f"Failed to send message to topic {topic}")
msg_count += 1 def run():
client = connect_mqtt()
client.loop_start()
publish(client) if __name__ == '__main__':
run()
第三步、编写sub.py
# python3.8 import random from paho.mqtt import client as mqtt_client broker = '39.108.126.105'
port = 1883
topic = "python-melon/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = 'melon1'
password = 'melon' def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc) client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic") client.subscribe(topic)
client.on_message = on_message def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever() if __name__ == '__main__':
run()
第四步:消息发布、消息的订阅
七、MQTT服务与odoo交互
案例代码:
代码块是:
def publish(client):
msg_count = 0
while True:
time.sleep(1)
msg = f"messages: {msg_count}"
result = client.publish(topic, msg)
status = result[0]
# 调用odoo的方法1:存在问题是只能调部分的模型
# import odoo
# registry = odoo.registry('odoo150042')
# with registry.cursor() as cr:
#通过调用数据库操作的方式来实现
# cr.execute("SELECT login FROM res_users;")
# records = cr.dictfetchall()
# print ('cr-------调用数据库的方式-------',records) #通过调用虚拟环境方式,来实现
# env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
# oo = env['res.users'].search([])
# print('--------调用虚拟环境方式--------',oo) # 通过接口的方式去请求odoo的服务
# import requests
# import json
# url = "http://127.0.0.1:8080/api/test/reg"
# payload = json.dumps({
# "code": "111",
# "name": "111"
# })
# headers = {
# 'Content-Type': 'application/json',
# }
# response = requests.request("POST", url, headers=headers, data=payload)
# print('----------通过接口的方式去请求odoo的服务------------', response.content)
if status == 0:
print(f"Send `{msg}` to topic `{topic}`")
else:
print(f"Failed to send message to topic {topic}")
msg_count += 1
MQTT协议与ODOO的结合使用的更多相关文章
- 海鑫智圣:物联网漫谈之MQTT协议
什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...
- 基于MQTT协议进行应用开发
官方协议有句如下的话来形容MQTT的设计思想: "It is designed for connections with remote locations where a "sma ...
- 云巴:基于MQTT协议的实时通信编程模型
概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...
- MQTT协议(一)
MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...
- MQTT协议的简单介绍和服务器的安装
最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...
- MQTT协议学习笔记
1.前沿 万物联网的时代即将到来,物联网也由当初的概念开始进一步落实.随着无线网络技术飞速发展,各种设备都可以连接网络,实现远程控制.例如智能家居最近非常火爆,智能插座.智能LED灯.智能摄像头等.在 ...
- 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
http://blog.csdn.net/xukai871105/article/details/39252653 0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联 ...
- 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
一.先看下相关国外的专业数据对四大协议的比较: Protocol CoAP XMP ...
- 物联网MQTT协议分析和开源Mosquitto部署验证
在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...
- MQTT协议详解一
首先给出MQTT协议的查看地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html 当然也有PDF版的,百 ...
随机推荐
- Elasticsearch搜索引擎学习笔记(二)
可视化插件 GitHub搜索elasticsearch-head并下载,如果网络不好可以在gitee上搜索. 这是一个前端项目,需要安装nodejs. 在项目根目录执行 npm install npm ...
- 来自deepseek:php禁止跨域请求
在PHP中,禁止API被跨域调用可以通过设置HTTP响应头来实现.跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,允许浏览器从不同域名的服务器请求资源. ...
- 【Abaqus热分析】热膨胀系数设置
来源:帮助文档
- Vue2/Vue3 项目生产环境开启 vue devtools 插件线上调试 vue 组件
说到 vue 项目的调试工具,必然少不了 "vue devtools 插件",此插件就像"手术刀"一样,是开发环境下的一个利器,生产环境一般情况没办法使用. 要 ...
- 红黑树和b+树
二叉搜索树 满足以下条件: 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值. 任意节点的左.右子树也是二叉搜索树,即同样满足条件 1. 这是一个正常的,没有碰到 ...
- go declared and not used
Go语言在代码规范中定义未使用的变量会报"declared and not used"错误 package main import "fmt" func mai ...
- 关于Primavera P6版本选择上的一些看法
从开始接触P6到目前也有近6年的时间,从最开始用的V7 (除P6.2.1)到现在用的18.8.0 ,除去一些小版本,中间自己跨越了8个不同版本 7.0, (2013) 8.2 ...
- delphi Wmi 获取操作系统信息
uses ActiveX, ComObj; function GetWMIProperty(WMIProperty: string): string; var Wmi, Objs, Obj: OleV ...
- 关于Transformer中Decoder模块是如何预测下一个字符的算法
关于Transformer模型的Encoder-Decoder模块网上介绍的文章非常多,写的非常详尽,可谓汗牛充栋,尤其关于注意力计算这块,不仅给出了公式而且还有具体的计算步骤.关于Transform ...
- Unity Shader模板测试-描边
Unity Shader模板测试描边效果,常用于 rpg 项目中主角被遮挡的情况,将被遮挡的部分的轮廓描边绘制出来,这样可以在任何情况都能知道主角在哪里.(还有另外一种就是使用X光效果,但这种效果不需 ...