文档目录:


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

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

阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用的更多相关文章

  1. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:1. 连接阿里云物联网

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  2. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:2. IoT 客户端

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  3. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:3. 订阅Topic与响应Topic

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  4. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  5. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:5. 设置设备属性

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  6. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:6. 设备事件上报

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  7. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:8. 委托事件

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  8. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:9. 自定义委托事件方法

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  9. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4.1 上报位置信息

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

随机推荐

  1. 4.Web工程师的开发工具箱

    第四章 效率工具ShadowSocks window代理服务器FalconProxy chrome代理服务器stackoverflow.com Stack Overflow是一个与程序相关的IT技术问 ...

  2. ubuntu 网络配置及ssh文件传输

    一.ubuntu网路配置 参考http://www.cnblogs.com/rusty/archive/2011/04/06/2007139.html /etc/network/interfaces ...

  3. Html+CSS3技术实现动画、天气图标动态效果 效果很酷

    1. [代码][CSS]代码    <svg    version="1.1"    id="sun"    class="climacon c ...

  4. android使用mina需要注意的问题

    1.第三方jar包的使用       如果在Java Build Path中使用Add External JARs这种方式,运行时会有找不到类的错误(我的上面有,如果你没出现,恭喜你),上网查了几种方 ...

  5. css3立体旋转菜单

    css3立体旋转菜单,css3,3D,立体旋转,立体菜单,菜单导航,css3立体旋转菜单是一款纯css3实现的三维立体旋转导航菜单. 源码下载页:http://www.huiyi8.com/sc/71 ...

  6. PHP ServerPush (推送) 技术的探讨【转】

    随着人们对Web即时应用需求的不断上升,Server Push(推送)技术在聊天.消息提醒尤其是社交网络等方面开始兴起,成为实时应用的数据流核心.这篇日志试图探讨的便是各种适合于PHP的Push的实现 ...

  7. html5--1.20 课程小结与若干点补充

    html5--1.20 课程小结与若干点补充 学习要点: 1.第一章HTML5基础知识做一个小结2.对本章课程中部分内容做几点补充 课程小结 对本章的知识点做一个简单的回顾,并对其中个别知识点做若干补 ...

  8. 分享知识-快乐自己:Oracle 创建序列 及 使用序列

    1.创建序列语法: create sequence 序列名 [可选参数] 序列名常定义为‘seq_XXX’的形式,创建序列不能使用replace 可选参数说明: increment by: 序列每次增 ...

  9. 【Codeforces】Gym 101156E Longest Increasing Subsequences LIS+树状数组

    题意 给定$n$个数,求最长上升子序列的方案数 根据数据范围要求是$O(n\log n)$ 朴素的dp方程式$f_i=max(f_j+1),a_i>a_j$,所以记方案数为$v_i$,则$v_i ...

  10. VC++动态链接库(DLL)编程深入浅出(转帖:基础班)

    1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...