物联网协议Coap中Californium CoapClient解析

目录

前言

一、CoapClient对象

1、类定义

2、Client方法调用

二、发送请求

1、构建请求

 2、发起请求

3、接收响应

总结


前言

        在之前的博客中物联网协议Coap之Californium CoapServer解析,文中简单介绍了CoapServer的实现。在物联网开发环境中,除了Server端需要定义,很多的开发场景是在客户端的开发,这涉及设备端的交互,比如传感器的数据采集,需要通过Client的put方法进行采集数据的提交,同时通过get方法获取服务器端的指令,然后在Client端进行采集。

        本次我们简单来看看CoapClient的具体实现,博文将继续采用面向对象分析的方法,结合类图、实际代码、时序图来讲讲解CoapClient类,方便了解和掌握其相关的配置,同时掌握其运行原理。在实际的终端开发中有的放矢。行文仓促,定有不当之处,欢迎各位读者批评指正,再此感谢。

一、CoapClient对象

        在Coap的世界中,并不是像http协议一样,只要是浏览器就能发http请求,Coap需要实现对应的CoapClient,以此来跟Server建立通讯,实现数数据的提交,服务的交互。

1、类定义

        在CoapClient的构造方法中,有三种构造的方式:

/*** Constructs a new CoapClient that sends requests to the specified URI.** @param uri the uri*/public CoapClient(String uri) {this.uri = uri;}/*** Constructs a new CoapClient that sends request to the specified URI.* * @param uri the uri*/public CoapClient(URI uri) {this(uri.toString());}/*** Constructs a new CoapClient with the specified scheme, host, port and* path as URI.** @param scheme the scheme* @param host the host* @param port the port* @param path the path*/public CoapClient(String scheme, String host, int port, String... path) {StringBuilder builder = new StringBuilder().append(scheme).append("://").append(host).append(":").append(port);for (String element : path) {builder.append("/").append(element);}this.uri = builder.toString();}

2、Client方法调用

        在CoapClient中,定义了包括get、put、delete、post等方法的定义,在这里只是进行入口函数的编写。下节将重点讲解,在CoapClient中如何进行相应请求的发送。


// Asynchronous GET/*** Sends a GET request and invokes the specified handler when a response* arrives.** @param handler the Response handler*/public void get(CoapHandler handler) {asynchronous(newGet().setURI(uri), handler);}/*** Sends aGET request with the specified Accept option and invokes the* handler when a response arrives.* * @param handler the Response handler* @param accept the Accept option*/public void get(CoapHandler handler, int accept) {asynchronous(accept(newGet().setURI(uri), accept), handler);}// Synchronous POST/*** Sends a POST request with the specified payload, the specified content* format and accept and invokes the specified handler when a response* arrives.* * @param handler the Response handler* @param payload the payload* @param format the Content-Format* @param accept the Accept option*/public void post(CoapHandler handler, byte[] payload, int format, int accept) {asynchronous(accept(format(newPost().setURI(uri).setPayload(payload), format), accept), handler);}/*** Sends a PUT request with the specified payload and the specified content* format and invokes the specified handler when a response arrives.* * @param handler the Response handler* @param payload the payload* @param format the Content-Format*/public void put(CoapHandler handler, byte[] payload, int format) {asynchronous(format(newPut().setURI(uri).setPayload(payload), format), handler);}/*** Sends a DELETE request and invokes the specified handler when a response* arrives.** @param handler the response handler*/public void delete(CoapHandler handler) {asynchronous(newDelete().setURI(uri), handler);}

二、发送请求

        在构建好CoapClient对象后,就可以往目标服务器提交请求并获取响应结果了。这里详细讲解在Coap中如何进行请求的发送。下面是之前创建CoapClient以及发送get请求的关键代码:

URI uri = null;
//coap://127.0.0.1:5683/core/time?type=1
uri = new URI("coap://localhost:5683/hello"); // 创建一个资源请求hello资源,注意默认端口为5683
//uri = new URI("coap://127.0.0.1:5683/core/time?type=1");
CoapClient client = new CoapClient(uri);
CoapResponse response = client.get();

1、构建请求

通过代码跟踪和时序图,以发送get请求为例,来看看底层究竟是怎么运行的。

第一步,在调用get()方法时,进入以下函数:

第二步,进入核心的请求函数

        默认情况下,我们没有给请求设置超时时间,因此它会根据配置文件加载默认的超时时间。然后根据请求方式和携带的参数,都封装到request对象中。

这里可以看到get请求携带的参数如下:

CON-GET    MID=   -1, Token=null, OptionSet={"Uri-Host":"localhost", "Uri-Path":"hello"}, no payload

 2、发起请求

 在这里,通过endPoint对象来进行发送。org.eclipse.californium.core.network.CoapEndpoint中的sendRequest方法。最终的请求参数如下:

@Overridepublic void sendRequest(final Request request) {// create context, if not already setrequest.prepareDestinationContext();// always use endpoint executorrunInProtocolStage(new Runnable() {@Overridepublic void run() {coapstack.sendRequest(request);}});}

可以看到,在发送请求的时候,是开启了一个线程池来进行请求发送。

        在org.eclipse.californium.core.network.stack.BaseCoapStack

3、接收响应

ACK-2.05   MID=20132, Token=[643cec40ed6f22c6], OptionSet={"Content-Format":"text/plain"}, "Hello CoAP!This is from ".. 40 bytes

可以看到,通过response对象就可以正常获取从服务端返回的响应信息。

总结

        以上就是本文的主要内容,本文将继续采用面向对象分析的方法,结合类图、实际代码、时序图来讲讲解CoapClient类,方便了解和掌握其相关的配置,同时掌握其运行原理。在实际的终端开发中有的放矢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/333842.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小红书算法流量机制总结,建议收藏!

新手在运营小红书账号时,总会发现这样的情况。辛辛苦苦写了一篇自以为很优质的笔记,发布后却发现流量寥寥。这就是没弄清小红书算法造成的。今天和大家来分享下小红书算法流量机制总结,建议收藏! 一、什么是小红书算法 我们常说的…

Qt QLineEdit文本框控件

文章目录 1 属性和方法1.1 占位字符串1.2 对齐方式1.3 回显模式1.4 读写控制1.5 格式控制1.6 信号和槽 2 实例2. 布局2.2 代码实现 QLineEdit 是Qt 中的文本框,准确地说是单行文本框,通常用于接受用户的输入。 比如用户输入用户名、密码等,都…

【Internal Server Error】pycharm解决关闭flask端口依然占用问题

Internal Server Error The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. 起因: 我们在运行flask后,断开服务依然保持运行&#xff0…

四川思维跳动:抖音能不能根据弹幕找到人?

在抖音这样的社交媒体平台上,用户可以通过发布抖音短视频与其他用户互动和交流。其中,弹幕是一种常见的互动方式,用户可以通过发送弹幕来表达对视频的评论、喜爱或者提问。然而,有用户担心自己的隐私可能因为弹幕内容被泄露&#…

【Java EE初阶九】多线程案例(线程池)

一、线程池的引入 引入池---->主要是为了提高效率; 最开始,进程可以解决并发编程的问题,但是代价有点大了,于是引入了 “轻量级进程” ---->线程 线程也能解决并发编程的问题,而且线程的开销比进程要小的多&…

网站被挂黑链怎么办

网站被挂黑链这种事情总是防不胜防,且不说网站本身的安全防护做的是否到位,但只要被盯上了就难逃厄运。即使是企业机构的网站也难逃被黑的经历,更何况用户苦心经营的网站,因此首先需要正确看待挂黑链这个现象,网站被挂…

希尔顿花园酒店喜迎入华十周年里程碑

【2024年1月8日,中国,上海】作为希尔顿集团旗下标志性高端精选服务酒店品牌,希尔顿花园酒店于今年正式迎来其在华经营十周年的里程碑。自2014年中国首家希尔顿花园酒店在深圳开业以来,中国市场已经成为希尔顿花园酒店全球增长的重…

selenium python 实现基本自动化测试的示例代码

安装selenium 打开命令控制符输入:pip install -U selenium 火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回…

ubuntu系统(9):ubuntu 20.02安装pydot

目录 警告信息 1、确保安装了Python和pip 2、安装Graphviz软件包 3、pip安装pydot 验证 在gem5中,pydot库用于生成图形化输出,特别是生成.dot文件和相关的图像文件,如PDF、PNG等。它与gem5结合使用的一个常见用途是生成系统结构图、内存…

多目标loss平衡和多目标融合推理

多目标loss平衡: 优化方法更多的考虑的是在已有结构下,更好地结合任务进行训练和参数优化,它从Loss与梯度的维度去思考不同任务之间的关系。在优化过程中缓解梯度冲突,参数撕扯,尽量达到多任务的平衡优化。 GradNorm …

软件工程:用例图相关知识和多实例分析

目录 一、用例图相关知识 1. 基本介绍 2. 常用符号 二、用例图实例分析 1. 新闻管理系统 2. 医院病房监护系统 3. 实验上机安排系统 4. 远程网络教学系统 一、用例图相关知识 1. 基本介绍 用例图(use case diagram)是用户与系统交互的最简表示…

Python 安卓开发:Kivy、BeeWare、Flet、

kivy:https://github.com/kivy python-for-android :https://python-for-android.readthedocs.io/en/latest/ BeeWare:https://docs.beeware.org/en/latest/ Flet:https://github.com/flet-dev/flet 把 PySide6 移植到安卓上去&a…