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

网友投稿 1092 2022-05-30

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

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

SDK简介:

设备接入前,需创建产品(可通过控制台创建或者调用应用侧API接口创建产品)。

产品创建完毕后,需注册设备(可通过控制台注册单个设备或者使用应用侧API接口注册设备)。

设备注册完毕后,按照图中流程实现消息/属性上报、接收命令/属性/消息、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或者自定义产品属性和命令

设备接入地址和端口

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

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

设备接入处,注册新设备,要记录好设备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 paras) { Console.WriteLine($"OnCommand:{commandName}"); Dictionary dic = new Dictionary(); dic.Add("result", "success"); // 发送命令响应 _IoTClient.Report(new PubMessage(requestId, new CommandRsp(0, dic))); }

属性上报Report

public void ReportPropes() { Dictionary json = new Dictionary(); // 按照物模型设置属性 json["lock_state"] = "ON"; json["body_state"] = 0; ServiceProperty serviceProperty = new ServiceProperty(); serviceProperty.properties = json; serviceProperty.serviceId = "sensor"; // serviceId要和物模型一致 List properties = new List(); 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(); } }

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

发一个命令看看

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

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

附件: RecycleDevice.rar 1.46KB 下载次数:1次

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring Boot RabbitMQ - 交换器
下一篇:“互联网+”大赛之AI创新应用赛题攻略:大胆脑洞,共绘智慧生活蓝图
相关文章