阿里云ubuntu部署mqtt,设备终端以及web端引入mqtt进行数据交互

阿里云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
	});

猜你喜欢

转载自blog.csdn.net/qq_23607397/article/details/120155216