MQTT通信架构 搭建MQTT服务器

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端可以收到:

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>