0


在Ubuntu上自建MQTT服务器



一、介绍

  • 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()

运行结果展示:


本文转载自: https://blog.csdn.net/weixin_68910258/article/details/140783906
版权归原作者 ASUGIAO 所有, 如有侵权,请联系我们删除。

“在Ubuntu上自建MQTT服务器”的评论:

还没有评论