zoukankan      html  css  js  c++  java
  • 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用

    文档目录:


    预先在设备编写好相应的代码,这些代码能够处理一个或多个任务,即为 服务 ,一个服务包含一个或多个任务。

    CZGL.AliIoTClient 中,服务器下发服务调用指令不需要设置,默认服务器可以直接下发命令而不需要经过客户端同意。
    虽然客户端能够直接接收服务器的服务调用指令,但是必须要设置相应的方法绑定到委托中,方能处理指令。

    下面会举例说明如何使用服务调用:

    1. 设备定义一个服务,这个服务是定时爆炸。
    2. 当收到服务器下发的爆炸命令和定时爆炸时间,就会开始任务
    3. 爆炸后,返回爆炸结果
    4. 服务器下发命令给设备,让它爆炸
    5. 服务器不管设备怎么爆炸,也不等你爆炸
    6. 设备爆炸完了,去告诉服务器设备以及完成爆炸

    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、运行接收内容的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 一致。

  • 相关阅读:
    ASP.NET MVC 3: Razor中的@:和语法
    telerik 值得学习 web mvc 桌面 控件大全
    Android 基于google Zxing实现对手机中的二维码进行扫描
    Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
    SQL聚集索引和非聚集索引的区别
    SQL Server的聚集索引和非聚集索引
    请教一个Jquery ligerui 框架的小问题
    学习如何用VS2010创建ocx控件
    nginx-rtmp-module--------------WIKI
    rtmp一些状态信息详解-as连接FMS服务器报错状态汇总~~
  • 原文地址:https://www.cnblogs.com/whuanle/p/10994708.html
Copyright © 2011-2022 走看看