设备端[IoT Device SDK]使用实战

举报
神龙居市 发表于 2021/12/12 18:40:27 2021/12/12
【摘要】 华为物联网接入平台IoTDA除了原生接入协议,也提供了各个语言版本的SDK。华为提供的IoT Device SDK,支持TCP/IP协议栈的设备集成IoT Device SDK后,可以直接与物联网平台通信。不支持TCP/IP协议栈的设备,例如蓝牙设备、ZigBee设备等需要利用网关将设备数据转发给物联网平台,此时网关需要事先集成IoT Device SDK。SDK简介:设备接入前,需创建产品...

华为物联网接入平台IoTDA除了原生接入协议,也提供了各个语言版本的SDK。

华为提供的IoT Device SDK,支持TCP/IP协议栈的设备集成IoT Device SDK后,可以直接与物联网平台通信。不支持TCP/IP协议栈的设备,例如蓝牙设备、ZigBee设备等需要利用网关将设备数据转发给物联网平台,此时网关需要事先集成IoT Device SDK。

SDK简介:

  1. 设备接入前,需创建产品(可通过控制台创建或者调用应用侧API接口创建产品)。
  2. 产品创建完毕后,需注册设备(可通过控制台注册单个设备或者使用应用侧API接口注册设备)。
  3. 设备注册完毕后,按照图中流程实现消息/属性上报、接收命令/属性/消息、OTA升级、自定义TOPIC、泛协议接入(相关Demo)等功能。

针对不同类型的终端设备,提供了不同的SDK:

既然用到SDK,就是要更快捷的对接应用,减少自己写代码的工作量,平台提供的也会更稳定,和平台一起升级。

接下来以C#语言为例,进行一次设备代码接入,看看是不是很方便。

通过官网 设备接入 IoT Device SDK介绍 通道可以找到各个版本的SDK入口,但是帮助文档这里没有过多的说明,而是直接导航到github源代码处(和HuaweiCloud.SDK相比,感觉Device SDK代码上还不够成熟,没有上传到nuget上,命名也不太规范)。

SDK目录结构

iot-device-sdk-java:sdk代码

iot-device-demo:普通直连设备的demo代码

iot-gateway-demo:网关设备的demo代码

iot-device-feature-test:调用demo程序的入口工程

iot-tcp-device-test:子设备实例启动工程

引用的第三方类库使用版本

MQTTnet:v3.0.11

MQTTnet.Extensions.ManagedClient:v3.0.11

Newtonsoft.Json:v12.0.3

NLog:v4.7

DotNetty.Codecs:v0.6.0

DotNetty.Transport:v0.6.0

云端产品创建

设备接入-控制台 (huaweicloud.com)添加产品选择MQTT协议,并上传Profile或者自定义产品属性和命令

设备接入地址和端口

以智能门禁为例创建这样的产品

设备接入处,注册新设备,要记录好设备Id和密钥

设备SDK接入工作过程

开发环境:Windows 10 操作系统,Microsoft Visual Studio 2022(官方代码上VS2017版本),.NET Standard 版本:2.0。很好的支持.net core 和.net framework。

源代码的测试调用入口控制台程序默认是.net core2.2版本的。用就用最新的,目前相信用VS的都升级到.net6了,只要切换一下目标版本即可。

在项目解决方案上右键属性菜单,选择目标框架

因为客户端集成SDK是一个MQTT的长连接程序,作为一个程序模块,我这里创建了一个单例模式的Device,方便监听命令和随时上报消息。

所有的链接逻辑,上报消息体和命令格式,SDK都做了封装,只要继承相应的接口,就可以直接等待接收命令消息。

SDK提供了一个IoTDevice对象作为设备端操作对象,DeviceClient是一个实际客户端。

创建一个类RecycleDevice客户端,其中定义了 DeviceClient对象,集成了若干Listener,用来监听事件和命令

 public class RecycleDevice : CommandListener, 
        MessagePublishListener, 
        ConnectListener, 
        DeviceMessageListener, 
        CommandV3Listener,
        DeviceShadowListener, 
        RawMessageListener
    {
       。。。。

举例其中2个Listener

命令下发CommandListener

在对象类上集成这个接口CommandListener,并实现接口,同时IoTClient进行监听。OnCmmand需要Report消息状态,平台才知道发送成功,否则20s后认为失败。

private bool Connect(string serverUri, int port, string deviceId, string deviceSecret)
 {
            // 创建设备
            IoTDevice device = new IoTDevice(serverUri, port, deviceId, deviceSecret);

            if (device.Init() != 0)
            {
                return false;
            }
            _IoTClient = device.GetClient();

            _IoTClient.messagePublishListener = this;
            _IoTClient.commandListener = this;

            return true;
 }

public void OnCommand(string requestId, string serviceId, string commandName, Dictionary<string, object> paras)
 {
            Console.WriteLine($"OnCommand:{commandName}");
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("result", "success");

            // 发送命令响应
            _IoTClient.Report(new PubMessage(requestId, new CommandRsp(0, dic)));
 }

属性上报Report

public void ReportPropes()
 {
            Dictionary<string, object> json = new Dictionary<string, object>();

            // 按照物模型设置属性
            json["lock_state"] = "ON";
            json["body_state"] = 0;

            ServiceProperty serviceProperty = new ServiceProperty();
            serviceProperty.properties = json;
            serviceProperty.serviceId = "sensor"; // serviceId要和物模型一致

            List<ServiceProperty> properties = new List<ServiceProperty>();
            properties.Add(serviceProperty);
            _IoTClient.Report(new PubMessage(properties));

}

运行代码,在Test工程中添加新代码

class Program
    {
        private static ManualResetEvent mre = new ManualResetEvent(false);

        static void Main(string[] args)
        {
            RecycleDevice.IoTClient.Init(); 
            RecycleDevice.IoTClient.ReportPropes();
            mre.WaitOne();
     }
}

打开设备看到在线,并且有信息上传了

发一个命令看看

控制台打印出上报消息和命令交互,怎么样是不是很简单?

附件是一个样例代码,完整的但内容很短。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。