阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
文檔目錄:
- 說明
- 1. 連接阿里云物聯網
- 2. IoT 客戶端
- 3. 訂閱Topic與響應Topic
- 4. 設備上報屬性
- 4.1 上報位置信息
- 5. 設置設備屬性
- 6. 設備事件上報
- 7. 服務調用
- 8. 委托事件
- 9. 自定義委托事件方法
?
預先在設備編寫好相應的代碼,這些代碼能夠處理一個或多個任務,即為?服務?,一個服務包含一個或多個任務。
CZGL.AliIoTClient 中,服務器下發服務調用指令不需要設置,默認服務器可以直接下發命令而不需要經過客戶端同意。
雖然客戶端能夠直接接收服務器的服務調用指令,但是必須要設置相應的方法綁定到委托中,方能處理指令。
下面會舉例說明如何使用服務調用:
- 設備定義一個服務,這個服務是定時爆炸。
- 當收到服務器下發的爆炸命令和定時爆炸時間,就會開始任務
- 爆炸后,返回爆炸結果
- 服務器下發命令給設備,讓它爆炸
- 服務器不管設備怎么爆炸,也不等你爆炸
- 設備爆炸完了,去告訴服務器設備以及完成爆炸
1)設置服務調用
打開阿里云物聯網控制臺,點擊自定義功能,按以下定義。
服務定義:
輸入參數:
輸出參數:
2)定義服務說明
定義的服務,有輸入參數、輸出參數,是指服務器向設備下發命令調用服務,這個服務需要的輸入參數、調用這個服務后返回的參數。
這個是相對設備來說的,服務器調用設備的服務,給設備傳入數據(輸入參數),然后設備處理完畢,返回結果(輸出參數)。
里面有異步、同步方法,使用異步方法,服務器不需要等待設備響應結果,可以直接返回。
同步方法,服務器必須等待響應結果,一直沒有獲得結果則會超時報錯。
使用的基礎測試代碼如下(請替換 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、運行接收內容的Topicstring[] topics = new string[] { client.CombineHeadTopic("get") };// 使用默認事件client.UseDefaultEventHandler();// 連接服務器client.ConnectIoT(topics, null, 60);Console.ReadKey();}
運行控制臺程序,打開阿里云物聯網控制臺,在線調試,找到服務,選擇?機器自動爆炸
在輸入框輸入以下內容:
{"timee":10
}
點擊發送,再查看控制臺輸出。
{"method":"thing.service.bom","id":"670534570","params":{"timee":10},"version":"1.0.0"}
根據定義和要求,實際上收到服務調用命令后,需要進行處理并且返回響應結果。
3)編寫接收模型和響應模型
收到的消息是 Alink json ,你可以通過 CZGL.AliIoTClient 轉換成相應的對象。
同樣,也需要將相應的對象轉成 Alink json 上傳到服務器中,作為響應。
編寫接收模型: 里面只有一個很簡單的參數 timee ,這個就是在控制臺定義的 傳入參數。
public class Bom{public string method { get { return "thing.service.bom"; } set { } }public string id { get; set; }public string version { get { return "1.0.0"; } set { } }public Params @params { get; set; }public class Params{public int timee { get; set; }}public Bom(){@params = new Params();}}
編寫響應模型:
public class ReBom{public string id { get; set; }public int code { get; set; }public Data data { get; set; }public class Data{public int isbom { get; set; }}public ReBom(){data = new Data();}}
4)定義委托方法
CZGL.AliIoTClient 中,有個 PubServiceEventHandler 委托,當收到服務器的服務調用命令時,這個委托就會觸發響應的事件。
所以,我們編寫一個處理命令的方法,另外自定義一個委托方法。
服務調用方法:
/// <summary>/// 服務調用方法/// </summary>/// <param name="timee"></param>/// <returns></returns>public static bool BomServer(int timee){Console.WriteLine($"我將在 {timee} 秒后爆炸");/** 其它代碼 **/// 返回處理結果,已經爆炸return true;}
編寫委托方法: 當收到服務調用命令時,應當如何處理。
/// <summary>/// 收到服務調用/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public static void Service_Bom_EventHandler(object sender, MqttMsgPublishEventArgs e){// handle message receivedstring topic = e.Topic;string message = Encoding.ASCII.GetString(e.Message);if (topic.Contains("bom")){// 將收到的服務調用數據轉為對象var model = client.Thing_Service_JsonToObject<Bom>(message);// 獲取里面的timee參數,將這個參數傳入給方法進行處理var re = BomServer(model.@params.timee);// 設置要返回的信息var reModel = new ReBom(){code = 200,id = model.id};reModel.data.isbom = 1;// 對服務器做出響應,返回處理結果client.Thing_Service_Identifier_Reply<ReBom>(reModel, "bom", false);}}
如果你有多個服務,那么在上面給出的示例方法?Service_Bom_EventHandler?中,加個判斷即可。 總之,這些是自定義的,靈活性很高,CZGL.AliIoTClient 負責將你的數據處理以及進行上傳下達,但是如何處理指令,需要你編寫相應的處理方法。
5)綁定到委托中
在連接服務器前,綁定到委托中
client.PubServiceEventHandler += Service_Bom_EventHandler;// 連接服務器client.ConnectIoT(topics, null, 60);
就這么一句代碼而已。
當然, CZGL.AliIoTClient 默認有一些方法,在收到服務器消息時觸發,這些不會影響到你的委托方法。
如果你不需要,去除即可。
// 使用默認事件// client.UseDefaultEventHandler();client.PubServiceEventHandler += Service_Bom_EventHandler;// 連接服務器client.ConnectIoT(topics, null, 60);
至此,完整的代碼如下:
class Program{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、運行接收內容的Topicstring[] topics = new string[] { client.CombineHeadTopic("get") };// 使用默認事件client.UseDefaultEventHandler();client.PubServiceEventHandler += Service_Bom_EventHandler;// 連接服務器client.ConnectIoT(topics, null, 60);Console.ReadKey();}/// <summary>/// 收到服務調用/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public static void Service_Bom_EventHandler(object sender, MqttMsgPublishEventArgs e){// handle message receivedstring topic = e.Topic;string message = Encoding.ASCII.GetString(e.Message);if (topic.Contains("bom")){// 將收到的服務調用數據轉為對象var model = client.Thing_Service_JsonToObject<Bom>(message);// 獲取里面的timee參數,將這個參數傳入給方法進行處理var re = BomServer(model.@params.timee);// 設置要返回的信息var reModel = new ReBom(){code = 200,id = model.id};reModel.data.isbom = 1;// 對服務器做出響應,返回處理結果client.Thing_Service_Identifier_Reply<ReBom>(reModel, "bom", false);}}public class Bom{public string method { get { return "thing.service.bom"; } set { } }public string id { get; set; }public string version { get { return "1.0.0"; } set { } }public Params @params { get; set; }public class Params{public int timee { get; set; }}public Bom(){@params = new Params();}}public class ReBom{public string id { get; set; }public int code { get; set; }public Data data { get; set; }public class Data{public int isbom { get; set; }}public ReBom(){data = new Data();}}/// <summary>/// 服務調用方法/// </summary>/// <param name="timee"></param>/// <returns></returns>public static bool BomServer(int timee){Console.WriteLine($"我將在 {timee} 秒后爆炸");/** 其它代碼 **/// 返回處理結果,已經爆炸return true;}}
5)服務器下發服務調用指令
運行上面設置的程序,打開阿里云物聯網控制臺,進入 在線調試。
選擇演示的產品、設備,選擇上面定義的機器自動爆炸服務。
在文本框輸入以下內容
{"timee":10
}
點擊 發送指令 ,然后點一下 刷新。 可以看到右側出現了 設備上報數據、云端下發數據
再到設備中,在導航欄點擊 服務調用,即可看到調用的服務、傳入參數、輸出參數等信息。
6)后續說明
上傳響應時,響應的 id 必須與收到的指令 id 一致。
轉載于:https://www.cnblogs.com/whuanle/p/10994708.html
總結
以上是生活随笔為你收集整理的阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中定义变量之②var let con
- 下一篇: 阮一峰老师的ES6入门:async 函数