阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性

设备自身 CPU 温度、电源输入电压、内存使用率等,以及接入到设备的传感器如温度传感器、光敏传感器等,这些硬件的数据输出即是 属性 。
设备将这些硬件的数据上传到阿里云物联网平台,实时显示这些设备的状态和实测数据,这个过程是 上传设备属性 。


1)定义物模型

在阿里云物联网控制台,点击 产品 -> 功能定义 -> 添加自定义功能
填入一下内容:

再定义一个属性:

功能类型:属性  
功能名称: 格力空调温度
标识符: gree_temperature
数据类型: float (单精度浮点型)
取值范围:0-35
步长: 0.1
单位: 摄氏度 / °C
读写类型:读写

注意的是,表示符是区分大小写的,相当于 C# 中的变量,笔者这里建议统一使用小写,具体原因后面说明。
注意:读写类型,一个只读、一个读写。


2)编写模型

前面说过, Alink json 是阿里云定义具有一定格式的 Json ,
因此这些属性数据是以 Json 形式上传。在 C# 中,可以通过 类 快速生成 Json 。

参数类型说明
idstring消息ID号,在这个设备的生涯中,ID应当是唯一的。可以使用时间戳或guid
versionstring协议版本号,目前协议版本号为1.0。固定 "1.0" 即可
paramsObject属性数据,里面包含多个属性对象,每个属性对象包含上报时间(time)和上报的值(value)。
timelong属性上报时间。
valueobject上报的属性值。
methodstring固定取值 thing.event.property.post

那么,我们要编写一个类,存储信息,然后转为 Alink json 上传到阿里云物联网服务器。在编写这个模型前,预览要生成的 Alink json :

{
"id": "123456789",
"version": "1.0",
"params": {
"cpu_temperature": {
"value": 58.6,
"time": 1524448722000
},
"gree_temperature": {
"value": 26.6,
"time": 1524448722000
}
},
"method": "thing.event.property.post"
}

我们只需关注 params 部分的编写即可。

在控制台程序中,新建一个类 TestModel

   public class TestModel
{
public string id { get { return DateTime.Now.Ticks.ToString(); } set { } }
public string version { get { return "1.0"; } set { } }
public Params @params { get; set; }
public class Params
{

这样定义后,我们使用时,只需定义 params 部分即可, id、version等,不需要自己动态取值,做重复劳动。
上面有个 @params ,这是因为 params 是 C# 的关键字,命名字段时为了取消冲突所以加个 @

根据我们在阿里云物联网控制台定义的 属性 ,继续补充内容:

   public class TestModel
{
public string id { get { return DateTime.Now.Ticks.ToString(); } set { } }
public string version { get { return "1.0"; } set { } }
public Params @params { get; set; }
public class Params
{
public Cpu_temperature cpu_temperature { get; set; }
public Gree_temperature gree_temperature { get; set; }
public class Cpu_temperature
{
public float value{ get; set; }
public long time { get; set; }
}
public class Gree_temperature
{
public float value { get; set; }
public long time { get; set; }
}

}
public string @method { get { return "thing.event.property.post"; } set { } }
}

问题是,这样写还不行,因为还没有给 TestModel 里的类进行实例化。
我们可以利用 构造函数 对里面的引用类型进行实例化,当然亦可编写依赖注入容器。。

   public class TestModel
{
public string id { get { return DateTime.Now.Ticks.ToString(); } set { } }
public string version { get { return "1.0"; } set { } }
public Params @params { get; set; }

public TestModel()
{
@params = new Params();
}
public class Params
{
public Cpu_temperature cpu_temperature { get; set; }
public Gree_temperature gree_temperature { get; set; }

public Params()
{
cpu_temperature = new Cpu_temperature();
gree_temperature = new Gree_temperature();
}
public class Cpu_temperature
{
public float value{ get; set; }
public long time { get; set; }
}
public class Gree_temperature
{
public float value { get; set; }
public long time { get; set; }
}

}
public string method { get { return "thing.event.property.post"; } set { } }
}

3)上传设备属性数据

编写控制台程序,引入 CZGL.AliIoTClient ,编写基础代码(请替换 DeviceOptions 的信息):

        static AliIoTClientJson client;
static void Main(string[] args)
{

再 Program 类中,编写一个方法用来收集属性数据、上传属性数据:

        public static void ToServer()
{

启动控制台应用,在阿里云物联网控制台,打开设备,点击 运行状态 ,即可看到上传的属性数据。 文章后面会详细说明 CZGL.AliIoTClient 关于属性上传的具体情况。

当然,这样的数据只是固定赋值的,这里只是演示,具体数据需要开发者采集。下面给出一些模拟数据的方法。


4)模拟数据

笔者编写了三个数据模拟方法:
不需要理会里面是怎么写的,仅是个模拟数据的工具而已,你也可以自己编写相应的模拟数据方法。 里面有四个参数,对应:原始值、最小值、最大值、波动范围。

640?wx_fmt=png

640?wx_fmt=png


int 模拟数据
range 是指每次生成 [0,range] 范围的增/减量,
例如 初始值 56 , range = 2 ,那么可能 56±0 或 56±1 或 56±2 , 是增还是减,是随机的。但是设置 min 、 max 后,最后生成的值会在此范围内波动。

float、double 模拟数据
对应 float、double,range 的值越大,波动范围越小。默认 range = 8,大概就是每次 0.1 的波动范围。
其中,float 小数保留两位, double 小数保留 4 位,
需要更高或减少小数位数,修改一下 ...ToString("#0.0000")

模拟属性数据
接下来我们模拟一下两个属性的数据。

在 Program 中定义两个变量存储 cpu 和 空调 数据。

        static float cpu_temperature = 50.0F;
static float gree_temperature = 26.0F;

修改 ToServer() 方法

        public static void ToServer()
{

在 Main() 方法里增加代码:

 // 定时上传数据

while (true){   ToServer();

Thread.Sleep(1000);
}

}

至此,已经基本完成。

完整代码如下:

    class Program
{
static AliIoTClientJson client;
static void Main(string[] args)
{

运行控制台程序,然后打开阿里云物联网控制台,查看设备的运行状态,打开 自动刷新 ,查看数据变化。

如果你觉得每次波动得范围太大,可以把 range 改大一些,如果你觉得数据不稳定,
可以把 min - max 的范围改小一些,模拟的数据值将在此范围波动。


5)设备属性 - CZGL.AliIoTClient

首先要说明,产品创建前,需要设置为 Alinkjson/透传 产品,
因此 CZGL.AliIoTClient 设置了两个客户端类。

类名说明
AliIoTClientJson以Alink json形式上传数据
AliIoTClientBinary以透传形式上传数据

这两个类,仅在 属性、事件、服务 三个功能中数据上传形式有差别,连接服务器、普通Topic等其它数据的使用是完全一致的。
一个产品只能定义一种上传数据的形式。

CZGL.AliIoTClient 中上传属性的方法(Alink json):

获取 UNIX 时间: 由于阿里云要求上传的属性数据等,要带上 Unix 时间,所以笔者一并写在 CZGL.AliIoTClient 了。

public static long GetUnixTime()

使用示例参考上面的过程。

透传
如果你想使用透传,则使用 AliIoTClientBinary 类,


6)关于透传

透传以二进制报文形式上传,例如 0x020000007b00 ,这里是 16 进制,每两位一个字节。
如果是 2进制 ,则是 8位 一个字节。

透传需要在阿里云物联网控制台创建 透传 产品后,设置脚本,将透传数据 转为 Alink json。
透传数据是自定义的,以字节为单位,其中有5个字节为特定字节,以字节位进行拆分的。

记住,是以字节为单位。

透传数据格式标准:

字段字节数
帧类型1字节
请求ID4字节
属性数据N个字节

帧类型:

值(16进制)说明
0x00属性上报
0x01属性设置
0x02上报数据返回结果
0x03属性设置设备返回结果
0xff未知的命令

**举例说明 **

很多人是直接把 10进制 或 16进制 直接转换成 2进制 。
例如 0x020000007b00,转为 2进制 :100000000000000000000000000111101100000000。 但是这样是错误的。

以上面 cpu 和 空调温度 举例,要上传属性数据,帧类型为 0x00。

属性10进制16进制2进制划一下2进制
cpu_temperature56380011100000 11 10 00
gree_temperature261a0001101000 01 10 10

应当这样拆分和设置值:

字节类转字节数16进制2进制
进制表示0x
帧类型1字节0000000000
ID4字节00 00 00 7b00000000 00000000 00000000 01111011
cpu_temperature1 字节3800111000
gree_temperature1 字节1a00011010

16进制数据:
0x000000007b381a

2进制数据:
00000000000000000000000000000000011110110011100000011010

将 16进制 或 2进制 的数据存储到 byte[] 变量中,切记要强制转换。 存储时,一个 byte 为一个字节,M个字节,则 byte[M]。

存储:
使用 16进制 存储透传数据,2进制弄不来的。 
有些同学非要用 2进制 存储,反正我是弄不来,用 二进制 数值 存储,这个触发我的知识盲区了。

示例(仅对 AliIoTClientBinary 客户端有效):

            // 存储透传数据
byte[] b = new byte[7];
b[0] = 0x00

如果上报属性,要求 请输入二进制数据Base64编码后的字符串,可以使用

            byte[] b = new byte[7];
b[0] = 0x00

透传数据的坑很多,这里 CZGL.AliIoTClient 只提供如何处理数据和上传数据,云端的脚本解析请参考
https://help.aliyun.com/document_detail/114621.html?spm=a2c4g.11186623.2.13.209b65b9Q9z0Nx#concept-185365


7)后续说明

其实,每次上传服务器都会作出响应,CZGL.AliIoTClient 默认不接收这些响应信息。
你可以使用 OpenPropertyPostReply() 接收设备属性上传后服务器的响应,应当在连接服务器前使用此方法
使用 Close.PropertyPostReply() 取消接收设备属性上传后服务器的响应。

示例:

            client.ClosePropertyPostReply();            // 连接服务器
           client.ConnectIoT(topics, null, 60);

上传属性数据,可以分开上传,不需要每次都要上传全部的属性。需要更新哪个属性,就上传这个属性。

640?wx_fmt=jpeg

原文地址:https://www.cnblogs.com/whuanle/p/10994694.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker最全教程之MySQL容器化 (二十五)

前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过此块,本篇仅从笔者角度进行总结和编写。目录 镜像说明 运行MySQL容器镜像 1.运行MySQL容器 2.修改“root”账户的认证模式和密码 管理MySQL 1. MySQL命…

Ocelot(五)- 流量限制、服务质量

作者:markjiang7m2原文地址:https://www.cnblogs.com/markjiang7m2/p/10965300.html源码地址:https://gitee.com/Sevenm2/OcelotDemo本文是我关于Ocelot系列文章的第五篇,流量限制、服务质量。Ocelot允许针对具体的服务接口进行流…

java中静态修饰符(static)的使用

static-静态 修饰属性 静态属性,也称为静态变量 类变量等 static 数据类型 属性名; 使用 静态内容独立存放在方法区 静态内容在内存中只有一份,被该类所有对象共享 普通属性所有对象在对象内容中都有一份 可以通过类名.静态属性名的方式直接访问静态属性 静态属性封装之…

Ocelot(三)- 服务发现

作者:markjiang7m2原文地址:https://www.cnblogs.com/markjiang7m2/p/10907856.html源码地址:https://gitee.com/Sevenm2/OcelotDemo本文是我关于Ocelot系列文章的第三篇,主要是给大家介绍Ocelot的另一功能。与其说是给大家介绍&a…

P3527 [POI2011]MET-Meteors 整体二分 + 树状数组

洛谷 题意&#xff1a; 思路&#xff1a; 考虑整体二分前&#xff0c;一定要思考一下直接二分怎么做。显然对每个城市&#xff0c;当<pos<pos<pos的时候收集不够足够的陨石&#xff0c;>pos>pos>pos的时候能收集足够多陨石&#xff0c;这个时候pospospos即…

Ocelot(二)- 请求聚合与负载均衡

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/10865511.html源码地址&#xff1a;https://gitee.com/Sevenm2/OcelotDemo在上一篇Ocelot的文章中&#xff0c;我已经给大家介绍了何为Ocelot以及如何简单使用它的路由功能&#xff0…

「分布式系统理论」系列专题

如今互联网已经成为整个社会的基础设施&#xff0c;分布式系统并不是少数大公司的专属&#xff0c;所以分布式系统理论可能是你迟早需要掌握的知识。如果你是程序员&#xff0c;相信这些文章你肯定能看懂&#xff1b;如果你不是程序员&#xff0c;相信这些能使你能更懂程序员&a…

SQL Server 2012如何打开2016的profiler文件

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/10980191.html背景在上星期&#xff0c;公司负责support的同事接到反馈说某个项目生产环境上的某个页面加载很慢&#xff0c;一般遇到这种问题&#xff0c;我们的support同事都会先上…

Codeforces Round #655 (Div. 2) E. Omkar and Last Floor 区间dp + 巧妙的状态设计

传送门 题意&#xff1a; 思路&#xff1a; 按照贪心的思路来考虑的话&#xff0c;显然是每一列111的个数越多越好&#xff0c;所以我们能放到一列就放到一列。设f[l][r]f[l][r]f[l][r]为在[l,r][l,r][l,r]内&#xff0c;区间全部都在里面的贡献。显然这个贡献就是全部落在[l…

AKS使用Azure File实现动态持久化存储

本文作者|搪瓷小娃娃本文来源|搪瓷小娃娃博客园如我们所知&#xff0c;Kubernetes通过 Volume 为集群中的容器提供存储&#xff0c;通过Persistent Volume 和 Persistent Volume Claim实现Volume 的静态供给和动态供给。Azure File和Azure Disk 也在Kubernetes 支持的动态供给 …

ASP.NET Core 应用程序状态

在ASP.NET Core中&#xff0c;由多种途径可以对应用程序状态进行管理&#xff0c;使用哪种途径&#xff0c;由检索状态的时机和方式决定。应用程序状态指的是用于描述当前状况的任意数据。包括全局和用户特有的数据。开发人员可以根据不同的因素来选择不同的方式存储状态数据&a…

Asp.net core使用MediatR进程内发布/订阅

1、背景最近&#xff0c;一个工作了一个月的同事离职了&#xff0c;所做的东西怼了过来。一看代码&#xff0c;惨不忍睹&#xff0c;一个方法六七百行&#xff0c;啥也不说了吧&#xff0c;实在没法儿说。介绍下业务场景吧&#xff0c;一个公共操作A&#xff0c;业务中各个地方…

[开源] FreeSql.Tools Razor 生成器

FreeSql 经过半年的开发和坚持维护&#xff0c;在 0.6.x 版本中完成了几大重要事件&#xff1a;1、按小包拆分&#xff0c;每个数据库实现为单独 dll&#xff1b;2、实现 .net framework 4.5 支持&#xff1b;3、同时支持 MySql.Data、MySqlConnector 的实现&#xff1b;4、自定…

WebAssembly和Blazor:解决了一个存在十年的老问题

本文要点WebAssembly 是一种新的客户端技术&#xff0c;可以在所有现代浏览器&#xff08;包括移动浏览器&#xff09;中实现近乎原生的性能&#xff0c;而且不需要插件。许多语言&#xff0c;包括 C、C#、Go 和 Rust&#xff0c;都可以编译成面向基于栈的 WebAssembly 虚拟机的…

《电商后台系统产品逻辑解析》学习笔记

文是我阅读《电商产品经理宝典&#xff1a;电商后台系统产品逻辑全解析》一书的学习笔记&#xff0c;为后续我司做家居电商后台系统储备相关领域的业务知识。一、支撑线后台概览“前端用户的一小步&#xff0c;后台系统的一大步”&#xff0c;平时常见的功能如购物车、优惠券等…

P3403 跳楼机 同余最短路

传送门 题意&#xff1a; 思路&#xff1a; 转换一下题目就是用若干x,y,zx,y,zx,y,z能凑出来多少个<h<h<h的数。先考虑两个数y,zy,zy,z的情况&#xff0c;我们如果能求出来这两个数能凑出来的数设为sumsumsum&#xff0c;让后sumkx<hsumkx<hsumkx<h求出来…

NopCommerce 4.2的安装与运行

、关于NopCommerceNopCommerce是国外ASP.Net领域一个高质量的B2C开源电商项目&#xff0c;最新版本4.2基于ASP.NET Core MVC 2.2和EF Core 2.2开发&#xff0c;其强大的功能特性和插件机制使其成为了.NET领域开源电商项目的标杆。当然&#xff0c;还有一些其他的开源电商项目如…

P1527 [国家集训队]矩阵乘法 整体二分 + 二维树状数组

传送门 题意&#xff1a; 思路&#xff1a; 算是个整体二分的板子啦&#xff0c;不过这个是二维的矩阵&#xff0c;我们只需要把一位树状数组改成二维的&#xff0c;让后动态维护单点加&#xff0c;区间查询前缀和即可。 //#pragma GCC optimize(2) #include<cstdio>…

应用性能问题解决实际案例

某项目在上线前的APT&#xff08;Application Performance Testing应用程序性能测试&#xff09;过程中发现性能问题&#xff0c;性能测试结果影响是否上线&#xff0c;紧急求助外部项目组技术专家。因分属不同项目&#xff0c;只能通过项目组提供的信息进行分析。第一轮评审现…

Worker Service in ASP .NET Core

介绍提到 ASP.NET Core&#xff0c;我们多半会想到 ASP.NET MVC、ASP.NET Web API、Razor page 及 Blazor。随着 .NET Core 3.0 的推出&#xff0c;今天会介绍一个全新推出的功能&#xff1a;Work Service 。我们可以在 Visual Studio 2019 中通过预定的项目模版快速创建一个 W…