使用开源mqtt库 连接阿里云
前言
想将ROS配送车的速度上传到云平台,然后远程控制与监控。由于ROS要求python的版本是2.7,且阿里云的mqtt的sdk只支持python3.5。所以用开源的paho
来实现相应功能
使用MQTT.fx来测试相应的加密算法
官网下载,MQTT.fx。
参考【MQTT】用MQTT.fx连接阿里云,直到设备通过MQTT.fx
,连接在线即可。
注意事项:
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的物理数据模型
在物理设备模型
下主要有运行状态
,事件管理
,服务调用
等功能,这些数据节点之后又可以在lot studio
里面完成一个网页的数据展示。
设备端向云端发送的topic,主要有以下:
发送的msg数据应是json格式,且包含数据的标识符
,
数据格式如下:
payload_json = {
'id': int(time.time()),
'params': {
'linear_x': linear_x,
'angular_z': angular_z
},
'method': "thing.event.property.post"
}
其他如在线测试,日志跟踪,文件管理的功能可以自己去摸索。