之前本人通过阿里云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
放行端口
1883 | MQTT TCP 协议端口 |
8080 | MQTT执行引擎HTTP API 端口 |
8083 | MQTT/WebSocket 端口 |
8084 | MQTT/WebSocket with SSL 端口 |
8883 | MQTT/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>
Comments | NOTHING