当前位置: 代码网 > it编程>编程语言>Asp.net > 物联网协议Coap之C#基于Mozi的CoapClient调用解析

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

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

目录

前言

一、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的调用机制有更深的了解和掌握。行文仓促,难免有疏漏和不当之处,如果不足,欢迎各位朋友在评论区之处。

(0)

相关文章:

  • 【深入浅出C#】文件和输入输出操作:文件读写和流操作

    【深入浅出C#】文件和输入输出操作:文件读写和流操作

    在计算机编程中,文件读写和流操作是非常重要的主题。文件读写允许我们将数据存储到文件中或从文件中读取数据,是持久化数据的常见方式。在C#中,我们可以使用文件流来进... [阅读全文]
  • C#编写Socket服务器

    由Socket慨念,Socket一般应用模式,Socket的通讯过程,再逐步深入到项目界面设计,程序编码,叫你一步步实现用C#编写Socket服务器,代码全部都有注释。…

    2024年08月06日 编程语言
  • 基于C#的上位机开发第一期:S7.NET

    的的判断可以帮助我门在变量值改变时才启动数据转化操作,如果没有这种判断会损耗性能,加大程序的工作量。Rack:它包含PLC 的机架,您可以在 Step7 的硬件配置中找到该机架,可…

    2024年08月06日 编程语言
  • 记录|C# winform布局学习

    记录|C# winform布局学习

    C#5分钟winform快速自适应布局参考文章:其他参考:写这篇文章,主要是我发现自己的界面太丑了,我受不了。而且项目运行后,winform窗口是窗口,放大后又... [阅读全文]
  • c#引入nuget包到本地

    c#引入nuget包到本地

    当你在C#项目中引用了外部库或NuGet包时,这些依赖项通常会被下载到本地的NuGet缓存(通常是用户的个人文件夹中的.nuget/packages目录),而不... [阅读全文]
  • C# 基于Quartz.Net实现定时任务

    C# 基于Quartz.Net实现定时任务

    大家好,我是不自由的小码,这次要给大家分享的是基于Quartz.Net实现定时任务。timer这个东西相信大家都不会陌生,然而,timer的局限性,注定了在复杂... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com