MQ 遥测传输 (MQTT) 是基于代理的发布/订阅的消息传输协议。
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(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()
类似的,也是连接上之后,发布随机数生成的温度即可。
注意!!!!!!大坑:不能有同名的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端可以收到: