MQ 遥测传输 (MQTT) 是基于代理的发布/订阅的消息传输协议。
- 传输屏蔽消息内容
- TCP/IP有连接传输(可靠)
- 小型传输,开销很小,降低网络流量
- 使用lastwill等机制告知客户端异常中断(本次实验用不到)
- 三种消息发布服务质量
- 至多一次:消息发布完全依赖底层TCP/IP网络,会发生消息的丢失或重复。环境传感器发送数据就是用整个,因为不久之后传感器会传来第二个数据。
- 至少一次(可能重复,但是消息确保可以到达)
- 只有一次:计费系统这种,消息若丢失,多次发送但是一定只会生效一次(不会发生消息重复)。
MQTT结合传感器的物联网架构图:
可以看到需要一个MQ中间件,我认为只是简单的消息订阅/发送的必要性,或许可以用我更熟悉的rocketmq或rabbitmq来代替。但是看教程全是apoll服务器,为了避免知识局限性带来的后续麻烦,我选择随大流。
安装apoll服务器:下载连接 Apollo Server Download
解压后,在bin下创建一个server,再创一个broker
创建server完成。
管理员身份CMD/POWERSHELL运行命令。
注意,JDK版本1.8。因为java9引入模块,javase中不再包含一些依赖。
要注意的点:
MQTT服务器TCP连接端口:tcp://0.0.0.0:61613 (tcp通讯,sensor(publisher)要连接的端口)
后台Web管理页面:https://127.0.0.1:61681/或http://127.0.0.1:61680/
etc/user.properties里面是用户名密码。登陆成功。
至此,mqtt服务器完成搭建。
完成client端(python)
这里是client(terminal)接受信息的。
import paho.mqtt.client
import time
mqtt = paho.mqtt.client
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc)) #打印连接状态
client.subscribe("temperature") #订阅temperature这个topic
def on_message(client, userdata, msg):
print(msg.topic+" " + ":" + str(msg.payload)) #打印接受的消息
client_id = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
client = mqtt.Client(client_id) # ClientId不能重复,所以使用当前时间
client.username_pw_set("admin", "password") # 必须设置,否则会返回「Connected with result code 4」
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 61613, 60) # host port keepalive
client.loop_forever()
完成连接
完成publisher:
类似的,也是连接上之后,发布随机数生成的温度即可。
注意!!!!!!大坑:不能有同名的client_id否则没法发布消息/接受消息(只会有一个client生效)
import random
import paho.mqtt.client
import time
mqtt = paho.mqtt.client
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc)) #打印连接状态
client.subscribe("temperature") #订阅temperature这个topic
def on_message(client, userdata, msg):
print(msg.topic+" " + ":" + str(msg.payload)) #打印接受的消息
client_id = time.strftime('%Y%m%d%H%M%S'+"sensor",time.localtime(time.time()))
client = mqtt.Client(client_id) # ClientId不能重复,所以使用当前时间
client.username_pw_set("admin", "admin") # 必须设置,否则会返回「Connected with result code 4」
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 61613, 60)
while True:
time.sleep(2)
temptemp = random.randint(1,40)
print("准备发送下2s的温度数据:",temptemp)
client.publish("temperature", payload=str(temptemp), qos=2)
client.loop_forever()
这样,client的terminal端可以收到:文章来源:https://www.toymoban.com/news/detail-430593.html
文章来源地址https://www.toymoban.com/news/detail-430593.html
到了这里,关于MQTT通信架构 搭建MQTT服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!