虚拟机Ubantu连接ONENET平台上传数据与错误问题汇总
1.安装UBANTU与虚拟机,可以看我的前面的文章
2.基础的ONENET操作,我看的下面这篇文章做的,或者B站有视频讲解,需要注意一点在产品开发时注意选数据流。看下面这一篇,照着设置,先用这个mqtt.fx激活设备后在进行我们的虚拟机程序触发。
使用MQTT.fx接入新版ONENet(24.4.8)_mqtt.fx 最新版本-CSDN博客
3.基础的代码逻辑是通过唯一一篇说的详细还不收费的这个哥们的文章里搞懂的
Python使用MQTT连接新版ONENet_python onenet-CSDN博客
4.具体代码
import paho.mqtt.client as mqtt from paho.mqtt.client import MQTTv311 import json import base64 import hmac import time from urllib.parse import quote # 服务器信息 ServerUrl = "mqtts.heclouds.com" # 服务器URL ServerPort = 1883 # 服务器端口 DeviceName = "sssrgovan" # 设备ID Productid = "dsdsd4sxgl" # 产品ID accesskey = "sdddddddddddddddddddddddddddddd" # 密钥 # 发布的topic Pub_topic1 = "$sys/" + Productid + "/" + DeviceName + "/dp/post/json" # 需要订阅的topic Sub_topic1 = "$sys/" + Productid + "/" + DeviceName + "/dp/post/json/accepted" Sub_topic2 = "$sys/" + Productid + "/" + DeviceName + "/dp/post/json/rejected" # 测试用JSON数据格式(上传5个不同的数据量) data = { "id": 123, "dp": { "acceleration": [{"v": 22.1}], "orientation": [{"v": 61.2}], "position": [{"v": 10.5}], # 新增数据点 "speed": [{"v": 20.5}], "speed_normalized": [{"v": 30.5}] } } jsonstr = json.dumps(data) # 认证token生成函数 def get_token(id, access_key): version = '2018-10-31' res = "products/" + Productid + "/devices/" + DeviceName et = str(int(time.time()) + 36000000) method = 'sha1' key = base64.b64decode(access_key) org = et + '\n' + method + '\n' + res + '\n' + version sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method) sign = base64.b64encode(sign_b.digest()).decode() sign = quote(sign, safe='') res = quote(res, safe='') token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (version, res, et, method, sign) return token # 当客户端收到来自服务器的CONNACK响应时的回调 def on_connect(client, userdata, flags, reason_code, properties): if reason_code.is_failure: print(f"连接失败,错误码:{reason_code}") # 尝试重连 time.sleep(5) client.reconnect() else: print(f"连接成功,返回码:{reason_code}") # 连接成功后就订阅topic client.subscribe(Sub_topic1) client.subscribe(Sub_topic2) # 从服务器接收发布消息时的回调 def on_message(client, userdata, message): print(f"收到服务器反馈:{message.topic} {str(message.payload, 'utf-8')}") # 当消息已经被发送给中间人,on_publish()回调将会被触发 def on_publish(client, userdata, mid): print(f"消息发布成功,消息ID:{mid}") # 当客户端成功订阅主题时的回调 def on_subscribe(client, userdata, mid, reason_code_list, properties): if reason_code_list[0].is_failure: print(f"订阅失败,错误码:{reason_code_list[0]}") else: print(f"订阅成功,QoS:{reason_code_list[0].value}") # 当客户端成功取消订阅主题时的回调 def on_unsubscribe(client, userdata, mid, reason_code_list, properties): if len(reason_code_list) == 0 or not reason_code_list[0].is_failure: print("取消订阅成功") else: print(f"取消订阅失败,错误码:{reason_code_list[0]}") client.disconnect() # 主函数 def main(): # 生成认证token passw = get_token(DeviceName, accesskey) print("生成的token:", passw) # 初始化MQTT客户端 mqttc = mqtt.Client(client_id=DeviceName, protocol=MQTTv311) mqttc.on_connect = on_connect mqttc.on_message = on_message mqttc.on_publish = on_publish mqttc.on_subscribe = on_subscribe mqttc.on_unsubscribe = on_unsubscribe # 设置设备认证信息 mqttc.username_pw_set(username=Productid, password=passw) # 连接到OneNET平台 print("开始连接到服务器") mqttc.connect(ServerUrl, port=ServerPort, keepalive=120) # 启动网络循环 mqttc.loop_start() try: for _ in range(5): # 发送5次数据 # 发布数据到OneNET平台,使用 QoS 0 mqttc.publish(Pub_topic1, jsonstr, qos=0) print("数据发布成功") time.sleep(5) # 每5秒发送一次数据 except KeyboardInterrupt: print("程序被手动终止") finally: print("正在断开连接...") mqttc.disconnect() if __name__ == '__main__': main()其中里面的
# 服务器信息 ServerUrl = "mqtts.heclouds.com" # 服务器URL ServerPort = 1883 # 服务器端口 DeviceName = "sssrgovan" # 设备ID Productid = "dsdsd4sxgl" # 产品ID accesskey = "sdddddddddddddddddddddddddddddd" # 密钥改成自己的,看不懂的看。Python使用MQTT连接新版ONENet_python onenet-CSDN博客
5.遇到的问题:
(1)虚拟机一直连接不成功。
解决方法,把网络连接方法改成桥接模式,
(2)如果操作1让wifi不见了或者网络没了,包括其他情况下ubantu的wifi 或者网络搞没了。
看https://blog.csdn.net/yt09281102/article/details/147784905?spm=1001.2014.3001.5502
(3)一直连接不上ONENET平台,或者说一直无法在线
确认目标服务器的 IP 地址是否正确:
可以尝试通过域名解析来获取 IP 地址,使用
nslookup或ping命令解析域名:
nslookup mqtts.heclouds.com如果出现
meav) tuoni@jiaweisi:~/桌面/gym-duckietown/demo$ nslookup mqtts.heclouds.com Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: mqtts.heclouds.com canonical name = mqtts.heclouds.com.cmegtm.cn. Name: mqtts.heclouds.com.cmegtm.cn Address: 183.230.40.96 Name: mqtts.heclouds.com.cmegtm.cn Address: 218.201.45.2 Name: mqtts.heclouds.com.cmegtm.cn Address: 2409:8060:8ea:601::13:7c64那么说明你的代码里
从nslookup的结果来看,mqtts.heclouds.com的 IP 地址解析结果为多个 IP 地址,包括 IPv4 和 IPv6 地址。这表明该域名可能对应多个服务器节点,用于负载均衡或高可用性配置。
为了确定正确的 IP 地址,你可以尝试以下步骤:
尝试使用其他 IP 地址连接
从nslookup的结果中可以看到多个 IPv4 地址:
183.230.40.96218.201.45.2
你可以尝试使用这些 IP 地址代替之前的183.230.40.39来连接到 OneNET 平台。修改代码中的ServerUrl为其中一个 IP 地址,然后重新运行程序。例如:
ServerUrl = "183.230.40.96"使用域名而非 IP 地址连接
由于mqtts.heclouds.com对应多个 IP 地址,使用域名连接可以让 DNS 解析自动选择可用的服务器节点。修改代码中的ServerUrl为域名:
ServerUrl = "mqtts.heclouds.com"(4)如果在线了,你的数据格式也是对的,就是不出来数据刷新
就把你的
里面的和你的数据名称一样的删除后重新构建,就可以了。不要设置单位。!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
当前记住的就这些,因为在做毕业设计,我现在已经完成了数据传输,大家有问题留言,看到有时间我会回复。
