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

简介: 预先在设备编写好相应的代码,这些代码能够处理一个或多个任务,即为 服务 ,一个服务包含一个或多个任务。 CZGL.AliIoTClient 中,服务器下发服务调用指令不需要设置,默认服务器可以直接下发命令而不需要经过客户端同意。

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

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

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

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

1)设置服务调用

打开阿里云物联网控制台,点击自定义功能,按以下定义。

服务定义:

定义服务

输入参数:

设置输入参数.png "设置输入参数")

输出参数:

获取输出参数


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 一致。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
18天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
71 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
3月前
|
开发框架 JavaScript .NET
ASP.NET Core的超级大BUG
ASP.NET Core的超级大BUG
43 0
|
2月前
|
消息中间件 DataWorks 物联网
MQTT问题之接入阿里云物联网平台如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
181 1
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
65 0
|
1月前
|
网络协议 C语言
【开源视频联动物联网平台】libmodbus库写一个Modbus TCP客户端
【开源视频联动物联网平台】libmodbus库写一个Modbus TCP客户端
24 0
|
1月前
|
Java Maven
【开源视频联动物联网平台】vertx写一个mqtt客户端
【开源视频联动物联网平台】vertx写一个mqtt客户端
40 1

相关产品

  • 物联网平台