.NET Core 跨平台物联网开发:设置委托事件(二)

系列教程目录

(一) 连接阿里云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 += 事件.断开连接;

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

原文地址:https://www.cnblogs.com/whuanle/p/10786991.html

时间: 2024-10-10 21:14:27

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

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

系列教程目录 (一) 连接阿里云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示例 AliI

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

系列教程目录 (一) 连接阿里云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示例 本章使用

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

系列教程目录 (一) 连接阿里云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示例 本章示例

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

一.课程介绍 人生苦短,我用.NET Core!大家都知道如果想要程序一直运行在Windows服务器上,最好是把程序写成Windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动.今天阿笨将给大家带来实如何利用.NET Core跨平台开发技术在Windows操作系统平台上开发我们的Windows服务应用程序以及在Linux操作系统上部署我们的守护进程(daemon)服务,真真的体现.NET Core的跨平台强大之处: 实现一次编译,多平台部

.NET Core跨平台:使用.NET Core开发一个初心源商城总括

1..NET Core基本介绍 a 作为一个.NET的开发者,在以前的开发中,我们开发的项目基本都是部署在windows服务器上,但是在windows服务器上的话某些比较流行的解决访问量的方案基本都是先出现在linux上,而后才能迁移出现windows上,而且效率处理方面也不再一个级别.曾经让.NET的开发者非常无奈可又不得不遵循,随着时间的推移,后来第三方公司开发了.NET可以依赖跨平台的技术Mono,我们可以简单地对其开发的程序实现跨平台.关于Mono部署ASP.NET跨平台的技术我曾经写过

.NET Core多平台开发体验[1]: Windows

微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的.NET程序员,相信传统的.NET应用的开发方式已经深深地烙印在你的脑子里面..NET Core打来了全新的开发体验,但是开发方式的差异根本不足以成为你快速跨入.NET Core 世界的门槛,因为在.NET Core在很多方面比传统的.NET Framework应用开发要简单.为了消除很多尚未接触过

【新书推荐】《微软开源跨平台移动开发实践》带你走近微软开源开源跨平台技术

上周收到本书作者李争送的一本12月份的新书<微软开源跨平台移动开发实践——利用ASP.NET Core 1.0 .Apache Cordova.Xamarin和Azure快速构建移动应用解决方案>.这本书的名字超长.这本书也是超薄,只有220页,一个周末时间就读完了,但是这本书的内容确是超丰富,浓缩了微软这三年向开源和跨平台领域的转变,微软在开源和跨平台领域构建出来的一套技术体系.从服务端的NET Core.ASP.NET 和 Web APi ,到Web端的 Typescript脚本语言,再到

【新书推荐】《微软开源跨平台移动开发实践》--带你走近微软开源开源跨平台技术

上周收到本书作者李争送的一本12月份的新书<微软开源跨平台移动开发实践——利用ASP.NET Core 1.0 .Apache Cordova.Xamarin和Azure快速构建移动应用解决方案>.这本书的名字超长.这本书也是超薄,只有220页,一个周末时间就读完了,但是这本书的内容确是超丰富,浓缩了微软这三年向开源和跨平台领域的转变,微软在开源和跨平台领域构建出来的一套技术体系.从服务端的NET Core.ASP.NET 和 Web APi ,到Web端的 Typescript脚本语言,再到

应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案

SSIO的更新 在SSIO上增加了UDP通讯方式,可以到Github上下载源代码.在原来的项目中,远端的设备与中心站的数据交互并没有使用过UDP方式.这种短连接的通讯链路,不容易维护,主要体现在:(1)持续的数据交互能力.(2)对现场设备进行长时间的维护和校准.(3)SSIO要协调设备.IO和控制方式之间的运作关系,无法即时反应设备的IO状态.等等. 但是,对于一个平台来讲,UDP的通讯方式是应该具有的,根据现场情况选择是否应用.例如:远端的设备定时发送设备状态信息等,可以使用UDP的通讯方式,