基于华为云 设备接入IoTDA的数据实时查看

本文介绍了如何使用华为云设备接入IoTDA平台,进行驾驶员疲劳检测项目的实时数据收集和设备管理,包括数据采集、创建华为云产品、设备注册以及使用IoTDeviceSDK进行属性上报和平台交互的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于华为云 设备接入IoTDA的数据实时查看



前言

最近在打比赛,做了一个项目,本人有幸主要负责云端数据部分,在此写一下我的工作流程


一、数据收集

我们做的是驾驶员疲劳检测,此处利用了一个大佬的源代码并做出了一些修改
源代码链接

1 、导入的包和数据定义

在原作者基础上导入了一个包并就“驾驶员疲劳,玩手机,喝水,吸烟”四个状态及进行定义

import csv
#云端数据
fatigue_driving = 0
phone = 0
drink = 0
smoke = 0

2、实时修改数据

修改摄像头类的代码块

# 在函数中引入定义的全局变量
global fatigue_driving,phone,drink,smoke

如果成功检测,添加

#云端数据实时修改
            if "phone" in lab:
                phone = 1
            else:
                phone = 0

            if "drink" in lab:
                drink = 1
            else:
                drink = 0

            if "smoke" in lab:
                smoke = 1
            else:
                smoke = 0

在函数末尾将数据导入预先存好的excle中,filename是你自己的文件名

fatigue_driving1
phone0
drink0
smoke0
# 打开CSV文件
    with open(filename, 'r', newline='') as csvfile:
        # 读取CSV文件内容
        csvreader = csv.reader(csvfile)

        # 转换为列表,方便修改数据
        data = list(csvreader)
    #print(data)
    yunshuju = [fatigue_driving, phone, drink, smoke]
    # 修改每一行第二列的数字
    for k in range(len(yunshuju)):
        # 假设第二列是数字类型
        data[k][1] =yunshuju[k]
    #print(data)
    # 保存修改后的数据回到文件
    with open(filename, 'w', newline='') as csvfile:
        # 创建CSV写入对象
        csvwriter = csv.writer(csvfile)
        # 写入修改后的数据
        csvwriter.writerows(data)

修改之后,就可以实时改变excle中的数据了

二、创建设备

1.进入华为云

华为云
选择产品设备接入IoTDA
在这里插入图片描述

2.创建产品

协议类型MQTT,数据格式JSON,其他随意
在这里插入图片描述

3.定义产品模型

自定义模型
在这里插入图片描述

4.添加属性

添加属性名称,定义他们的性质
在这里插入图片描述
最后效果
在这里插入图片描述

5.注册设备

注册设备,随便填一个设备标识码和密钥,记住他们,其实不记住也行,因为确定之后华为云会生成一个文件DEVICES-KEY.txt,生成之后开始应该是未激活
在这里插入图片描述

三、数据上传代码

1.IoT Device SDK使用指南

IoT Device SDK(Python)提供设备接入华为云IoT物联网平台的Python版本的SDK,提供设备和平台之间通讯能力,以及设备服务、网关服务、OTA等高级服务,并且针对各种场景提供了丰富的demo代码。具体内容可以参考IoT Device SDK(Python)使用指南,我们还需要他里面的包iot_device_sdk_python

2.导入库

from __future__ import absolute_import

from iot_device_sdk_python.client.listener.default_publish_action_listener import DefaultPublishActionListener
from typing import List
import time
import logging
from iot_device_sdk_python.client.client_conf import ClientConf
from iot_device_sdk_python.client.connect_auth_info import ConnectAuthInfo
from iot_device_sdk_python.iot_device import IotDevice
from iot_device_sdk_python.client.listener.property_listener import PropertyListener
from iot_device_sdk_python.client.request.service_property import ServiceProperty
from iot_device_sdk_python.client import iot_result

logging.basicConfig(level=logging.INFO,
                    format="%(asctime)s - %(threadName)s - %(filename)s[%(funcName)s] - %(levelname)s: %(message)s")
logger = logging.getLogger(__name__)

3.创建设备,属性上报

属性上报指的是设备将当前属性值上报给平台。属性设置指的是平台设置设备的属性值
创建设备,并且设置无限循环while True,设置循环时间time.sleep(1)

class cscDetector:
    _logger = logging.getLogger(__name__)

    def __init__(self, server_uri, port, device_id, secret, iot_cert_file):
        self.server_uri = server_uri
        self.port = port
        self.device_id = device_id
        self.secret = secret
        self.iot_cert_file = iot_cert_file

    def start(self):
        """ 创建设备 """
        connect_auth_info = ConnectAuthInfo()
        connect_auth_info.server_uri = self.server_uri
        connect_auth_info.port = self.port
        connect_auth_info.id = self.device_id
        connect_auth_info.secret = self.secret
        connect_auth_info.iot_cert_path = self.iot_cert_file
        connect_auth_info.bs_mode = ConnectAuthInfo.BS_MODE_DIRECT_CONNECT

        client_conf = ClientConf(connect_auth_info)

        device = IotDevice(client_conf)

        device.get_client().set_properties_listener(IICBListener(PropertyListener))

        if device.connect() != 0:
            logger.error("init failed")
            return

        # 10s后上报一次设备的属性
        time.sleep(10)

        # 按照产品模型设置属性
        service_property = ServiceProperty()
        service_property.service_id = "csc"
        service_property.properties = {"fatigue_driving": 0, "phone": 0, "drink": 0, "smoke": 0}
        # 组装成列表的形式
        services = [service_property]

        # 上报设备属性
        device.get_client().report_properties(services)

        while True:
            service_property = ServiceProperty()
            service_property.service_id = "csc"
            data_upload = Upload_data_read(filename)
            print(data_upload)
            service_property.properties = {"fatigue_driving": data_upload.get('fatigue_driving'),
                                           "phone": data_upload.get('phone'),
                                           "drink": data_upload.get('drink'),
                                           "smoke": data_upload.get('smoke')}
            # 组装成列表的形式
            services = [service_property]
            device.get_client().report_properties(services, DefaultPublishActionListener())
            time.sleep(1)

附:数据阅读函数

def Upload_data_read(filename):
    data_file = open(filename, encoding='utf-8')
    data_upload = dict()
    for line in data_file.readlines():
        curLine = line.split(',')
        data_upload[curLine[0]]= int(curLine[1])
    return  data_upload

4.平台设置设备属性

定义类cscListener,两个方法:on_property_set方法处理写属性,on_property_get方法处理读属性。

class cscListener(PropertyListener):
    def __init__(self, iot_device: IotDevice):
        """ 传入一个IotDevice实例 """
        self.device = iot_device

    def on_property_set(self, request_id: str, services: List[ServiceProperty]):
        """
        处理写属性
        :param request_id:  请求id
        :param services:    List<ServiceProperty>
        """

        """ 遍历service """
        for service_property in services:
            logger.info("on_property_set, service_id:" + service_property.service_id)
            """ 遍历属性 """
            for property_name in service_property.properties:
                logger.info("set property name:" + property_name)
                logger.info("set property value:" + str(service_property.properties[property_name]))
        self.device.get_client().respond_properties_set(request_id, iot_result.SUCCESS)

    def on_property_get(self, request_id: str, service_id: str):
        """
        处理读属性。多数场景下,用户可以直接从平台读设备影子,此接口不用实现。
        但如果需要支持从设备实时读属性,则需要实现此接口。
        :param request_id:  请求id
        :param service_id:  服务id,可选
        """
        service_property = ServiceProperty()
        service_property.service_id = "csc"
        data_upload = Upload_data_read(filename)
        service_property.properties = {"fatigue_driving": data_upload.get('fatigue_driving'),
                                       "phone": data_upload.get('phone'),
                                       "drink": data_upload.get('drink'),
                                       "smoke": data_upload.get('smoke')}
        services = [service_property]
        self.device.get_client().respond_properties_get(request_id, services)

5.主函数

根据自己的信息填写

def main():
    server_uri = ""
    port = 8883
    device_id = ""
    secret = ""
    iot_ca_cert_path = "./resources/GlobalSignRSAOVSSLCA2018.crt.pem"

    IICB_detector = IICBDetector(server_uri=server_uri,
                                  port=port,
                                  device_id=device_id,
                                  secret=secret,
                                  iot_cert_file=iot_ca_cert_path)
    IICB_detector.start()

四、效果展示

同时运行两个函数
在这里插入图片描述
云平台端
在这里插入图片描述

总结

呦呵,收获不错

### 华为云 IoTDA 设备未激活解决方案 当遇到华为云 IoTDA 设备未激活的情况时,通常可能是由于以下几个原因引起的:设备标识码错误、密钥不匹配、网络连接异常或者 MQTT 配置不当等问题。以下是针对这些问题的具体排查方法: #### 1. **确认设备标识码和密钥** 确保在设备注册过程中使用的“设备标识码”和“密钥”与平台上配置的一致[^2]。如果这些参数有任何差异,则可能导致设备无法正常激活。 #### 2. **检查网络连通性** 如果设备使用的是 NB-IoT 或其他蜂窝网络方式接入网,请确保其所在区域有良好的信号覆盖,并且 SIM 卡已开通相应的流量套餐和服务权限。对于 Wi-Fi 连接的设备来说,则需验证无线路由器的工作状态及其 IP 地址分配功能是否正常运行。 #### 3. **MQTT协议设置校验** 根据文档说明,华为IoT平台仅支持特定格式的主题名称(即`/data/`用于上传数据; `/command/`接收命令),因此开发者应该严格按照此规定来实现客户端程序中的发布订阅逻辑[^3] 。另外还需注意QoS级别设定以及Clean Session选项的选择可能也会影响会话保持机制从而间接造成离线现象。 #### 4. **日志分析** 利用平台提供的调试工具查看详细的交互记录可以帮助快速定位问题根源。例如观察是否有收到认证失败的消息反馈等信息提示具体哪个环节出了差错以便进一步调整优化相应部分直至成功完成整个流程为止。 ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected successfully.") else: print(f"Bad connection Returned code={rc}") client = mqtt.Client() client.on_connect = on_connect # Replace with your actual endpoint and port number. broker_address = "iot-mqtts.cn-north-4.myhuaweicloud.com" port_number = 8883 username = "<your_device_id>" password = "<your_secret_key>" client.username_pw_set(username=username,password=password) try: client.connect(broker_address,port=port_number) except Exception as e: print(e) client.loop_forever() ``` 上述脚本展示了如何利用 Python 的 Paho 库建立安全 TLS 加密下的 MQTT 客户端实例并尝试连接至指定服务器地址处。记得替换掉占位符变量值为自己账户下真实有效的对应字段内容后再执行测试操作看能否顺利建立起持久化链接关系。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值