为设备提供了,每个设备的都存储在里, 客户可以通过它的或者来管理, 但是里没有存储设备的状态信息,例如设备上配置数据,运行时状态数据,提供另外一个概念来记录这部分数据:。
什么是
是存储在服务端的一份文档,每一个设备对应一份文档,该文档随着创建而创建,随着被删除而删除, 通过该文件记录设备的状态信息,为了应用编程的需要,将这部分数据分为三个部分:
: 文档里有一部分用于定义, 用户可以定义各种自定义的数据,例如设备的位置,设备版本号,设备驱动信息等等。
: 期望属性,这部分属性值,顾名思义,用于定义希望设备设定的某些值,例如设备风扇的转速,某些硬件开关的设置值等等。
: 上报属性,这部分属性值是由于设备端根据设备的情况上报给并存储在中。
很多时候和搭配使用,当然这不是必须的。
和的设计概念一摸一样,我们就不另外介绍了。
下面我们来看一个的实际例子:
{
"deviceId": "devA",
"etag": "AAAAAAAAAAc=",
"status": "enabled",
"statusReason": "provisioned",
"statusUpdateTime": "0001-01-01T00:00:00",
"connectionState": "connected",
"lastActivityTime": "2015-02-30T16:24:48.789Z",
"cloudToDeviceMessageCount": 0,
"authenticationType": "sas",
"x509Thumbprint": {
"primaryThumbprint": null,
"secondaryThumbprint": null
},
"version": 2,
"tags": {
"deploymentLocation": {
"building": "43",
"floor": "1"
}
},
"properties": {
"desired": {
"telemetryConfig": {
"sendFrequency": "5m"
},
"$metadata" : {...},
"$version": 1
},
"reported": {
"telemetryConfig": {
"sendFrequency": "5m",
"status": "success"
},
"batteryLevel": 55,
"$metadata" : {...},
"$version": 4
}
}
}
以上就是一个的详细情况,从到开头处的数据是属于的数据,并不是的数据,需要注意这一点。只有: 2之后的数据才是数据,如上图所示,主要包括:, 以及。
应用如何使用
在的解决方案中,我们主要会将应用分为设备应用以及后端应用,我们来看一下提供了哪些功能方便用户开发应用。
设备应用
设备应用可以对进行如下的操作:
读/写 : 设备应用可以根据自身的情况利用上报属性从而保持必须要的状态配置。
根据设备取回的数据,建议设备应用每次在连接建立完成之后第一件事就是抓取的所有数据,然后根据其中的初始化设备参数。
监控的值变化:根据预期属性的值变化,动态的更改设备对应的配置,更改成功后,通过上报属性上报状态。
后端应用
后端应用可以对进行如下的操作:
根据设备取回数据。
读写
读写值
读取值
监控值更改。
其他相关
除了我们上面介绍的基本信息,还有一些其他的特点:
和属性的键值定义都是格式的,而且区分大小写的。键值长度不会超过1kb.
每个属性或者的值只能包括如下的类型:
`number
每个值最大不能超过32KB。
同步更新问题
当我们开发设备应用或者后端应用时,有一点需要提出来的是,当同时有多个线程或者进程更新文档时,我们需要用户在自己的代码中实现乐观同步锁,防止应用同时更新某一个值。
为了实现乐观同步锁,用户可以参考两个值:一个是中的值,这个值对于应用是只读的,并且该值由保持原子操作,另外一个值是每一个值都有一个的元数据,这个值也是保证它是一直增长的,如果要实现乐观锁,可以考虑参考该值。
后面我们会继续学习如何在设备应用和后端应用中实现我们这里讨论和相关的操作。
领取专属 10元无门槛券
私享最新 技术干货