装修效果图网站推荐,wap浏览器,东莞网站建设怎么收费,asp.net如何设置网站的图标目录 前言
一、CoapClient相关类介绍
1、CoapClient类图
2、CoapClient的设计与实现
3、SendMessage解析
二、Client调用分析
1、创建CoapClient对象
2、实际发送请求
3、Server端请求响应
4、控制器寻址
总结 前言 在之前的博客内容中#xff0c;关于在ASP.Net Co…
目录 前言
一、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/// 服务端回应请求/// /summarypublic MessageTransmit Response;/// summary/// 发起请求/// /summarypublic MessageTransmit Request;private byte[] _token;/// summary/// 统一通信Token/// /summarypublic byte[] Token { get _token; set _token value; } 通过代码可以看到在CoapClient中定义了请求和响应对象以及token对象。 在这个类当中不仅定义了Client的相关属性同时还定义了丰富的方法基本上是围绕Get、Post、Put、Delete等四个方法当中。下面来详细介绍一下 以Get为例这里就定义三个重载方法对于实际使用过程当中几乎可以覆盖相关场景如果您还觉得不够可以自行扩展以更好的贴近自己的实际需求。
序号方法参数说明1Get(string url) Get方法默认消息类型为see crefCoAPMessageType.Confirmable/2Get(string url, CoAPMessageType msgType) url地址中的要素会被分解注入到Options中 msgType消息类型 3Get(string url, CoAPMessageType msgType, IListCoAPOption options) url地址中的要素会被分解注入到Options中 msgType消息类型 options 选项集合 当然不论是Get还是Post方法其底层其实都用调用SendMessage()方法因此SendMessage才是核心的方法。
3、SendMessage解析
以下是核心的发送消息的方法代码如下
/// summary/// /summary/// param nameurl地址中的要素会被分解注入到Options中,参见see crefGet(string, CoAPMessageType, IList{CoAPOption})//param/// param namemsgType消息类型默认为see crefCoAPMessageType.Confirmable//param/// param namemsgId/param/// param nametoken/param/// param namemethod/param/// param nameoptions/param/// param namepayload/param/// returns/returnspublic ushort SendMessage(string url, CoAPMessageType msgType, ushort msgId, byte[] token, CoAPRequestMethod method, IListCoAPOption 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消息id4token通信令牌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?type1,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的调用机制有更深的了解和掌握。行文仓促难免有疏漏和不当之处如果不足欢迎各位朋友在评论区之处。