日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用

發(fā)布時(shí)間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文檔目錄:

  • 說明
  • 1. 連接阿里云物聯(lián)網(wǎng)
  • 2. IoT 客戶端
  • 3. 訂閱Topic與響應(yīng)Topic
  • 4. 設(shè)備上報(bào)屬性
  • 4.1 上報(bào)位置信息
  • 5. 設(shè)置設(shè)備屬性
  • 6. 設(shè)備事件上報(bào)
  • 7. 服務(wù)調(diào)用
  • 8. 委托事件
  • 9. 自定義委托事件方法

?

預(yù)先在設(shè)備編寫好相應(yīng)的代碼,這些代碼能夠處理一個(gè)或多個(gè)任務(wù),即為?服務(wù)?,一個(gè)服務(wù)包含一個(gè)或多個(gè)任務(wù)。

CZGL.AliIoTClient 中,服務(wù)器下發(fā)服務(wù)調(diào)用指令不需要設(shè)置,默認(rèn)服務(wù)器可以直接下發(fā)命令而不需要經(jīng)過客戶端同意。
雖然客戶端能夠直接接收服務(wù)器的服務(wù)調(diào)用指令,但是必須要設(shè)置相應(yīng)的方法綁定到委托中,方能處理指令。

下面會(huì)舉例說明如何使用服務(wù)調(diào)用:

  1. 設(shè)備定義一個(gè)服務(wù),這個(gè)服務(wù)是定時(shí)爆炸。
  2. 當(dāng)收到服務(wù)器下發(fā)的爆炸命令和定時(shí)爆炸時(shí)間,就會(huì)開始任務(wù)
  3. 爆炸后,返回爆炸結(jié)果
  4. 服務(wù)器下發(fā)命令給設(shè)備,讓它爆炸
  5. 服務(wù)器不管設(shè)備怎么爆炸,也不等你爆炸
  6. 設(shè)備爆炸完了,去告訴服務(wù)器設(shè)備以及完成爆炸

1)設(shè)置服務(wù)調(diào)用

打開阿里云物聯(lián)網(wǎng)控制臺(tái),點(diǎn)擊自定義功能,按以下定義。

服務(wù)定義:

輸入?yún)?shù):

輸出參數(shù):


2)定義服務(wù)說明

定義的服務(wù),有輸入?yún)?shù)、輸出參數(shù),是指服務(wù)器向設(shè)備下發(fā)命令調(diào)用服務(wù),這個(gè)服務(wù)需要的輸入?yún)?shù)、調(diào)用這個(gè)服務(wù)后返回的參數(shù)。
這個(gè)是相對(duì)設(shè)備來說的,服務(wù)器調(diào)用設(shè)備的服務(wù),給設(shè)備傳入數(shù)據(jù)(輸入?yún)?shù)),然后設(shè)備處理完畢,返回結(jié)果(輸出參數(shù))。

里面有異步、同步方法,使用異步方法,服務(wù)器不需要等待設(shè)備響應(yīng)結(jié)果,可以直接返回。
同步方法,服務(wù)器必須等待響應(yīng)結(jié)果,一直沒有獲得結(jié)果則會(huì)超時(shí)報(bào)錯(cuò)。

使用的基礎(chǔ)測試代碼如下(請(qǐng)?zhí)鎿Q DeviceOptions 的值):

        static AliIoTClientJson client;static void Main(string[] args){// 創(chuàng)建客戶端client = new AliIoTClientJson(new DeviceOptions{ProductKey = "a1A6VVt72pD",DeviceName = "json",DeviceSecret = "7QrjTptQYCdepjbQvSoqkuygic2051zM",RegionId = "cn-shanghai"});client.OpenPropertyDownPost();// 設(shè)置要訂閱的Topic、運(yùn)行接收內(nèi)容的Topicstring[] topics = new string[] { client.CombineHeadTopic("get") };// 使用默認(rèn)事件client.UseDefaultEventHandler();// 連接服務(wù)器client.ConnectIoT(topics, null, 60);Console.ReadKey();}

運(yùn)行控制臺(tái)程序,打開阿里云物聯(lián)網(wǎng)控制臺(tái),在線調(diào)試,找到服務(wù),選擇?機(jī)器自動(dòng)爆炸
在輸入框輸入以下內(nèi)容:

{"timee":10
}

點(diǎn)擊發(fā)送,再查看控制臺(tái)輸出。

{"method":"thing.service.bom","id":"670534570","params":{"timee":10},"version":"1.0.0"}

根據(jù)定義和要求,實(shí)際上收到服務(wù)調(diào)用命令后,需要進(jìn)行處理并且返回響應(yīng)結(jié)果。


3)編寫接收模型和響應(yīng)模型

收到的消息是 Alink json ,你可以通過 CZGL.AliIoTClient 轉(zhuǎn)換成相應(yīng)的對(duì)象。
同樣,也需要將相應(yīng)的對(duì)象轉(zhuǎn)成 Alink json 上傳到服務(wù)器中,作為響應(yīng)。

編寫接收模型: 里面只有一個(gè)很簡單的參數(shù) timee ,這個(gè)就是在控制臺(tái)定義的 傳入?yún)?shù)。

        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();}}

編寫響應(yīng)模型:

    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 中,有個(gè) PubServiceEventHandler 委托,當(dāng)收到服務(wù)器的服務(wù)調(diào)用命令時(shí),這個(gè)委托就會(huì)觸發(fā)響應(yīng)的事件。

所以,我們編寫一個(gè)處理命令的方法,另外自定義一個(gè)委托方法。

服務(wù)調(diào)用方法:

        /// <summary>/// 服務(wù)調(diào)用方法/// </summary>/// <param name="timee"></param>/// <returns></returns>public static bool BomServer(int timee){Console.WriteLine($"我將在 {timee} 秒后爆炸");/** 其它代碼 **/// 返回處理結(jié)果,已經(jīng)爆炸return true;}

編寫委托方法: 當(dāng)收到服務(wù)調(diào)用命令時(shí),應(yīng)當(dāng)如何處理。

        /// <summary>/// 收到服務(wù)調(diào)用/// </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")){// 將收到的服務(wù)調(diào)用數(shù)據(jù)轉(zhuǎn)為對(duì)象var model = client.Thing_Service_JsonToObject<Bom>(message);// 獲取里面的timee參數(shù),將這個(gè)參數(shù)傳入給方法進(jìn)行處理var re = BomServer(model.@params.timee);// 設(shè)置要返回的信息var reModel = new ReBom(){code = 200,id = model.id};reModel.data.isbom = 1;// 對(duì)服務(wù)器做出響應(yīng),返回處理結(jié)果client.Thing_Service_Identifier_Reply<ReBom>(reModel, "bom", false);}}

如果你有多個(gè)服務(wù),那么在上面給出的示例方法?Service_Bom_EventHandler?中,加個(gè)判斷即可。 總之,這些是自定義的,靈活性很高,CZGL.AliIoTClient 負(fù)責(zé)將你的數(shù)據(jù)處理以及進(jìn)行上傳下達(dá),但是如何處理指令,需要你編寫相應(yīng)的處理方法。


5)綁定到委托中

在連接服務(wù)器前,綁定到委托中

            client.PubServiceEventHandler += Service_Bom_EventHandler;// 連接服務(wù)器client.ConnectIoT(topics, null, 60);

就這么一句代碼而已。

當(dāng)然, CZGL.AliIoTClient 默認(rèn)有一些方法,在收到服務(wù)器消息時(shí)觸發(fā),這些不會(huì)影響到你的委托方法。
如果你不需要,去除即可。

            // 使用默認(rèn)事件// client.UseDefaultEventHandler();client.PubServiceEventHandler += Service_Bom_EventHandler;// 連接服務(wù)器client.ConnectIoT(topics, null, 60);

至此,完整的代碼如下:

    class Program{static AliIoTClientJson client;static void Main(string[] args){// 創(chuàng)建客戶端client = new AliIoTClientJson(new DeviceOptions{ProductKey = "a1A6VVt72pD",DeviceName = "json",DeviceSecret = "7QrjTptQYCdepjbQvSoqkuygic2051zM",RegionId = "cn-shanghai"});client.OpenPropertyDownPost();// 設(shè)置要訂閱的Topic、運(yùn)行接收內(nèi)容的Topicstring[] topics = new string[] { client.CombineHeadTopic("get") };// 使用默認(rèn)事件client.UseDefaultEventHandler();client.PubServiceEventHandler += Service_Bom_EventHandler;// 連接服務(wù)器client.ConnectIoT(topics, null, 60);Console.ReadKey();}/// <summary>/// 收到服務(wù)調(diào)用/// </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")){// 將收到的服務(wù)調(diào)用數(shù)據(jù)轉(zhuǎn)為對(duì)象var model = client.Thing_Service_JsonToObject<Bom>(message);// 獲取里面的timee參數(shù),將這個(gè)參數(shù)傳入給方法進(jìn)行處理var re = BomServer(model.@params.timee);// 設(shè)置要返回的信息var reModel = new ReBom(){code = 200,id = model.id};reModel.data.isbom = 1;// 對(duì)服務(wù)器做出響應(yīng),返回處理結(jié)果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>/// 服務(wù)調(diào)用方法/// </summary>/// <param name="timee"></param>/// <returns></returns>public static bool BomServer(int timee){Console.WriteLine($"我將在 {timee} 秒后爆炸");/** 其它代碼 **/// 返回處理結(jié)果,已經(jīng)爆炸return true;}}

5)服務(wù)器下發(fā)服務(wù)調(diào)用指令

運(yùn)行上面設(shè)置的程序,打開阿里云物聯(lián)網(wǎng)控制臺(tái),進(jìn)入 在線調(diào)試。
選擇演示的產(chǎn)品、設(shè)備,選擇上面定義的機(jī)器自動(dòng)爆炸服務(wù)。

在文本框輸入以下內(nèi)容

{"timee":10
}

點(diǎn)擊 發(fā)送指令 ,然后點(diǎn)一下 刷新。 可以看到右側(cè)出現(xiàn)了 設(shè)備上報(bào)數(shù)據(jù)、云端下發(fā)數(shù)據(jù)

再到設(shè)備中,在導(dǎo)航欄點(diǎn)擊 服務(wù)調(diào)用,即可看到調(diào)用的服務(wù)、傳入?yún)?shù)、輸出參數(shù)等信息。


6)后續(xù)說明

上傳響應(yīng)時(shí),響應(yīng)的 id 必須與收到的指令 id 一致。

轉(zhuǎn)載于:https://www.cnblogs.com/whuanle/p/10994708.html

總結(jié)

以上是生活随笔為你收集整理的阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。