阿里云ubuntu服务器
1、apt search mosquitto 命令查看可用的Mosquitto包
2、使用命令安装Mosquitto:
sudo apt install mosquitto
3、安装完成后,可以使用 man mosquitto 命令打开帮助文档。文档中列出了运行办法
4、修改/etc/mosquitto/mosquitto.conf
在mosquitto.conf最下面添加如下配置
# 绑定mqtt tcp 端口号 1883
port 1883
protocol mqtt
# 绑定mqtt websocket 端口号 9001
listener 9001
protocol websockets
5、修改Nginx配置,在server中添加如下配置
location /mqtt
{
proxy_pass http://127.0.0.1:9001; #address of home assistant machine
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
6、至此服务端mqtt broker配置完成,如需要进行账号密码以及权限配置可以参考相应mosquitto.conf 配置进行修改
7、设备端使用Python进行mqtt的发布和订阅
8、安装paho-mqtt模块
pip3 install paho-mqtt
9、编写mqtt代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
import json
import threading
import time
import paho.mqtt.client as mqtt
# 一旦连接成功,回调此方法
def on_connect(mqttc, obj, flags, rc):
print("rc: " + str(rc))
if rc == 0:
#连接成功后 订阅相关话题
subscribe_topic_array = [("/122/#", 2)]
mqttc.subscribe(subscribe_topic_array)
# 一旦订阅到消息,回调此方法
def on_message(mqttc, obj, msg):
# 接收到订阅话题之后执行后续操作
pass
# 一旦订阅成功,回调此方法
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: " + str(mid) + " " + str(granted_qos))
pass
# 一旦有log,回调此方法
def on_log(mqttc, obj, level, string):
print(string)
pass
def init():
try:
# 新建mqtt客户端,默认没有clientid,clean_session=True, transport="tcp"
mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_log = on_log
# 连接broker,心跳时间为60s,xx为服务器地址
mqttc.connect("xx.xx.xx.xx", 1883, 60)
# 订阅该主题,QoS=0
threading.Thread(target=mqttc.loop_forever).start()
except Exception as ex:
print(ex)
pass
10、前端web端进行消息订阅及消息发布
11、引入js文件<script src="http://dxr.l-hate.com/assets/js/mqttws31.js"></script>
12、封装mqtt方法
/**
* MQTT协议链接封装
* @param destination Topic订阅主题
* @param callback 回调函数(主题跟值)
*/
function connectMqtt(destination,callback) {
var message;
if (!window.WebSocket) {
message = "您的浏览器不支持WebSockets!";
alert('您的浏览器不支持WebSockets!');
} else {
var client;
//实例化mqtt
client = new Messaging.Client('xx.xx.xx.xx', Number(9001), "" + new Date().getTime());
// client.send()
//在消息到达
client.onMessageArrived = function (res) {
message = res.payloadString;
var topic = res.destinationName;
callback(topic,message);
};
//在连接丢失
client.onConnectionLost = function (responseObject) {
if (responseObject.errorCode !== 0) {
message = responseObject.errorCode;
}
};
client.connect({
userName: '',
password: '',
onSuccess: function () {
console.log('success')
for (var i = 0; i < destination.length; i++) {
client.subscribe(destination[i]);
}
},
onFailure: function (failure) {
message = failure.errorMessage;
}
});
}
return client
}
//发送
function doSend(client,flag) {
if (client != null) {
let message = new Messaging.Message(flag);
message.destinationName = '/' + Config.task.sn + '/call_client';
client.send(message);
console.log("发送成功!");
Toastr.success("发送成功");
} else {
console.log("连接失败!");
Toastr.error("发送失败");
}
}
//订阅
let mqttList = ['/122/nav_response/realtime_pose']; //要订阅主题mqtt数组
let client = connectMqtt(mqttList,function (topic,message){
console.log(topic, message)
let msg = JSON.parse(message).msg
});