阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
文档目录:
预先在设备编写好相应的代码,这些代码能够处理一个或多个任务,即为 服务
,一个服务包含一个或多个任务。
CZGL.AliIoTClient 中,服务器下发服务调用指令不需要设置,默认服务器可以直接下发命令而不需要经过客户端同意。
虽然客户端能够直接接收服务器的服务调用指令,但是必须要设置相应的方法绑定到委托中,方能处理指令。
下面会举例说明如何使用服务调用:
- 设备定义一个服务,这个服务是定时爆炸。
- 当收到服务器下发的爆炸命令和定时爆炸时间,就会开始任务
- 爆炸后,返回爆炸结果
- 服务器下发命令给设备,让它爆炸
- 服务器不管设备怎么爆炸,也不等你爆炸
- 设备爆炸完了,去告诉服务器设备以及完成爆炸
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. 服务调用的更多相关文章
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:1. 连接阿里云物联网
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:2. IoT 客户端
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:3. 订阅Topic与响应Topic
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:5. 设置设备属性
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:6. 设备事件上报
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:8. 委托事件
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:9. 自定义委托事件方法
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4.1 上报位置信息
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
随机推荐
- P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...
- c# XML-Object对象 序列化-反序列化
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- POJ 2348 Euclid Game (模拟题)
Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7942 Accepted: 3227 Des ...
- JavaScript中双叹号(!!)作用示例介绍
http://www.jb51.net/article/48881.htm 经常看到这样的例子: var a: var b=!!a; a默认是undefined.!a是true,!!a则是false, ...
- 算法(Algorithms)第4版 练习 1.3.15
Queue: package com.qiusongde; import java.util.Iterator; import java.util.NoSuchElementException; im ...
- ARP之windows下的ARP命令
ARP之windows下的ARP命令 arp -a 查看当前电脑上的ARP映射表.可以看到当前的ARP的映射关系是动态的还是静态的. arp -s w.x.y.z aa-bb-cc-dd-ee-ff ...
- BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1579 题意: 给你一个无向图,n个点,m条边,每条边有边权w[i]. 你可以将其中的k(k ...
- laravel基础课程---15、分页及验证码(lavarel分页效果如何实现)
laravel基础课程---15.分页及验证码(lavarel分页效果如何实现) 一.总结 一句话总结: 数据库的paginate方法:$data=\DB::table("user" ...
- hdu-5793 A Boring Question(二项式定理)
题目链接: A Boring Question Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
- C++正确的cin输入
void test1(void) { int number; cout << ">> pls input a integer number:"; while ...