文档目录: <>

* 说明 <https://www.cnblogs.com/whuanle/p/10994645.html>
* 1. 连接阿里云物联网 <https://www.cnblogs.com/whuanle/p/10994663.html>
* 2. IoT 客户端 <https://www.cnblogs.com/whuanle/p/10994673.html>
* 3. 订阅Topic与响应Topic <https://www.cnblogs.com/whuanle/p/10994686.html>
* 4. 设备上报属性 <https://www.cnblogs.com/whuanle/p/10994694.html>
* 4.1 上报位置信息 <https://www.cnblogs.com/whuanle/p/10994696.html>
* 5. 设置设备属性 <https://www.cnblogs.com/whuanle/p/10994701.html>
* 6. 设备事件上报 <https://www.cnblogs.com/whuanle/p/10994707.html>
* 7. 服务调用 <https://www.cnblogs.com/whuanle/p/10994708.html>
* 8. 委托事件 <https://www.cnblogs.com/whuanle/p/10994713.html>
* 9. 自定义委托事件方法
<https://www.cnblogs.com/whuanle/p/10994720.html>
 

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

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

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

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

<https://github.com/whuanle/CZGL.AliIoTClient/wiki/7.-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8#1%E8%AE%BE%E7%BD%AE%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8>
1)设置服务调用

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

服务定义:



输入参数:



输出参数:




<https://github.com/whuanle/CZGL.AliIoTClient/wiki/7.-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8#2%E5%AE%9A%E4%B9%89%E6%9C%8D%E5%8A%A1%E8%AF%B4%E6%98%8E>
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"}
根据定义和要求,实际上收到服务调用命令后,需要进行处理并且返回响应结果。


<https://github.com/whuanle/CZGL.AliIoTClient/wiki/7.-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8#3%E7%BC%96%E5%86%99%E6%8E%A5%E6%94%B6%E6%A8%A1%E5%9E%8B%E5%92%8C%E5%93%8D%E5%BA%94%E6%A8%A1%E5%9E%8B>
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(); } }

<https://github.com/whuanle/CZGL.AliIoTClient/wiki/7.-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8#4%E5%AE%9A%E4%B9%89%E5%A7%94%E6%89%98%E6%96%B9%E6%B3%95>
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 负责将你的数据处理以及进行上传下达,但是如何处理指令,需要你编写相应的处理方法。


<https://github.com/whuanle/CZGL.AliIoTClient/wiki/7.-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8#5%E7%BB%91%E5%AE%9A%E5%88%B0%E5%A7%94%E6%89%98%E4%B8%AD>
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; } }

<https://github.com/whuanle/CZGL.AliIoTClient/wiki/7.-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8#5%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8B%E5%8F%91%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E6%8C%87%E4%BB%A4>
5)服务器下发服务调用指令

运行上面设置的程序,打开阿里云物联网控制台,进入 在线调试。
选择演示的产品、设备,选择上面定义的机器自动爆炸服务。

在文本框输入以下内容
{ "timee":10 }
点击 发送指令 ,然后点一下 刷新。 可以看到右侧出现了 设备上报数据、云端下发数据

再到设备中,在导航栏点击 服务调用,即可看到调用的服务、传入参数、输出参数等信息。




<https://github.com/whuanle/CZGL.AliIoTClient/wiki/7.-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8#6%E5%90%8E%E7%BB%AD%E8%AF%B4%E6%98%8E>
6)后续说明

上传响应时,响应的 id 必须与收到的指令 id 一致。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信