找回密码
 会员注册
查看: 25|回复: 0

在Ubuntu上自建MQTT服务器

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-11 11:50:54 | 显示全部楼层 |阅读模式
目录一、介绍二、说明三、搭建步骤步骤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、运行sudoapt-getupdate更新源。2、运行sudoapt-getinstallmosquitto指令安装mosquito。3、安装客户端:sudoapt-getinstallmosquitto-clients4、添加账户及密码:sudomosquitto_passwd-c/etc/mosquitto/pwfile.txtadmin输入自设密码:123说明:admin是账户,可以自己设定,密码也可以自己设定。账户和密码需要记住,后续测试会用到。5、安装完成后查看服务器状态,当为active状态下则MQTT服务器正在运行。sudoservicemosquittostart  #启动服务器sudoservicemosquitto stop #停止服务器sudoservicemosquittorestart #重启服务器sudoservicemosquittostatus #查看服务器当前状态sudosystemctlenablemosquitto.service  #设置开机启动步骤4:运行测试1、订阅主题(终端1)mosquitto_sub-hlocalhost-t"test001/#"-uadmin-P123-i"client1"说明:只需要更改标黄了的3个地方。test001是订阅主题,可自己设置,/#是指的订阅test001的所有主题,/#起到通配符的作用;admin,123为账户和密码。2、发布主题(终端2)mosquitto_pub-hlocalhost-t"test001/testTopic"-uadmin-P123-m"HelloMQTT"说明:HelloMQTT是发布的消息,可自己更改。3、订阅客户端存活连接数mosquitto_sub-hlocalhost-t'$SYS/broker/clients/active'-ubook-Proot-i"client2"步骤5:MQTTX测试下载mqttx,下载Windows桌面端即可,下载地址:MQTTX下载打开MQTTX进行配置(MQTTX可以设置中文)按照下图配置,名称可自定义,ClientID也可自定义,旁边有随机生成,服务器地址可以ipconfig查看,用户名和密码是你自己设置的。mqtt版本选择3.1.1,版本太高不会连接成功。配置完后点击连接。第一步就是发送主题(test001),第二步是编写json格式,第三步点击发送。然后就能在Ubuntu下看到发送的json消息是什么。注意在ubuntu下要先订阅主题。四、搭建完成及后续到这步就已经完成了本地MQTT服务器的搭建和测试,后续就可以对服务器进行操作。例如:在物联网中,用WiFi模块(esp8266-01s)将传感器采集的数据上传到服务器上。也可以用其他语言对mqtt消息进行监听或者是发布消息。注意:因为我是连接的wifi热点,所以这个ip地址每天都会更改,解决办法就是每天新建一个网络,或者设置为静态ip。或者也可以搭建在云服务器上。五、代码操作我是用的python代码操作mqtt的订阅主题和发布主题。数据是随机数产生。代码一:(发布消息)importjsonimportrandomimporttimefrompaho.mqttimportclientasmqtt_clientbroker='192.168.187.55'#服务器地址port=1883topic="test001/testTopic"#主题#clientIDclient_id=f'python-mqtt-{random.randint(0,100)}'defconnect_mqtt()->mqtt_client:defon_connect(client,userdata,flags,rc,properties):ifrc==0:print("ConnectedtoMQTTBroker!")else:print("Failedtoconnect,returncode%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_connectclient.connect(broker,port)returnclientdefpublish(client):msg_count=0whileTrue: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]ifstatus==0:print(f"基本数据`{msg}`到主题`{topic}`")else:print(f"错误:{topic}")msg_count+=1defrun():client=connect_mqtt()publish(client)if__name__=='__main__':try:run()exceptKeyboardInterrupt:print("程序已中断。")代码二:(订阅主题消息)importrandomimportwarningsfrompaho.mqttimportclientasmqtt_clientwarnings.filterwarnings("ignore")broker='192.168.187.55'#服务器地址port=1883data_topic="test001/testTopic"client_id=f'python-mqtt-subscriber-{random.randint(0,100)}'defon_connect(client,userdata,flags,rc,properties=None):ifrc==0:client.subscribe(data_topic)else:returnrcdefon_message(client,userdata,msg):print(f"收到数据:{msg.payload.decode()}")defconnect_mqtt():client=mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2,client_id)client.on_connect=on_connectclient.on_message=on_messageclient.connect(broker,port)client.loop_forever()if__name__=='__main__':connect_mqtt()运行结果展示:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-31 04:51 , Processed in 0.811719 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表