阿里雲物聯網 .NET Core 客戶端 | CZGL.AliIoTClient:7. 服務調用

文檔目錄:


 

預先在設備編寫好相應的代碼,這些代碼可以處理一個或多個任務,即爲 服務 ,一個服務包含一個或多個任務。html

CZGL.AliIoTClient 中,服務器下發服務調用指令不須要設置,默認服務器能夠直接下發命令而不須要通過客戶端贊成。
雖然客戶端可以直接接收服務器的服務調用指令,可是必需要設置相應的方法綁定到委託中,方能處理指令。node

下面會舉例說明如何使用服務調用:git

  1. 設備定義一個服務,這個服務是定時爆炸。
  2. 當收到服務器下發的爆炸命令和定時爆炸時間,就會開始任務
  3. 爆炸後,返回爆炸結果
  4. 服務器下發命令給設備,讓它爆炸
  5. 服務器無論設備怎麼爆炸,也不等你爆炸
  6. 設備爆炸完了,去告訴服務器設備以及完成爆炸

1)設置服務調用

打開阿里雲物聯網控制檯,點擊自定義功能,按如下定義。github

服務定義:json

定義服務

輸入參數:服務器

設置輸入參數

輸出參數:markdown

獲取輸出參數


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、運行接收內容的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"}

根據定義和要求,實際上收到服務調用命令後,須要進行處理而且返回響應結果。


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 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 負責將你的數據處理以及進行上傳下達,可是如何處理指令,須要你編寫相應的處理方法。


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、運行接收內容的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;
        }
    }

5)服務器下發服務調用指令

運行上面設置的程序,打開阿里雲物聯網控制檯,進入 在線調試。
選擇演示的產品、設備,選擇上面定義的機器自動爆炸服務。

在文本框輸入如下內容

{
    "timee":10
}

點擊 發送指令 ,而後點一下 刷新。 能夠看到右側出現了 設備上報數據、雲端下發數據

再到設備中,在導航欄點擊 服務調用,便可看到調用的服務、傳入參數、輸出參數等信息。

服務調用結果


6)後續說明

上傳響應時,響應的 id 必須與收到的指令 id 一致。

相關文章
相關標籤/搜索