系列教程目录

(一) 连接阿里云IOT

(二) 设置委托事件

(三) 上报属性

(四)  SDK文档 属性、方法、委托、类

http://pan.whuanle.cn/index.php?dir=uploads/阿里云IOT/AliIOTXFclient-dll类库&response

下载三个库,头部引入 即可使用

  1. using AliIOTXFClient;

示例下载地址

http://pan.whuanle.cn/index.php?dir=uploads/阿里云IOT/demo示例

本章示例 AliIOTXF.Twe

生命周期

事件类型

目前只设置了五个委托事件

  1. XFMQTT.ConnectionClosedEventHandler
  2. XFMQTT.PubedEventHandler
  3. XFMQTT.PubEventHandler
  4. XFMQTT.SubedEventHandler
  5. XFMQTT.UnSubedEventHandler
委托 说明
XFMQTT.PubEventHandler 订阅回调 - 当收到服务器消息时
XFMQTT.PubedEventHandler 当 QOS=1或2时,收到订阅触发
XFMQTT.SubedEventHandler 向服务器发布 Topic 时
XFMQTT.SubedEventHandler 向服务器发布 Topic 失败时
XFMQTT.ConnectionClosedEventHandler 断开连接

MQTT是一种可靠的消息推送协议,QOS保证了消息必须完整地推送给另一端,关于QOS具体可以百度~

  • QOS = 0 ,最多一次
  • QOS = 1,至少一次
  • QOS = 2,只有一次

代表消息推送地可靠程度,当 QOS = 1是,在网络波动等情况下,可能会存在多次重复的一次推送。

使用默认的委托方法:

  1. // 使用默认的委托事件
  2. client.UseDefaultEventHandler();

通过上一篇文章,程序已经可以运行、连接到阿里云服务器,并且可以订阅发布消息。

这些操作都会触发事件,通过 UseDefaultEventHandler() 方法,使用的默认的方法绑定到事件。

自定义事件方法

删除 这一行代码

  1. client.UseDefaultEventHandler();

头部引入

  1. using uPLibrary.Networking.M2Mqtt.Messages;

注意,这五个委托方法的参数是不一样的。 

XFMQTT.PubEventHandler

订阅回调 - 当收到服务器消息时触发

委托方法如下

  1. 委托方法(object sender, MqttMsgPublishEventArgs e)
  2. {
  3.  
  4. }

MqttMsgPublishEventArgs 是与接收消息有关的对象,其属性如下:

  1. // message topic
  2. private string topic;
  3. // message data
  4. private byte[] message;
  5. // duplicate delivery
  6. private bool dupFlag;
  7. // quality of service level
  8. private byte qosLevel;
  9. // retain flag
  10. private bool retain;

SDK 默认的委托方法

  1. public void Default_PubEventHandler(object sender, MqttMsgPublishEventArgs e)
  2. {
  3. // handle message received
  4. string topic = e.Topic;
  5. string message = Encoding.ASCII.GetString(e.Message);
  6. Console.WriteLine("- - - - - - - - - - ");
  7. Console.WriteLine("get topic message,Date: " + DateTime.Now.ToLongTimeString());
  8. Console.WriteLine("topic: " + topic);
  9. Console.WriteLine("get messgae :\n" + message);
  10. }

那么我们来写一个自定义委托方法

里面的怎么写都行,方法名称随意

  1. public static void 收到消息(object sender, MqttMsgPublishEventArgs e)
  2. {
  3. Console.WriteLine("topic名称:"+e.Topic);
  4. Console.WriteLine("接收时间:" + DateTime.Now.ToLongDateString());
  5. Console.WriteLine("消息内容:\n"+Encoding.ASCII.GetString(e.Message));
  6. }

在删除 client.UseDefaultEventHandler(); 的位置加上

  1. client.PubEventHandler += 收到消息;

XFMQTT.PubedEventHandler

当 QOS=1或2时,收到订阅触发

原型

  1. 委托方法(object sender, MqttMsgPublishedEventArgs e)
  2. {
  3.  
  4. }

MqttMsgPublishedEventArgs 属性

  1. // message identifier
  2. ushort messageId;
  3.  
  4. // published flag
  5. bool isPublished;

SDK 默认方法

  1. public void Default_PubedEventHandler(object sender, MqttMsgPublishedEventArgs e)
  2. {
  3. Console.WriteLine("- - - - - - - - - - ");
  4. Console.WriteLine("published,Date: " + DateTime.Now.ToLongTimeString());
  5. Console.WriteLine("MessageId: " + e.MessageId + " Is Published: " + e.IsPublished);
  6. }

我们来自定义写,方法名称随意

  1. public static void 重复收到消息(object sender, MqttMsgPublishedEventArgs e)
  2. {
  3. Console.WriteLine("接收时间: " + DateTime.Now.ToLongTimeString());
  4. Console.WriteLine("消息id: " + e.MessageId + " Is Published: " + e.IsPublished);
  5. }

加上

  1. client.PubedEventHandler += 重复收到消息;

XFMQTT.SubedEventHandler

向服务器发布 Topic 时触发

原型

  1. void 发布消息时(object sender, MqttMsgSubscribedEventArgs e)

MqttMsgSubscribedEventArgs 属性

  1. /// <summary>
  2. /// Message identifier
  3. /// </summary>
  4. public ushort MessageId {get;set;}
  5.  
  6. /// <summary>
  7. /// List of granted QOS Levels
  8. /// </summary>
  9. public byte[] GrantedQoSLevels{get;set;}
  10.  
  11. // message identifier
  12. ushort messageId;
  13. // granted QOS levels
  14. byte[] grantedQosLevels;

SDK 默认写法

  1. public void Default_SubedEventHandler(object sender, MqttMsgSubscribedEventArgs e)
  2. {
  3. Console.WriteLine("- - - - - - - - - - ");
  4. Console.WriteLine("Sub topic,Date: " + DateTime.Now.ToLongTimeString());
  5. Console.WriteLine("MessageId: " + e.MessageId);
  6. Console.WriteLine("List of granted QOS Levels: " + Encoding.UTF8.GetString(e.GrantedQoSLevels));
  7. }

我们来自定义写,方法名称随意

  1. public static void 发布消息时(object sender, MqttMsgSubscribedEventArgs e)
  2. {
  3. Console.WriteLine("向服务器发送了消息");
  4. Console.WriteLine("发送时间: " + DateTime.Now.ToLongTimeString());
  5. Console.WriteLine("消息id: " + e.MessageId);
  6. Console.WriteLine("QOS 为 : " + Encoding.UTF8.GetString(e.GrantedQoSLevels));
  7. }

加上

  1. client.SubedEventHandler += 发布消息时;

XFMQTT.UnSubedEventHandler

向服务器发布 Topic 失败时触发

  1. void 发送失败(object sender, MqttMsgUnsubscribedEventArgs )
  2. {
  3.  
  4. }

MqttMsgUnsubscribedEventArgs 属性

  1. /// <summary>
  2. /// Message identifier
  3. /// </summary>
  4. public ushort MessageId
  5. {
  6. get { return this.messageId; }
  7. internal set { this.messageId = value; }
  8. }

SDK 写法

  1. public void Default_UnSubedEventHandler(object sender, MqttMsgUnsubscribedEventArgs e)
  2. {
  3. Console.WriteLine("- - - - - - - - - - ");
  4. Console.WriteLine("Sub topic error,Date: " + DateTime.Now.ToLongTimeString());
  5. Console.WriteLine("MessageId: " + e.MessageId);
  6. }

我们自定义写

  1. public static void 发送失败(object sender, MqttMsgUnsubscribedEventArgs e)
  2. {
  3. Console.WriteLine("消息发送失败 ");
  4. Console.WriteLine("时间: " + DateTime.Now.ToLongTimeString());
  5. Console.WriteLine("失败的消息 MessageId: " + e.MessageId);
  6. }

加上

  1. client.UnSubedEventHandler += 发送失败;

XFMQTT.ConnectionClosedEventHandler

断开连接时触发

SDK 写法

  1. public void Default_ConnectionClosedEventHandler(object sender, EventArgs e)
  2. {
  3. Console.WriteLine("- - - - - - - - - - ");
  4. Console.WriteLine("Connect Closed error,Date: " + DateTime.Now.ToLongTimeString());
  5. }

自定义写

  1. public static void 断开连接(object sender, EventArgs e)
  2. {
  3. Console.WriteLine("日。。。连接断开了: " + DateTime.Now.ToLongTimeString());
  4. }

加上

  1. client.ConnectionClosedEventHandler += 断开连接;

完整代码

  1. static void Main(string[] args)
  2. {
  3. // 创建连接对象
  4. XFMQTT client = new XFMQTT("a1BiPoNawLI", "Raspberry");
  5. // 初始化客户端配置
  6. client.Init("2NOaBeqXcIzLQEhlJFEfKbWeug0o3m0c", "cn-shanghai");
  7. // 要订阅的Topic
  8. string[] topic = { client.CombineHeadTopic("PubData") };
  9.  
  10. // 使用自定义的委托事件
  11. client.PubEventHandler += 收到消息;
  12. client.PubedEventHandler += 重复收到消息;
  13. client.SubedEventHandler += 发布消息时;
  14. client.UnSubedEventHandler += 发送失败;
  15. client.ConnectionClosedEventHandler += 断开连接;
  16. // 连接服务器
  17. client.ConnectMqtt(topic);
  18.  
  19. while (true)
  20. {
  21. string str = Console.ReadLine();
  22.  
  23. // 推送内容到特定的 Topic
  24. client.Subscribe(client.CombineHeadTopic("SubData"), str);
  25. }
  26.  
  27. Console.ReadKey();
  28. }
  29. public static void 收到消息(object sender, MqttMsgPublishEventArgs e)
  30. {
  31. Console.WriteLine("topic名称:"+e.Topic);
  32. Console.WriteLine("接收时间:" + DateTime.Now.ToLongDateString());
  33. Console.WriteLine("消息内容:\n"+Encoding.ASCII.GetString(e.Message));
  34. }
  35. public static void 重复收到消息(object sender, MqttMsgPublishedEventArgs e)
  36. {
  37. Console.WriteLine("接收时间: " + DateTime.Now.ToLongTimeString());
  38. Console.WriteLine("消息id: " + e.MessageId + " Is Published: " + e.IsPublished);
  39. }
  40. public static void 发布消息时(object sender, MqttMsgSubscribedEventArgs e)
  41. {
  42. Console.WriteLine("向服务器发送了消息");
  43. Console.WriteLine("发送时间: " + DateTime.Now.ToLongTimeString());
  44. Console.WriteLine("消息id: " + e.MessageId);
  45. Console.WriteLine("QOS 为 : " + Encoding.UTF8.GetString(e.GrantedQoSLevels));
  46. }
  47. public static void 发送失败(object sender, MqttMsgUnsubscribedEventArgs e)
  48. {
  49. Console.WriteLine("消息发送失败 ");
  50. Console.WriteLine("时间: " + DateTime.Now.ToLongTimeString());
  51. Console.WriteLine("失败的消息 MessageId: " + e.MessageId);
  52. }
  53. public static void 断开连接(object sender, EventArgs e)
  54. {
  55. Console.WriteLine("日。。。连接断开了: " + DateTime.Now.ToLongTimeString());
  56. }

但是这样子不好,换种写法

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. // 创建连接对象
  6. XFMQTT client = new XFMQTT("a1BiPoNawLI", "Raspberry");
  7. // 初始化客户端配置
  8. client.Init("2NOaBeqXcIzLQEhlJFEfKbWeug0o3m0c", "cn-shanghai");
  9. // 要订阅的Topic
  10. string[] topic = { client.CombineHeadTopic("PubData") };
  11.  
  12. // 使用自定义的委托事件
  13. 事件类 事件 = new 事件类();
  14. client.PubEventHandler += 事件.收到消息;
  15. client.PubedEventHandler += 事件.重复收到消息;
  16. client.SubedEventHandler += 事件.发布消息时;
  17. client.UnSubedEventHandler += 事件.发送失败;
  18. client.ConnectionClosedEventHandler += 事件.断开连接;
  19. // 连接服务器
  20. client.ConnectMqtt(topic);
  21.  
  22. while (true)
  23. {
  24. string str = Console.ReadLine();
  25.  
  26. // 推送内容到特定的 Topic
  27. client.Subscribe(client.CombineHeadTopic("SubData"), str);
  28. }
  29.  
  30. Console.ReadKey();
  31. }
  32. }
  33. public class 事件类
  34. {
  35. public void 收到消息(object sender, MqttMsgPublishEventArgs e)
  36. {
  37. Console.WriteLine("topic名称:" + e.Topic);
  38. Console.WriteLine("接收时间:" + DateTime.Now.ToLongDateString());
  39. Console.WriteLine("消息内容:\n" + Encoding.ASCII.GetString(e.Message));
  40. }
  41. public void 重复收到消息(object sender, MqttMsgPublishedEventArgs e)
  42. {
  43. Console.WriteLine("接收时间: " + DateTime.Now.ToLongTimeString());
  44. Console.WriteLine("消息id: " + e.MessageId + " Is Published: " + e.IsPublished);
  45. }
  46. public void 发布消息时(object sender, MqttMsgSubscribedEventArgs e)
  47. {
  48. Console.WriteLine("向服务器发送了消息");
  49. Console.WriteLine("发送时间: " + DateTime.Now.ToLongTimeString());
  50. Console.WriteLine("消息id: " + e.MessageId);
  51. Console.WriteLine("QOS 为 : " + Encoding.UTF8.GetString(e.GrantedQoSLevels));
  52. }
  53. public void 发送失败(object sender, MqttMsgUnsubscribedEventArgs e)
  54. {
  55. Console.WriteLine("消息发送失败 ");
  56. Console.WriteLine("时间: " + DateTime.Now.ToLongTimeString());
  57. Console.WriteLine("失败的消息 MessageId: " + e.MessageId);
  58. }
  59. public void 断开连接(object sender, EventArgs e)
  60. {
  61. Console.WriteLine("日。。。连接断开了: " + DateTime.Now.ToLongTimeString());
  62. }
  63. }

使用默认事件方法与自定义事件方法并不冲突。

  1. // 使用默认事件方法
  2. client.UseDefaultEventHandler();
  3. // 使用自定义的委托事件
  4. 事件类 事件 = new 事件类();
  5. client.PubEventHandler += 事件.收到消息;
  6. client.PubedEventHandler += 事件.重复收到消息;
  7. client.SubedEventHandler += 事件.发布消息时;
  8. client.UnSubedEventHandler += 事件.发送失败;
  9. client.ConnectionClosedEventHandler += 事件.断开连接;

为便于理解,上面事件方法使用了中文名称,请根据实际修改。

.NET Core 跨平台物联网开发:设置委托事件(二)的更多相关文章

  1. .NET Core 跨平台物联网开发:SDK 属性、方法、委托、类(四)

    系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...

  2. .NET Core 跨平台物联网开发:连接阿里云IOT(一)

    系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...

  3. .NET Core 跨平台物联网开发:上报属性(三)

    系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...

  4. 跨平台移动开发_PhoneGap API 事件类型

    PhoneGap API Events backbuttondevicereadymenubuttonpauseresumeonlineofflinebatterycriticalbatterylow ...

  5. ASP.NET Core Windows服务开发技术实战演练

    一.课程介绍 人生苦短,我用.NET Core!大家都知道如果想要程序一直运行在Windows服务器上,最好是把程序写成Windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需 ...

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

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

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

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

  8. [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建

    [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建 1.概述 读前必备:认识.NET Core 上篇介绍了.NET 新的生态环境:包括.NET Framework..NET ...

  9. 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf

    <ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...

随机推荐

  1. mysql 存储过程(支持事务管理)

    CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int) BEGIN #Routine body goe ...

  2. 【转载】C#扫盲之:静态成员、静态方法、静态类、实例成员及区别

    文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...

  3. poj2406--Power Strings(kmp:求循环串的次数)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33163   Accepted: 13784 D ...

  4. VS2013带来的&quot;新特性&quot;

    VS2013除了引入"Bootstrap"库以外,最大的变化就是.net Framework 4.5下面的都不支持了.也就是说,假设不把.net库升级成.net Framework ...

  5. 光流(optical flow)和openCV中实现

    转载请注明出处! ! ! http://blog.csdn.net/zhonghuan1992 光流(optical flow)和openCV中实现 光流的概念:        是Gibson在195 ...

  6. 关于数组类型的json解析方法

    遇到了非常奇葩的数组类型的json,一时解析不出来,用jsonObject会直接报错. Json数据如: [{"id":"1000142","name ...

  7. 当年用httpclient时踩过的那些坑

    一.前言 httpclient是java开发中最常用的工具之一,通常大家会使用其中比较基础的api去调用远程.长期开发爬虫,会接触httpclient不常用的api,同时会遇到各式各样的坑,本文将总结 ...

  8. 【 D3.js 进阶系列 — 1.2 】 读取 CSV 文件时乱码的解决方法

    在 D3 中使用 d3.csv 读取 CSV 文件时,有时会出现乱码问题. 怎么解决呢? 1. 乱码问题 使用 d3.csv 读取 xxx.csv 文件时.假设 xxx.csv 文件使用的是 UTF- ...

  9. Struts2中Action接收参数

    Struts2中Action接收参数的方法主要有以下三种: Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数:     a.定义:在Action类中定义属 ...

  10. kbmMemTable关于内存表的使用,以及各种三层框架的评价

    关于内存表的使用(kbmMemTable) 关于内存表的使用说明一. Delphi使用内存表1.1 Delphi创建内存表步骤:1. 创建一个Ttable实例.2. 设置一个DataBaseName为 ...