一、介绍
- MQTT是广泛应用于物联网的一种轻量级、基于发布-订阅模式的消息传输协议。
- 文章中搭建的是本地的MQTT服务器,在同一局域网下可以进行连接和消息转发。
- 如果想公布到公网,请自行百度,该文章仅用作学习。
二、说明
搭建并运行成功的一些环境设置和说明(建议搭建前先看看)
- 在Ubutu18.04上搭建成功并运行。
- 使用了mosquitto开源消息代理软件。
- MQTT版本为3.1.1。
- Ubuntu设置了桥接模式。(这块很难成功)
- 使用了MQTTX软件进行连接测试。
三、搭建步骤
步骤1:安装Ubuntu
- 安装Ubuntu18.04(我在Ubuntu18.04上测试成功),如何安装Ubuntu自行百度,有很多安装方法。若有其他的Ubuntu的版本也可跟着一步一步的搭建,理论上不影响。
步骤2:配置网络(设置网络桥接模式)
- 为什么配置网络原因1:因为在Ubuntu上搭建的MQTT服务器,为了保证主机能访问服务器,需要对网络进行设置。(称主机为window,服务器就是Ubuntu。若无特殊说明,以下都称主机和服务器)。
- 为什么配置网络原因2:在同一局域网下进行连接和消息转发,需要保证主机和服务器处于同一网段下,这样主机和服务器双方才能ping通。
- 只测试了桥接模式,也可以试试NAT模式,NAT模式我没有试过。不知道能不能ping通。桥接模式的设置也可以百度,自行设置,不一定按照本文。最后保证主机与服务器能相互ping通即可。
先在Windows安全中心-->防火墙与网络保护-->高级设置里面。开启红色框中的规则(如下图)
下面就跟着视频操作就行,桥接模式设置完成才进行下一步骤!!!。视频里面的注意点:网卡选择是指的是电脑本身出厂的网卡。网卡是什么型号在设备管理器里面可自行查看。
视频操作完后,按照下方图片所示更改下hosts内容,192.168.187.55为你自己的ip地址,ip地址后面是名称。
步骤3:安装配置mosquitto
依次执行下列步骤,在Ubuntu终端里面
1、运行sudo apt-get update更新源。
2、运行sudo apt-get install mosquitto指令安装mosquito。
3、安装客户端:sudo apt-get install mosquitto-clients
4、添加账户及密码:sudo mosquitto_passwd -c /etc/mosquitto/pwfile.txt admin
输入自设密码:123
说明:admin是账户,可以自己设定,密码也可以自己设定。账户和密码需要记住,后续测试会用到。
5、安装完成后查看服务器状态,当为active状态下则MQTT服务器正在运行。
sudo service mosquitto start #启动服务器
sudo service mosquitto stop #停止服务器
sudo service mosquitto restart #重启服务器
sudo service mosquitto status #查看服务器当前状态
sudo systemctl enable mosquitto.service #设置开机启动
步骤4:运行测试
1、订阅主题(终端1)
mosquitto_sub -h localhost -t "test001/#" -u admin -P 123 -i "client1"
说明:只需要更改标黄了的3个地方。test001是订阅主题,可自己设置,/#是指的订阅test001的所有主题,/#起到通配符的作用;admin,123为账户和密码。
2、发布主题(终端2)
mosquitto_pub -h localhost -t "test001/testTopic" -u admin -P 123 -m "Hello MQTT"
说明:Hello MQTT是发布的消息,可自己更改。
3、订阅客户端存活连接数
mosquitto_sub -h localhost -t '$SYS/broker/clients/active' -u book -P root -i "client2"
步骤5:MQTTX测试
- 下载mqttx,下载Windows桌面端即可,下载地址:MQTTX 下载
- 打开MQTTX进行配置(MQTTX可以设置中文)
按照下图配置,名称可自定义,Client ID也可自定义,旁边有随机生成,服务器地址可以ipconfig查看,用户名和密码是你自己设置的。mqtt版本选择3.1.1,版本太高不会连接成功。配置完后点击连接。
第一步就是发送主题(test001),第二步是编写json格式,第三步点击发送。然后就能在Ubuntu下看到发送的json消息是什么。注意在ubuntu下要先订阅主题。
四、搭建完成及后续
到这步就已经完成了本地MQTT服务器的搭建和测试,后续就可以对服务器进行操作。例如:在物联网中,用WiFi模块(esp8266-01s)将传感器采集的数据上传到服务器上。也可以用其他语言对mqtt消息进行监听或者是发布消息。
注意:因为我是连接的wifi热点,所以这个ip地址每天都会更改,解决办法就是每天新建一个网络,或者设置为静态ip。或者也可以搭建在云服务器上。
五、代码操作
我是用的python代码操作mqtt的订阅主题和发布主题。数据是随机数产生。
代码一:(发布消息)
import json
import random
import time
from paho.mqtt import client as mqtt_client
broker = '192.168.187.55' # 服务器地址
port = 1883
topic = "test001/testTopic" # 主题
# client ID
client_id = f'python-mqtt-{random.randint(0, 100)}'
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc, properties):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
#client =mqtt_client.Client(client_id,mqtt.CallbackAPIVersion.VERSION1)
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2, client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
def publish(client):
msg_count = 0
while True:
time.sleep(10)
# 生成经纬度随机数生成,模拟设备位置
longitude = random.uniform(103.5, 104.5)
latitude = random.uniform(30.5, 31.5)
jingwei = str(longitude) + "," + str(latitude)
# 生成传感器随机值
temperature = round(random.uniform(15, 35), 2)
humidity = round(random.uniform(30, 80), 2)
harmful = round(random.uniform(0, 100), 2)
smoke = round(random.uniform(0, 50), 2)
water = round(random.uniform(0, 5), 2)
wind = random.choice(["北风", "东北风", "东风", "东南风", "南风", "西南风", "西风", "西北风"]) # 生成随机风向
fire = random.choice(["检测到火焰较弱", "检测到火焰中等", "火焰较强,请注意", "未检测到火焰"])
gas_speed = round(random.uniform(0, 10), 2) # 生成随机气体流动速度
# 生成 JSON 格式的数据
data = {
"经纬度": jingwei,
"温度(°C)": temperature,
"湿度(%RH)": humidity,
"有害气体浓度(ppm)": harmful,
"烟雾浓度(ppm)": smoke,
"水位高度(m)": water,
"风向": wind,
"火焰状态": fire,
"气体流动速度(m/s)": gas_speed,
"传感器采集时间": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
}
msg = json.dumps(data, ensure_ascii=False)
result = client.publish(topic, msg)
# result: [0, 1]
status = result[0]
if status == 0:
print(f"基本数据`{msg}`到主题`{topic}`")
else:
print(f"错误: {topic}")
msg_count += 1
def run():
client = connect_mqtt()
publish(client)
if __name__ == '__main__':
try:
run()
except KeyboardInterrupt:
print("程序已中断。")
代码二:(订阅主题消息)
import random
import warnings
from paho.mqtt import client as mqtt_client
warnings.filterwarnings("ignore")
broker = '192.168.187.55' # 服务器地址
port = 1883
data_topic = "test001/testTopic"
client_id = f'python-mqtt-subscriber-{random.randint(0, 100)}'
def on_connect(client, userdata, flags, rc, properties=None):
if rc == 0:
client.subscribe(data_topic)
else:
return rc
def on_message(client, userdata, msg):
print(f"收到数据: {msg.payload.decode()}")
def connect_mqtt():
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2,client_id)
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker, port)
client.loop_forever()
if __name__ == '__main__':
connect_mqtt()
运行结果展示:
版权归原作者 ASUGIAO 所有, 如有侵权,请联系我们删除。