MQTT安裝
前期準備
-
由于微信小程序需要wss,所以要有域名SSL證書
-
新建目錄
/srv/mosquitto/config
,/srv/mosquitto/config/cert
-
目錄
/srv/mosquitto/config
中新建配置文件mosquitto.conf
,文件內容persistence true persistence_location /mosquitto/data log_dest file /mosquitto/log/mosquitto.log listener 1883 listener 9001 protocol websockets certfile /mosquitto/config/cert/mqtt.xxx.com_public.crt keyfile /mosquitto/config/cert/mqtt.xxx.com.key cafile /mosquitto/config/cert/mqtt.xxx.com_chain.crt allow_anonymous false password_file /mosquitto/config/pwfile.conf
最后一行 /mosquitto/config/pwfile.conf ,是用戶認證配置,后面會說到
-
目錄
/srv/mosquitto/config/cert
中的證書文件對應上面的配置文件內容- mqtt.xxx.com_public.crt
- mqtt.xxx.com.key
- mqtt.xxx.com_chain.crt
docker命令部署MQTT服務
docker run -d --name eclipse-mosquitto -p 1883:1883 -p 9001:9001 -v /srv/mosquitto/config/:/mosquitto/config/ -v /srv/mosquitto/data:/mosquitto/data -v /srv/mosquitto/log:/mosquitto/log eclipse-mosquitto
MQTT用戶認證配置
docker exec -it mqtt /bin/sh
mosquitto_passwd /mosquitto/config/pwfile.conf {用戶名}
輸入上面的命令后還要輸入兩次密碼就可以了
如果MQTT客戶端連不上,重啟一下MQTT服務
docker restart mqtt
uniapp配置
NPM方式安裝
npm i mqtt@4.1.0
安裝指定版本4.1.0,目前【2024-07-09】最新版本有問題
MQTT連接示例
import mqtt from 'mqtt/dist/mqtt'const client = mqtt.connect("wxs://mqtt.xxx.com", {port: '9001',username: '用戶名',password: '密碼',reconnectPeriod: 1000
});
this.client = client
client.on('connect', () => {console.log('connect')
});
// 自動重連
client.on('reconnect', (msg) => {console.log('reconnect', msg)
});
// 錯誤
client.on('error', () => {console.log('error')
});
// 斷開
client.on('end', () => {console.log('end')
});
// 掉線
client.on('offline', (msg) => {console.log('offline', msg)
});
// 收到消息
client.on('message', (topic, message) => {// 把arrayBuffer轉成字符串let encodedString = String.fromCharCode.apply(null, new Uint8Array(message));
})
熄屏斷連問題
目前我的解決方案是
App.vue文件中onHide時斷開連接,onShow時重新初始化client。
訂閱時topic記錄下來,client.on(‘connect’)時遍歷topic記錄一一訂閱
onHide(() => {console.log("App onHide");client.end();
});
應用實例
我寫了個小程序,目前實現了一個功能
wol遠程電腦開機
微信小程序通過MQTT給ESP8266發送命令,ESP8266收到命令后發送WOL魔術包實現電腦開機,還可以用ESP8266直接連接電腦開機引腳開機。ESP8266代碼在文章的最上面,下載不了可私信我。
防火布