一、引言
随着物联网(IoT)技术的飞速发展,MQTT(Message Queuing Telemetry Transport)协议因其轻量级、发布/订阅模式以及良好的扩展性,在物联网通信领域得到了广泛的应用。EMQX作为一款开源的MQTT消息代理,凭借其高性能、易扩展和丰富的功能,成为了搭建MQTT服务器的理想选择。本文将详细介绍如何使用EMQX搭建MQTT服务器。
二、EMQX简介
EMQX是一款基于Erlang/OTP平台开发的MQTT消息代理,支持大量并发连接和海量消息吞吐,适用于各种物联网场景。EMQX提供了丰富的功能,包括认证授权、规则引擎、集成插件等,能够轻松实现MQTT消息的接入、处理和转发。
三、安装与配置EMQX
可以从EMQX官网下载对应版本的安装包,根据官方文档进行安装。安装完成后,可以通过命令行或图形界面启动EMQX服务。
1.根据自己的系统下载对应的版本就好,安装并且启动
官方下载地址:https://www.emqx.io/zh
该网址需要科学上网,博主准备好了相关资料的下载地址需要的使用迅雷进行下载
2.参考这位博主的笔记进行安装:https://blog.csdn.net/weixin_41542513/article/details/134328627
3.完成使用EMQX在局域网中进行MQTT协议的数据传输
4.如果在启动时报错emqx启动报错“Unable to load emulator DLL、node.db_role = EMQX_NODE__DB_ROLE = core”是提示安装C++,安装我的资料包中的OPT软件就好了
四、发送端搭建-使用python向EMQX发送数据
import time
from paho.mqtt import publish
#import collections
#collections.Iterable = collections.abc.Iterable
HOST ="127.0.0.1" #服务器地址
PORT =1883 #端口号
#客户端名称 不同的链接需要端口不一样,可以自己填入也可以使用下面的代码自动生成时间作为客户端ID
client_id = "mqttx_4ae0b41b"
# client_id = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
Topic = "MQTTPUSH" #发送的主题
username = "MQTT2" #账号
password = "123456" #密码
if __name__ == '__main__':
print("准备发送信息")
for i in range(200):
time.sleep(0.1)
publish.single("MQTTPUSH","编号:"+str(i)+" "+str(time.strftime('%Y.%m.%d-%H:%M:%S', time.localtime(time.time()))), qos = 1, hostname = HOST, port = PORT, client_id = client_id,
auth = {'username':username, 'password': password})
print(str(time.strftime('%Y.%m.%d-%H:%M:%S', time.localtime(time.time())))+"发送"+str(i+1)+"条消息")
python如果报错“module 'collections' has no attribute 'Iterable'”这意味着collections
模块并没有一个名为Iterable
的属性或类。Iterable
是一个内置的abc(抽象基类)类型,它定义了一个可以迭代的对象的接口。在Python中,你可以直接从collections.abc
模块中导入Iterable
,而不是从collections
模块。
在程序中添加这一行代码就好了,删除列程中的注释
import collections
collections.Iterable = collections.abc.Iterable
上面的参数不知道怎么填的,就是对应下面说划线的参数
运行结果:每隔时间向指定服务器发送时间信息,MQTTX中主题接收成功
五、接收端搭建-接受EMQX服务器中的数据
import paho.mqtt.client as mqtt
import time
HOST ="127.0.0.1"
PORT =1883
client_id = "mqttx_4ae0b41c" # Client_id 不能重复,需要更改,或者使用时间自己产生
# client_id = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
Topic = "MQTTPUSH" #订阅主题
username = "MQTT2"
password = "123456"
def on_connect(client,userdata, flags,rc):
print("Connected with result code" + str(rc))
client.subscribe(Topic)
def on_message(client,userdata,msg):
print(msg.topic+ msg.payload.decode("utf-8") + "接收时间:"+str(time.strftime('%H:%M:%S', time.localtime(time.time())) ))
def client_loop():
client = mqtt.Client(client_id)
client.username_pw_set(username,password) # 必须设置,否则会返回 /Connected with result code 4/
client.on_connect = on_connect
client.on_message = on_message
try:
client.connect(HOST,PORT,60)
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()
if __name__ == '__main__':
print("这是接受端")
client_loop()
运行结果:
五、内网穿透-使用花生壳软件实现外网的访问
花生壳是一款具备内网穿透和动态域名解析功能的软件,主要为没有公网IP或动态公网IP用户,提供简单、高效、稳定、安全的远程访问服务。通过云服务器快速与内网服务器建立连接,同时把内网端口映射到云端,实现各类局域网应用基于域名的互联网访问。花生壳能够实现反向代理应用,支持TCP、UDP、HTTPS协议,端到端的TLS加密通信,黑白名单防黑验证等,支持外网设备穿透各种复杂的路由和防火墙访问到内网的应用。
1.下载安装花生壳软件
官网地址:花生壳下载地址
2.添加映射
旋转TCP应用
3.将内网中127.0.0.1 1883端口进行端口的映射
画红线的为IP地址,画绿线的为端口
4.更改之前python中的IP地址和端口,其他不变就可以完成外网的数据的传输