預先在設備編寫好相應的代碼,這些代碼可以處理一個或多個任務,即爲 服務
,一個服務包含一個或多個任務。html
CZGL.AliIoTClient 中,服務器下發服務調用指令不須要設置,默認服務器能夠直接下發命令而不須要通過客戶端贊成。
雖然客戶端可以直接接收服務器的服務調用指令,可是必需要設置相應的方法綁定到委託中,方能處理指令。node
下面會舉例說明如何使用服務調用:git
打開阿里雲物聯網控制檯,點擊自定義功能,按如下定義。github
服務定義:json
輸入參數:服務器
輸出參數:markdown
定義的服務,有輸入參數、輸出參數,是指服務器向設備下發命令調用服務,這個服務須要的輸入參數、調用這個服務後返回的參數。
這個是相對設備來講的,服務器調用設備的服務,給設備傳入數據(輸入參數),而後設備處理完畢,返回結果(輸出參數)。異步
裏面有異步、同步方法,使用異步方法,服務器不須要等待設備響應結果,能夠直接返回。
同步方法,服務器必須等待響應結果,一直沒有得到結果則會超時報錯。測試
使用的基礎測試代碼以下(請替換 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(); }
運行控制檯程序,打開阿里雲物聯網控制檯,在線調試,找到服務,選擇 機器自動爆炸
在輸入框輸入如下內容:
{ "timee":10 }
點擊發送,再查看控制檯輸出。
{"method":"thing.service.bom","id":"670534570","params":{"timee":10},"version":"1.0.0"}
根據定義和要求,實際上收到服務調用命令後,須要進行處理而且返回響應結果。
收到的消息是 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(); } }
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 received string 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 負責將你的數據處理以及進行上傳下達,可是如何處理指令,須要你編寫相應的處理方法。
在鏈接服務器前,綁定到委託中
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、運行接收內容的Topic string[] 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 received string 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; } }
運行上面設置的程序,打開阿里雲物聯網控制檯,進入 在線調試。
選擇演示的產品、設備,選擇上面定義的機器自動爆炸服務。
在文本框輸入如下內容
{ "timee":10 }
點擊 發送指令 ,而後點一下 刷新。 能夠看到右側出現了 設備上報數據、雲端下發數據
再到設備中,在導航欄點擊 服務調用,便可看到調用的服務、傳入參數、輸出參數等信息。
上傳響應時,響應的 id 必須與收到的指令 id 一致。