虚拟机Ubantu连接ONENET平台上传数据与错误问题汇总

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

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平台,或者说一直无法在线

  1. 确认目标服务器的 IP 地址是否正确

  2. 可以尝试通过域名解析来获取 IP 地址,使用 nslookupping 命令解析域名:

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.96

  • 218.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)如果在线了,你的数据格式也是对的,就是不出来数据刷新

就把你的

里面的和你的数据名称一样的删除后重新构建,就可以了。不要设置单位。!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

当前记住的就这些,因为在做毕业设计,我现在已经完成了数据传输,大家有问题留言,看到有时间我会回复。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值