Ubuntu系统上搭建MQTT服务器指南


目录

一、介绍

二、说明

三、搭建步骤

步骤1:安装Ubuntu

步骤2:配置网络(设置网络桥接模式)

步骤3:安装配置mosquitto

步骤4:运行测试

步骤5:MQTTX测试

四、搭建完成及后续

五、代码操作


一、介绍

  • 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

    物联沃分享整理
    物联沃-IOTWORD物联网 » Ubuntu系统上搭建MQTT服务器指南

    发表回复