在上一章,格力空調溫度 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();
// 設置要訂閱的Topic、運行接收內容的Topic
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 種設置了多個默認的事件方法,
它會輸出收到的消息內容(message)等信息,你可以自定義方法來處理。
將 字符串格式化後:
{
"method": "thing.service.property.set",
"id": "666237842",
"params": {
"gree_temperature": 20
},
"version": "1.0.0"
}
但是目前只能收到服務器下發的命令,還沒有寫如何處理這些命令的方法,這需要你編寫相應的方法綁定到委託事件中。
當收到屬性消息時,會觸發這些方法。如何設置,請參考後面的章節。
3)做出響應
當你收到服務器下發的指令時,你可以對這條 Topic 做出響應。
// 返回消息ID
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>(TModel model, [bool isToLower = True])
實際上,不需要做出響應。。。如果有需要的話,可以自定義方法,在方法裏面加上響應,綁定到委託裏,自動響應。
如何設置,請參考後面的章節。