物联网协议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为例,这里就定义三个重载方法,对于实际使用过程当中几乎可以覆盖相关场景,如果您还觉得不够,可以自行扩展以更好的贴近自己的实际需求。
| 序号 | 方法 | 参数说明 |
| 1 | Get(string url) | Get方法,默认消息类型为<see cref="CoAPMessageType.Confirmable"/> |
| 2 | Get(string url, CoAPMessageType msgType) | url,地址中的要素会被分解注入到Options中 msgType消息类型 |
| 3 | Get(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;}
| 序号 | 参数名 | 说明 |
| 1 | url | 请求地址 |
| 2 | msgType | 消息类型 |
| 3 | msgId | 消息id |
| 4 | token | 通信令牌 |
| 5 | method | 请求方法,如get、post、put、delete等 |
| 6 | options | 选项集合 |
| 7 | payload | 请求载荷,简单理解就是请求参数包 |
二、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、控制器寻址 总结 前言 在之前的博客内容中,关于在ASP.Net Co…...
java中如何使用Lambda表达式(一)
什么是Lambda表达式 Lambda 表达式(lambda expression)是一个匿名函数,基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个没有函数名的函数。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的镜像是由一系列的只读层组合而来,当启动一个容器时,Docker加载镜像的所有只读层&…...
2024獬豸杯完整Writeup
文章目录 手机手机基本信息- 1、IOS手机备份包是什么时候开始备份的。(标准格式:2024-01-20.12:12:12)手机基本信息- 2、请分析,该手机共下载了几款即时通讯工具。(标准格式:阿拉伯数字)手机基本信息- 3、手…...
Vue学习笔记之应用创建和基础知识
1、安装方式 CDN方式安装: <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2、创建应用 使用Vue内置对象创建一个应用,基本代码结构如下: <script src"https://unpkg.com/vue3/dist/…...
CSS3基础知识总结
目录 一、CSS3 边框 1.border-radius:圆角边框 2.box-shadow:添加阴影 3.border-image:图片边框 二、CSS3 渐变 1.线性渐变(Linear Gradients) a.由上到下(默认) b.从左到右 c.对角 d.使用角度 2.径向渐变(…...
80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据1
内容参考于:易道云信息技术研究院VIP课 上一个内容:升级Notice类获得背包基址-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:3be017de38c50653b…...
Python第三方扩展库NumPy
Python第三方扩展库NumPy NumPy(Numerical Python,注意使用时全部小写 numpy) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 在Windows平台上安装numpy,可在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头部。如果设置了,它将REMOTE_ADDR设置为HTTP_X_FORWARDED_FOR的值。这通常用于处理Web服务器位于代理后面的情况。 如果URL中未设置host参数,它使用highlight_file(__FILE__);来显示PHP文件的源代码…...
Qt Design Studio+Pyside项目
Qt Design Studio设计出的项目结构有多个层级的目录,我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed,将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中内置了一下函数: 函数名称描述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 的组件库,是对饿了么团队的 Element UI 组件库的升级版本。Element Plus 的目标是提供一套更为现代、更好用的 Vue.js UI 组件。 导入 1.1 执行命令: npm install element-plus --save 1.2 在main.js中做如下配置import E…...
Fastbee物联网项目新手快速入门
一,前提条件 后端环境准备如下: 正式环境推荐硬件资源最低要求4c8G,硬盘40G。JDK 1.8.0_2xx (需要小版本号大于200) 。Maven3.6.3。(IDEA启动时使用IDEA默认自带的版本即可)。 启动fastbee之前,请先确定…...
Linux 网络流量相关工具
本文聚焦于网络流量的查看、端口占用查看。至于网络设备的管理和配置,因为太过复杂且不同发行版有较大差异,这里就不赘述,后面看情况再写。 需要注意的是,这里列出的每一个工具都有丰富的功能,流量/端口信息查看只是其…...
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表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&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节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
