之前本人通过阿里云IOT平台,实现了ESP8266和服务器的通信。本文将简单介绍如何用自己的服务器搭建私人MQTT服务器。

EMQX是一款完全开源,高度可伸缩,高可用的分布式 MQTT 消息服务器,可以方便的部署在个人云服务器上。更多信息以及官方说明文档可以在官网查看https://www.emqx.com/zh

安装

curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
sudo apt-get install emqx
sudo systemctl start emqx

放行端口

1883MQTT TCP 协议端口
8080MQTT执行引擎HTTP API 端口
8083MQTT/WebSocket 端口
8084MQTT/WebSocket with SSL 端口
8883MQTT/TCP SSL 端口
18083管理控制台端口

安装后一定要及时放行端口

安装完成后即可通过0.0.0.0:18083进入控制台(0.0.0.0换成服务器公网IP)

默认用户名:admin 默认密码:public 建议及时更改密码

也可以设置反向代理,无需输入端口号即可访问控制台

SSL配置(可选)

如果有开发微信小程序等需求,必须采用加密的传输协议,如https、wss等,所以要为域名申请证书。

普通用户可以在阿里云等平台申请免费的证书,安装完成后将证书导入/etc/emqx/certs中,并改名为mqtt(也可以用其它名字)。打开/etc/emqx/emqx.conf修改以下信息

listener.wss.external.keyfile=/etc/emqx/certs/mqtt.key
listener.wss.external.certfile=/etc/emqx/certs/mqtt.pem
listener.ssl.external.keyfile=/etc/emqx/certs/mqtt.key
listener.ssl.external.certfile=/etc/emqx/certs/mqtt.pem

最后通过emqx restart命令重启esmqx服务即可,在Websocket中勾选SSL,若状态为已连接则设置成功

测试

测试基于mqttx工具,可以在官网下载 https://mqttx.app/zh

注意:客户端ID一定不能一样

若未配置SSL,则不要勾选对应选项

在订阅了对应的主题后即可接收

参考JS代码

mqtt.js 是一个开源的 MQTT 协议的客户端库,使用 JavaScript 编写,是目前 JavaScript 生态中使用最为广泛的 MQTT 客户端库

<script src="http://api.xiaobai1103.cn/js/mqtt.js"></script>

<script>
 const connectUrl = `wss://mqtt.xiaobai1103.cn:8084/mqtt`;

client = mqtt.connect(connectUrl, {
  clean: true,
  connectTimeout: 4000,
  reconnectPeriod: 1000,
  clientId: 'emqx_NzE5OD',
  username: '123',
  password: '123'
})

// 需要订阅的主题
const topic = 'test';

//成功连接后触发的回调
client.on('connect', () => {
  console.log('已经连接成功');
  // 这里可以订阅多个主题
  client.subscribe([topic], () => {
    console.log(`订阅了主题 ${topic}`)
  })
});

// 当客户端收到一个发布过来的消息时触发回调
client.on('message', function (topic, message, packet) {
  // 这里有可能拿到的数据格式是Uint8Array格式,所以可以直接用toString转成字符串
  // let data = JSON.parse(message.toString());
  console.log("返回的数据:", message)
  document.write(message)
});

// 连接断开后触发的回调
client.on("close", function () {
  console.log("已断开连接")
});
    </script>