在上一篇文章中,我们为“格力空调温度”(gree_temperature)这个物联网设备属性配置了“读写”权限。之所以这样设置,是因为空调的目标输出温度可以通过遥控器直接设定——服务器既能读取当前设定值,也能下发新的温度指令。而CPU温度这类实时采集的传感器数据,设置为“只读”即可满足需求。
所谓“读写权限”,简单来说就是允许服务器主动向设备发送指令,修改设备属性的当前值。
需要特别说明的是,属性权限只包含“读”和“读/写”两种模式,不存在单独的“写”权限选项。

1)允许服务器设置设备属性
物联网通信的核心本质,其实就是“订阅/推送”这套消息机制——数据上行与下行。无论是属性上报、事件通知还是服务调用,最终都是通过特定的Topic进行传递。
CZGL.AliIoTClient对这部分逻辑进行了细粒度封装,提供了大量可配置参数,让开发者的使用体验更加灵活便捷。在第3章中我们已经介绍过如何开启取消响应等高级功能,这里不再重复展开。
先看一段基础初始化代码,后续所有说明都将基于此示例(请务必修改DeviceOptions中的设备信息):
static AliIoTClientJson client;
static void Main(string[] args)
{
// 创建客户端实例
client = new AliIoTClientJson(new DeviceOptions
{
ProductKey = "a1A6VVt72pD",
DeviceName = "json",
DeviceSecret = "7QrjTptQYCdepjbQvSoqkuygic2051zM",
RegionId = "cn-shanghai"
});
client.OpenPropertyDownPost(); // 允许服务器下发属性设置指令
string[] topics = new string[] { client.CombineHeadTopic("get") };
client.UseDefaultEventHandler();
client.ConnectIoT(topics, null, 60);
Console.ReadKey();
}
在Console.ReadKey()之前添加一行代码,使客户端能够接收来自云端服务器的属性设置命令:
client.OpenPropertyDownPost();
然后运行程序,一切准备就绪。
2)下发命令
接下来进入阿里云物联网控制台进行操作。打开“在线调试”页面,选择之前创建的产品和设备。
也可以直接访问该链接:https://iot.console.aliyun.com/lk/monitor/debug
具体配置如下:
- 调试设备:选择“调试真实设备”
- 功能:选择“格力空调温度(gree_temperature)”
- 方法:选择“设置”
将输入框中的数值修改为20.0,然后点击“发送指令”:
{"gree_temperature": 20}
此时控制台程序会接收到指令,输出内容大致如下:
get topic message,
Date: 16:52:55
topic: /sys/a1A6VVt72pD/json/thing/service/property/set
get messgae :
{"method":"thing.service.property.set","id":"666237842","params":{"gree_temperature":20},"version":"1.0.0"}
实际上,服务器下发的原始Alink JSON消息就是:
{"method":"thing.service.property.set","id":"666237842","params":{"gree_temperature":20},"version":"1.0.0"}
你可能会注意到,上面的输出中包含了额外信息。这是因为CZGL.AliIoTClient默认绑定了事件处理方法,会自动输出收到的原始消息及其他调试信息。你可以根据实际需求编写自定义事件处理器来替换默认逻辑。
将消息格式化后,结构更加清晰:
{
"method": "thing.service.property.set",
"id": "666237842",
"params": {
"gree_temperature": 20
},
"version": "1.0.0"
}
至此,设备已经具备接收服务器下发的属性设置命令的能力。那么收到命令后该如何处理呢?这就需要你编写具体的方法,并将其绑定到相应的委托事件上。当thing.service.property.set这类属性消息到达时,绑定的方法会被自动触发。关于如何绑定事件的详细操作,我们将在后续章节中逐一说明。
3)做出响应
当设备收到服务器下发的指令后,你可以选择对这条Topic进行响应。相关的API签名如下:
public int Thing_Property_set(CZGL.AliIoTClient.PropertyDownModel model, [bool isToLower = True])
public int Thing_Property_set(CZGL.AliIoTClient.PropertyDownModel model, [bool isToLower = True], [System.Text.Encoding encoding = null])
public int Thing_Property_set(TModel model, [bool isToLower = True])
不过在实际生产场景中,大多数情况下并不需要主动响应。如果你确实有响应需求,完全可以通过自定义方法实现——在方法逻辑中加入响应动作,然后将该方法绑定到委托上,系统便会自动执行响应流程。具体配置方法,请参考后续章节的详细介绍。
