使用开源mqtt库 连接阿里云

文章目录

    • 使用开源mqtt库 连接阿里云
      • 前言
      • 使用MQTT.fx来测试相应的加密算法
      • python 连接
      • 关于mqtt的一些理解

使用开源mqtt库 连接阿里云

前言

想将ROS配送车的速度上传到云平台,然后远程控制与监控。由于ROS要求python的版本是2.7,且阿里云的mqtt的sdk只支持python3.5。所以用开源的paho来实现相应功能

使用MQTT.fx来测试相应的加密算法

官网下载,MQTT.fx。
参考【MQTT】用MQTT.fx连接阿里云,直到设备通过MQTT.fx,连接在线即可。

注意事项:

  • clientId 千万不要选123456,最好复杂点

  • 生成密钥工具,可以选加密工具

  • 可以看下官方文档,但是那个最小加密工具真的不好用。

python 连接

安装paho库

pip install paho-mqtt

之后参考博主的代码魔改就可以了,记得更改一些参数配置

#!/usr/bin/python
# -*- coding:utf8 -*-

#----------------函数头-------------------#
import paho.mqtt.client as mqtt
import time
import rospy
import json
from geometry_msgs.msg import Twist

#---------------------变量设置-------------------#
# Client对象构造
MQTTHOST = "a1QSlaSJ16g.iot-as-mqtt.cn-shanghai.aliyuncs.com"
MQTTPORT = 1883
mqttClient = mqtt.Client("xxx|securemode=3,signmethod=hmacsha1|")
mqttClient.username_pw_set("xxxxx", "xxxxx")

post_path = "/sys/a1QSlaSJ16g/linux/thing/event/property/post"

#---------------------mqtt设置------------------------#
# 连接MQTT服务器
def on_mqtt_connect():
    mqttClient.connect(MQTTHOST, MQTTPORT, 60)
    mqttClient.loop_start()

# publish 消息
def on_publish(topic, payload, qos):
    mqttClient.publish(topic, payload, qos)

# 消息处理函数
def on_message_come(lient, userdata, msg):
    user_dic = json.loads(msg.payload)
    twist = Twist()
    param_dic =user_dic["params"]
    try:
        if("linear_x" in param_dic.keys()):
            pub_linear_x = user_dic["params"]["linear_x"]
            twist.linear.x = pub_linear_x
            
        if("angular_z" in param_dic.keys()):
            pub_angular_z = user_dic["params"]["angular_z"]
            twist.angular.z = pub_angular_z
        
        pub.publish(twist)
        
    except:
        print(user_dic)


# subscribe 消息
def on_subscribe():
    # 订阅监听自定义Topic
    mqttClient.subscribe("/********/pythondevice2/user/update1", 1)
    mqttClient.on_message = on_message_come # 消息到来处理函数



#------------------ROS函数回调------------------#
def mqtt_callback(data):

    if(data.linear.x == -0.0 and data.angular.z ==-0.0 ):
        pass
    else:
        linear_x = data.linear.x
        angular_z = data.angular.z
        payload_json = {
            'id': int(time.time()),
            'params': {
                'linear_x': linear_x,
                'angular_z': angular_z
            },
            'method': "thing.event.property.post"
            }
        time.sleep(0.5)
        on_publish(post_path,str(payload_json),1)
        print(str(payload_json))
       
    


def send_cmd():
    rate = rospy.Rate(2) # 10hz
    while not rospy.is_shutdown():
        pub.publish(twist)
        rate.sleep()

if __name__ == '__main__':
    rospy.init_node('mqtt_server')
    on_mqtt_connect()
    on_subscribe()
    
    rospy.Subscriber("/mqtt_server", Twist, mqtt_callback)
    pub = rospy.Publisher('cmd_vel', Twist,queue_size = 3)
    rospy.spin()

关于mqtt的一些理解

正常情况下,用云服务器,emq 和node-red既可以拓展一个自己的mqtt控制中心。但是平台有平台的优势,无论是阿里云还是华为云,数据上云只是第一步,难得是后面的数据利用与控制。

以阿里云为例:
这是自己linux的物理数据模型

使用开源mqtt库 连接阿里云_第1张图片

物理设备模型下主要有运行状态事件管理服务调用等功能,这些数据节点之后又可以在lot studio里面完成一个网页的数据展示。

设备端向云端发送的topic,主要有以下:

使用开源mqtt库 连接阿里云_第2张图片

发送的msg数据应是json格式,且包含数据的标识符

数据格式如下:

        payload_json = {
            'id': int(time.time()),
            'params': {
                'linear_x': linear_x,
                'angular_z': angular_z
            },
            'method': "thing.event.property.post"
            }

其他如在线测试,日志跟踪,文件管理的功能可以自己去摸索。

你可能感兴趣的:(lot,ROS项目开发)