当前位置: 首页 > news >正文

物联网协议Coap之C#基于Mozi的CoapClient调用解析

目录

前言

一、CoapClient相关类介绍

1、CoapClient类图

2、CoapClient的设计与实现

3、SendMessage解析

二、Client调用分析

1、创建CoapClient对象

2、实际发送请求

3、Server端请求响应

4、控制器寻址

总结 


前言

        在之前的博客内容中,关于在ASP.Net Core当中使用Coap协议进行开发进行一篇博文的探讨物联网协议Coap之C#基于Mozi的CoapServer实现解析。这边博文主要是讲解了在ASP .Net Core当中如何使用C#编程语言进行CoapServer的实现,对其涉及的相关类进行了简单的讲解,相信大家对其实现和协议实现由了一定的认识。但是基于C#的Client的设计与实现,以及详细的调用方式并没有进行讲解。

        本文是上篇博客的继续介绍篇,依然使用ASP .NET Core,采用C#编程语言进行开发,重点介绍CoapClient的C#代码实现以及使用Get方法实际发送请求,详细阐述与CoapServer端的交互调用。便于各位读者在使用过程中对Coap的调用机制有更深的了解和掌握。

一、CoapClient相关类介绍

        在Coap中,无论是使用Java进行开发,还是C#,或者使用PHP,必须要使用Client对象进行请求的发送,即Get、Post、Put、Delete四种请求。因此在C#中有必要对CoapClient进行一下简单介绍,同时可以对比一些在不同的编程语言中,实现上的有所区别。

1、CoapClient类图

        第一步来看一下CoapClient的类图,详细如下图所示:

         相信看过CoapServer的设计的朋友们一定记得,CoapServer的父类是什么?不记得的不要紧,下面将贴出重点代码:

 public class CoAPServer : CoAPPeer

        是的,各位没有看错,CoapServer也是CoAPPeer的子类,其实不管是客户端还是服务端,都是需要进行通讯的,二CoAPPeer就承接了这部分工作的。

        CoAPPeer是对等的,双方都需要实现协议中共同的部分。

2、CoapClient的设计与实现

        言归正传,这里还是要把CoapClient类的设计好好介绍一下,毕竟Client负责了所有终端与服务端的交互。也非常有必要介绍一下这位主角。

 public class CoAPClient : CoAPPeer{private bool _randomPort = true;private CoAPTransmissionConfig _transConfig = new CoAPTransmissionConfig();private MessageCacheManager _cacheManager;private ulong _packetReceived;//private ushort _remotePort = CoAPProtocol.Port;//private string _remotehost = "";/ <summary>/ 远端服务器地址/ </summary>//public string RemoteAddress { get { return _remotehost; } protected set { _remotehost = value; } }/ <summary>/ 远端服务器端口/ </summary>//public ushort RemotePort { get { return _remotePort; } protected set { _remotePort = value; } }/// <summary>/// 服务端回应请求/// </summary>public MessageTransmit Response;/// <summary>/// 发起请求/// </summary>public MessageTransmit Request;private byte[] _token;/// <summary>/// 统一通信Token/// </summary>public byte[] Token { get => _token; set => _token = value; }

        通过代码可以看到,在CoapClient中,定义了请求和响应对象,以及token对象。 在这个类当中,不仅定义了Client的相关属性,同时还定义了丰富的方法,基本上是围绕Get、Post、Put、Delete等四个方法当中。下面来详细介绍一下:

        以Get为例,这里就定义三个重载方法,对于实际使用过程当中几乎可以覆盖相关场景,如果您还觉得不够,可以自行扩展以更好的贴近自己的实际需求。

序号方法参数说明
1Get(string url) Get方法,默认消息类型为<see cref="CoAPMessageType.Confirmable"/>
2Get(string url, CoAPMessageType msgType)

url,地址中的要素会被分解注入到Options中

msgType消息类型

3Get(string url, CoAPMessageType msgType, IList<CoAPOption> options)

url,地址中的要素会被分解注入到Options中

msgType消息类型

options 选项集合

        当然,不论是Get还是Post方法,其底层其实都用调用SendMessage()方法,因此SendMessage才是核心的方法。

3、SendMessage解析

以下是核心的发送消息的方法,代码如下:

/// <summary>/// </summary>/// <param name="url">地址中的要素会被分解注入到Options中,参见<see cref="Get(string, CoAPMessageType, IList{CoAPOption})"/></param>/// <param name="msgType">消息类型,默认为<see cref="CoAPMessageType.Confirmable"/></param>/// <param name="msgId"></param>/// <param name="token"></param>/// <param name="method"></param>/// <param name="options"></param>/// <param name="payload"></param>/// <returns></returns>public ushort SendMessage(string url, CoAPMessageType msgType, ushort msgId, byte[] token, CoAPRequestMethod method, IList<CoAPOption> options, byte[] payload){CoAPPackage cp = new CoAPPackage{Code = method,Token = token,MesssageId = msgId,MessageType = msgType ?? CoAPMessageType.Confirmable};UriInfo uri = UriInfo.Parse(url);if (!string.IsNullOrEmpty(uri.Url)){if (cp.Code == CoAPRequestMethod.Post || cp.Code == CoAPRequestMethod.Put){cp.Payload = payload;}//注入URI信息cp.SetUri(uri);//发起通讯if (!string.IsNullOrEmpty(uri.Host)){if (options != null){foreach (var opt in options){cp.SetOption(opt.Option, opt.Value);}}SendMessage(uri.Host, uri.Port == 0 ? CoAPProtocol.Port : uri.Port, cp);}else{throw new Exception($"DNS无法解析指定的域名:{uri.Domain}");}}else{throw new Exception($"分析链接地址:{url}时出错,请检查URL地址是否合法");}return cp.MesssageId;}
序号参数名说明
1url请求地址
2msgType消息类型
3msgId消息id
4token通信令牌
5method请求方法,如get、post、put、delete等
6options选项集合
7payload请求载荷,简单理解就是请求参数包

二、Client调用分析

        CoapClient的请求调用,在C#中的实现与Java是类似的,也是要创建CoapClient对象,然后向Server端发送请求,下面会针对这个调用流程进行介绍。

1、创建CoapClient对象

        创建client对象的关键代码如下:

CoAPClient cc = new CoAPClient();
//本地端口
cc.SetPort(12340);cc.Response += new MessageTransmit((x, y, z) => {Console.ForegroundColor = ConsoleColor.DarkGreen;Console.WriteLine(z.ToString(CoAPPackageToStringType.HttpStyle));Console.ForegroundColor = ConsoleColor.Gray;
});
cc.Request += new MessageTransmit((x, y, z) =>
{Console.WriteLine(z.ToString(CoAPPackageToStringType.HttpStyle));
});cc.Start();

         这里与CoapServer的启动流程是一样的,同样会创建Udp的Socket,然后绑定endPoint。这样即完成了CoapClient对象的创建及启动准备。

2、实际发送请求

        在创建了Client对象和启动后,即可进行相应方法的调用。下面以get方法为例,调用一个之前我们用C#写好的一个Resource,访问代码如下:

cc.Get("coap://127.0.0.1:5683/core/time?type=1",CoAPMessageType.Confirmable);

         然后调用下面的消息发送方法进行消息的发送。

 调用Socket对象进行消息的发送。

3、Server端请求响应

        以上步骤一个请求就已经发往了Server,下面来看一下Server端的Resoure寻址过程。首先在CoapServer当中,有一个Socket_AfterReceiveEnd的方法,用来接收请求,如下过程进行请求包的一个解析和转换。

         这里很关键,这里就是把之前通过ResourceManager管理器统一管理的控制器进行获取,类似与Java当中反射和IOC的概念。这里千万要理解。

4、控制器寻址

        在上面的过程当中会调用Invoke方法进行反射调用方法,下面来具体看一下控制器寻址怎么实现的。首先在Invoke的之后,实际会调用下面的管理器核心方法。

        这个方法是定义在ResourceManager这个类当中的。然后根据请求路径去IOC容器中寻找匹配的资源对象。

 随后完成实际方法的调用,一气呵成。这种调用方法与java的反射有异曲同工之处。

总结 

        以上就是本文的主要内容, 本文是上篇博客的继续介绍篇,依然使用ASP .NET Core,采用C#编程语言进行开发,重点介绍CoapClient的C#代码实现以及使用Get方法实际发送请求,详细阐述与CoapServer端的交互调用。便于各位读者在使用过程中对Coap的调用机制有更深的了解和掌握。行文仓促,难免有疏漏和不当之处,如果不足,欢迎各位朋友在评论区之处。

相关文章:

物联网协议Coap之C#基于Mozi的CoapClient调用解析

目录 前言 一、CoapClient相关类介绍 1、CoapClient类图 2、CoapClient的设计与实现 3、SendMessage解析 二、Client调用分析 1、创建CoapClient对象 2、实际发送请求 3、Server端请求响应 4、控制器寻址 总结 前言 在之前的博客内容中&#xff0c;关于在ASP.Net Co…...

java中如何使用Lambda表达式(一)

什么是Lambda表达式 Lambda 表达式&#xff08;lambda expression&#xff09;是一个匿名函数&#xff0c;基于数学中的λ演算得名&#xff0c;直接对应于其中的lambda抽象&#xff08;lambda abstraction&#xff09;&#xff0c;是一个没有函数名的函数。Lambda表达式可以表…...

C++继承详解

继承 1. 继承的概念和定义1.1 继承的概念1.2 继承的定义1.2.1 继承的格式1.2.2 继承方式 2. 基类和派生类对象的赋值转换3.继承中的作用域4. 继承中的默认成员函数5. 继承和友元6. 继承和静态成员 1. 继承的概念和定义 1.1 继承的概念 继承是面向对象编程中的一个重要概念&…...

docker数据卷的使用

文章目录 1、数据卷产生背景2、数据卷的使用2.1、创建数据卷2.2、挂载数据卷2.3、共享数据卷2.4、删除数据卷2.5、备份和迁移数据卷 总结 1、数据卷产生背景 Docker的镜像是由一系列的只读层组合而来&#xff0c;当启动一个容器时&#xff0c;Docker加载镜像的所有只读层&…...

2024獬豸杯完整Writeup

文章目录 手机手机基本信息- 1、IOS手机备份包是什么时候开始备份的。&#xff08;标准格式&#xff1a;2024-01-20.12:12:12)手机基本信息- 2、请分析&#xff0c;该手机共下载了几款即时通讯工具。&#xff08;标准格式&#xff1a;阿拉伯数字&#xff09;手机基本信息- 3、手…...

Vue学习笔记之应用创建和基础知识

1、安装方式 CDN方式安装&#xff1a; <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2、创建应用 使用Vue内置对象创建一个应用&#xff0c;基本代码结构如下&#xff1a; <script src"https://unpkg.com/vue3/dist/…...

CSS3基础知识总结

目录 一、CSS3 边框 1.border-radius&#xff1a;圆角边框 2.box-shadow&#xff1a;添加阴影 3.border-image&#xff1a;图片边框 二、CSS3 渐变 1.线性渐变(Linear Gradients) a.由上到下&#xff08;默认&#xff09; b.从左到右 c.对角 d.使用角度 2.径向渐变(…...

80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据1

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级Notice类获得背包基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;3be017de38c50653b…...

Python第三方扩展库NumPy

Python第三方扩展库NumPy NumPy(Numerical Python&#xff0c;注意使用时全部小写 numpy) 是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 在Windows平台上安装numpy&#xff0c;可在cmd命令…...

Dockerfile简介和基础实践

文章目录 1、Dockerfile简介1.1、Dockerfile解决的问题1.2、docker build 构建流程1.3、关键字介绍 2、Dockerfile 实践2.1、基本语法实践 --- golang2.1.1 问题检查 2.2、基本语法实践 --- gcc 总结 1、Dockerfile简介 Dockerfile是一个创建镜像所有命令的文本文件, 包含了一…...

3分钟 docker搭建 帕鲁服务器

1. 安装docker 1.安装依赖环境 yum -y install yum-utils device-mapper-persistent-data lvm22.设置镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.安装docker 3.1 yum makecache fast yum install docker-ce …...

[BUUCTF 2018]Online Tool(特详解)

这段代码块检查请求中是否设置了HTTP_X_FORWARDED_FOR头部。如果设置了&#xff0c;它将REMOTE_ADDR设置为HTTP_X_FORWARDED_FOR的值。这通常用于处理Web服务器位于代理后面的情况。 如果URL中未设置host参数&#xff0c;它使用highlight_file(__FILE__);来显示PHP文件的源代码…...

Qt Design Studio+Pyside项目

Qt Design Studio设计出的项目结构有多个层级的目录&#xff0c;我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed&#xff0c;将content加入importPath后还是报同样的错误。 Qt Design Studio生成的文件包含了.qm…...

软件门槛之算法

软件门槛之算法 1.背景2.算法定义3.特征4.基本要素5.常用设计模式6.常用实现方法7.复杂度时间复杂度空间复杂度8.分类9.算法常用的一些工具10.算法的检验标准1.背景 一入行业深似海 再回首已是白发生! 工作这么多年了,感觉算法是比较难搞的。 写代码最重要的可能是框架和算法…...

第八篇【传奇开心果系列】beeware的toga开发移动应用示例:实现消消乐安卓手机小游戏

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、初步实现四、扩展思路五、实现游戏逻辑示例代码六、实现界面设计示例代码七、实现增加关卡和难度示例代码八、实现存档和排行榜示例代码九、实现添加特殊方块和道具示例…...

【MySQL】MySQL内置函数--日期函数/字符串函数/数学函数/其他相关函数

文章目录 1.日期函数2.字符串函数3.数学函数4.其它函数 1.日期函数 MySQL中内置了一下函数&#xff1a; 函数名称描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date,interval d_value_t…...

应急响应红蓝工程师白帽子取证Linux和windows入侵排查还原攻击痕迹,追溯攻击者,以及各种木马和病毒以及恶意脚本文件排查和清除

应急响应红蓝工程师白帽子取证Linux入侵排查还原攻击痕迹,追溯攻击者,以及各种木马和病毒以及恶意脚本文件排查和清除。 一般服务器被入侵的迹象,包括但不局限于:由内向外发送大量数据包(DDOS肉鸡)、服务器资源被耗尽(挖矿程序)、不正常的端口连接(反向shell等)、服务…...

vue项目使用element-plus

介绍 1.element Plus 是一套基于 Vue.js 的组件库&#xff0c;是对饿了么团队的 Element UI 组件库的升级版本。Element Plus 的目标是提供一套更为现代、更好用的 Vue.js UI 组件。 导入 1.1 执行命令: npm install element-plus --save 1.2 在main.js中做如下配置import E…...

Fastbee物联网项目新手快速入门

一&#xff0c;前提条件 后端环境准备如下&#xff1a; 正式环境推荐硬件资源最低要求4c8G&#xff0c;硬盘40G。JDK 1.8.0_2xx (需要小版本号大于200) 。Maven3.6.3。&#xff08;IDEA启动时使用IDEA默认自带的版本即可&#xff09;。 启动fastbee之前&#xff0c;请先确定…...

Linux 网络流量相关工具

本文聚焦于网络流量的查看、端口占用查看。至于网络设备的管理和配置&#xff0c;因为太过复杂且不同发行版有较大差异&#xff0c;这里就不赘述&#xff0c;后面看情况再写。 需要注意的是&#xff0c;这里列出的每一个工具都有丰富的功能&#xff0c;流量/端口信息查看只是其…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...