系列教程目录

(一) 连接阿里云IOT

(二) 设置委托事件

(三) 上报属性

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

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

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

using AliIOTXFClient;

示例下载地址

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

本章示例 AliIOTXF.Twe

生命周期

事件类型

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

XFMQTT.ConnectionClosedEventHandler
XFMQTT.PubedEventHandler
XFMQTT.PubEventHandler
XFMQTT.SubedEventHandler
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是,在网络波动等情况下,可能会存在多次重复的一次推送。

使用默认的委托方法:

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

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

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

自定义事件方法

删除 这一行代码

client.UseDefaultEventHandler();

头部引入

using uPLibrary.Networking.M2Mqtt.Messages;

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

XFMQTT.PubEventHandler

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

委托方法如下

         委托方法(object sender, MqttMsgPublishEventArgs e)
{ }

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

        // message topic
private string topic;
// message data
private byte[] message;
// duplicate delivery
private bool dupFlag;
// quality of service level
private byte qosLevel;
// retain flag
private bool retain;

SDK 默认的委托方法

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

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

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

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

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

client.PubEventHandler += 收到消息;

XFMQTT.PubedEventHandler

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

原型

委托方法(object sender, MqttMsgPublishedEventArgs e)
{ }

MqttMsgPublishedEventArgs 属性

        // message identifier
ushort messageId; // published flag
bool isPublished;

SDK 默认方法

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

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

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

加上

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

XFMQTT.SubedEventHandler

向服务器发布 Topic 时触发

原型

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

MqttMsgSubscribedEventArgs 属性

        /// <summary>
/// Message identifier
/// </summary>
public ushort MessageId {get;set;} /// <summary>
/// List of granted QOS Levels
/// </summary>
public byte[] GrantedQoSLevels{get;set;} // message identifier
ushort messageId;
// granted QOS levels
byte[] grantedQosLevels;

SDK 默认写法

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

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

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

加上

client.SubedEventHandler += 发布消息时;

XFMQTT.UnSubedEventHandler

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

void 发送失败(object sender, MqttMsgUnsubscribedEventArgs )
{ }

MqttMsgUnsubscribedEventArgs 属性

        /// <summary>
/// Message identifier
/// </summary>
public ushort MessageId
{
get { return this.messageId; }
internal set { this.messageId = value; }
}

SDK 写法

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

我们自定义写

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

加上

client.UnSubedEventHandler += 发送失败;

XFMQTT.ConnectionClosedEventHandler

断开连接时触发

SDK 写法

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

自定义写

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

加上

client.ConnectionClosedEventHandler += 断开连接;

完整代码

        static void Main(string[] args)
{
// 创建连接对象
XFMQTT client = new XFMQTT("a1BiPoNawLI", "Raspberry");
// 初始化客户端配置
client.Init("2NOaBeqXcIzLQEhlJFEfKbWeug0o3m0c", "cn-shanghai");
// 要订阅的Topic
string[] topic = { client.CombineHeadTopic("PubData") }; // 使用自定义的委托事件
client.PubEventHandler += 收到消息;
client.PubedEventHandler += 重复收到消息;
client.SubedEventHandler += 发布消息时;
client.UnSubedEventHandler += 发送失败;
client.ConnectionClosedEventHandler += 断开连接;
// 连接服务器
client.ConnectMqtt(topic); while (true)
{
string str = Console.ReadLine(); // 推送内容到特定的 Topic
client.Subscribe(client.CombineHeadTopic("SubData"), str);
} Console.ReadKey();
}
public static void 收到消息(object sender, MqttMsgPublishEventArgs e)
{
Console.WriteLine("topic名称:"+e.Topic);
Console.WriteLine("接收时间:" + DateTime.Now.ToLongDateString());
Console.WriteLine("消息内容:\n"+Encoding.ASCII.GetString(e.Message));
}
public static void 重复收到消息(object sender, MqttMsgPublishedEventArgs e)
{
Console.WriteLine("接收时间: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("消息id: " + e.MessageId + " Is Published: " + e.IsPublished);
}
public static void 发布消息时(object sender, MqttMsgSubscribedEventArgs e)
{
Console.WriteLine("向服务器发送了消息");
Console.WriteLine("发送时间: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("消息id: " + e.MessageId);
Console.WriteLine("QOS 为 : " + Encoding.UTF8.GetString(e.GrantedQoSLevels));
}
public static void 发送失败(object sender, MqttMsgUnsubscribedEventArgs e)
{
Console.WriteLine("消息发送失败 ");
Console.WriteLine("时间: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("失败的消息 MessageId: " + e.MessageId);
}
public static void 断开连接(object sender, EventArgs e)
{
Console.WriteLine("日。。。连接断开了: " + DateTime.Now.ToLongTimeString());
}

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

    class Program
{
static void Main(string[] args)
{
// 创建连接对象
XFMQTT client = new XFMQTT("a1BiPoNawLI", "Raspberry");
// 初始化客户端配置
client.Init("2NOaBeqXcIzLQEhlJFEfKbWeug0o3m0c", "cn-shanghai");
// 要订阅的Topic
string[] topic = { client.CombineHeadTopic("PubData") }; // 使用自定义的委托事件
事件类 事件 = new 事件类();
client.PubEventHandler += 事件.收到消息;
client.PubedEventHandler += 事件.重复收到消息;
client.SubedEventHandler += 事件.发布消息时;
client.UnSubedEventHandler += 事件.发送失败;
client.ConnectionClosedEventHandler += 事件.断开连接;
// 连接服务器
client.ConnectMqtt(topic); while (true)
{
string str = Console.ReadLine(); // 推送内容到特定的 Topic
client.Subscribe(client.CombineHeadTopic("SubData"), str);
} Console.ReadKey();
}
}
public class 事件类
{
public void 收到消息(object sender, MqttMsgPublishEventArgs e)
{
Console.WriteLine("topic名称:" + e.Topic);
Console.WriteLine("接收时间:" + DateTime.Now.ToLongDateString());
Console.WriteLine("消息内容:\n" + Encoding.ASCII.GetString(e.Message));
}
public void 重复收到消息(object sender, MqttMsgPublishedEventArgs e)
{
Console.WriteLine("接收时间: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("消息id: " + e.MessageId + " Is Published: " + e.IsPublished);
}
public void 发布消息时(object sender, MqttMsgSubscribedEventArgs e)
{
Console.WriteLine("向服务器发送了消息");
Console.WriteLine("发送时间: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("消息id: " + e.MessageId);
Console.WriteLine("QOS 为 : " + Encoding.UTF8.GetString(e.GrantedQoSLevels));
}
public void 发送失败(object sender, MqttMsgUnsubscribedEventArgs e)
{
Console.WriteLine("消息发送失败 ");
Console.WriteLine("时间: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("失败的消息 MessageId: " + e.MessageId);
}
public void 断开连接(object sender, EventArgs e)
{
Console.WriteLine("日。。。连接断开了: " + DateTime.Now.ToLongTimeString());
}
}

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

 // 使用默认事件方法
client.UseDefaultEventHandler();
// 使用自定义的委托事件
事件类 事件 = new 事件类();
client.PubEventHandler += 事件.收到消息;
client.PubedEventHandler += 事件.重复收到消息;
client.SubedEventHandler += 事件.发布消息时;
client.UnSubedEventHandler += 事件.发送失败;
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. 【转载】“菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)

    既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...

  2. jQuery源代码框架思路

    開始计划时间读源代码,第一节jQuery框架阅读思路整理 (function(){ jQuery = function(){}; jQuery一些变量和函数和给jQuery对象加入一些方法和属性 ex ...

  3. UWP 新手教程2——怎样实现自适应用户界面

    系列文章 UWP新手教程1--UWP的前世今生 如上文所说的,布局面板依据可用的屏幕空间.指定界面元素的大小和位置. 比如StackPanel 会水平或垂直排列界面元素.Grid 布局与CSS 中的表 ...

  4. PandoraBox 支持3G无线上网卡(联通卡3G卡)(一)

    一:笔者采用的是系统是OpenWrt之PandoraBox,内核版本3.3.8:硬件设备是MTK的7620开发板. 其中怎么搭建openwrt开发环境在此不用多说,因为既然想实现3G无线上网卡拨号上网 ...

  5. iOS 内购遇到的坑

    一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...

  6. 2016/06/13 phpexcel 未完待续

    ①准备工作: 1,php版本不能太低 2,去官网下载PHPExcel插件    http://phpexcel.codeplex.com/ 3,解压后提取classes文件夹到工作目录,并重命名为PH ...

  7. liberOJ #2033. 「SDOI2016」生成魔咒 后缀数组

    #2033. 「SDOI2016」生成魔咒     题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 11.2 22 拼凑起来形成一个魔咒串 [1,2] [1, 2] ...

  8. java面试题(摘录)

    1.抽象,继承,封装,多态 2.基本数据类型的字节数 byte:1.int:4.char:2.long:8.float:4.double:8.boolean:1 和short:2 3.String , ...

  9. java 提高效率的做法

    可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代 ...

  10. Writing a Simple YARN Application 从hadoop生态抽出yarn ,单独使用yarn

    Apache Hadoop 2.9.1 – Hadoop: Writing YARN Applications https://hadoop.apache.org/docs/current/hadoo ...