物联网协议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方法。最终的请求参数如下:

@Override
	public void sendRequest(final Request request) {
		// create context, if not already set
		request.prepareDestinationContext();
		// always use endpoint executor
		runInProtocolStage(new Runnable() {
			@Override
			public 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类,方便了解和掌握其相关的配置,同时掌握其运行原理。在实际的终端开发中有的放矢。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git安装教程 Windows 附安装包链接

Git是一款分布式源代码管理工具(版本控制工具) 。 git的作用 当你需要做一个大工程的时候,文件的管理无疑是非常庞大的工作,因为你需要不断的修改更新文件内容,同时可能还要保留旧版本保证可以复原,这样就需要备份多个版本的文件…

【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)

文章目录 1. 备份 SD/TF 卡为镜像文件2. 压缩镜像文件2.1. 多分区镜像文件的压缩(树莓派、普通 linux 系统等)2.2. 单分区镜像文件的压缩(Nvidia Jetson Nano 等) 3. 还原镜像文件到 SD/TF 卡4. 镜像还原后处理4.1. 镜像分区调整4…

【MySQL】:用户管理

用户管理 一.用户1.用户信息2.创建用户3.修改密码4.删除用户 二.数据库权限1.给用户授权2.回收权限 如果在以下操作中出现以下报错 可以使用刷新权限 一.用户 1.用户信息 MySQL中的用户,都存储在系统数据库mysql的user表中。 字段解释: host&#xff…

基于SSM+Vue的学校社团管理系统(Java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

基于代理IP的多线程爬虫实现

目录 前言 1. 爬虫的基本原理 2. 多线程爬虫的优势 3. 代理IP的应用 4. 基于代理IP的多线程爬虫实现 步骤1:导入必要的模块 步骤2:定义爬虫函数 步骤3:创建线程并启动爬虫 总结 前言 本文将介绍如何使用Python编写一个基于代理IP的多…

UR机器人旋转矢量和俯仰角的转换

我们在使用机器人的时候,总是习惯使用俯仰角来描述机器人末端姿态的变换。这样更直观,但是机器人为了插值方便计算,总是采用旋转矢量来来描述机器人的姿态。该旋转矢量及不直观,单一轴角度旋转时还可以理解,当两个轴或…

少儿编程 2023年12月中国电子学会图形化编程等级考试Scratch编程四级真题解析(判断题)

2023年12月scratch编程等级考试四级真题 判断题 11、创建自制积木时,参数只能添加数字和文本 答案:错 考点分析:考查自制积木的使用,创建自制积木的时候参数可以是数字、文本以及布尔值类型;所以答案错误 12、分查找是我们经常用的查找方式,它比顺序查找效率更高,比如…

前端中什么是DOM对象

DOM(文档对象模型)是一种编程接口,用于HTML和XML文档。它提供了一种将文档结构表示为树结构的方式,这使得程序和脚本能够动态地访问和更新文档的内容、结构和样式。 在前端开发中,DOM是非常重要的概念。当浏览器加载网…

高级别智能驾驶业务系列:港口作业仿真系统

在港口无人水平运输场景中,经纬恒润提供了车、路、网、云、图全栈式自研解决方案,包含了自动驾驶车辆、路侧车路协同、全场高可靠定位、5G远程驾驶、运营调度管理、数字孪生、仿真系统、 高精地图等专业模块,组成了一套完整的智慧港口解决方案…

sqlmap性能优化

sqlmap性能优化 🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🌭🌭&#…

查看springboot starter提供的jar包默认版本

1.找到parent的版本,ctrl点进去 2.在spring-boot-dependencies继续点版本号 3.最终文件为spring-boot-dependencies-版本.pom

Git将本地项目上传到Gitee仓库

1.右键点击文件,点击Git Bash Here,进入git窗口 2.初始化本地仓库 git init3.将本地仓库与远程仓库建立连接 git remote add origin 远程仓库地址远程仓库地址在gitee仓库复制即可 4.将远程仓库的文件拉到本地仓库中 git pull origin master5.将本地文件全部上传…

数据结构与算法之美学习笔记:45 | 位图:如何实现网页爬虫中的URL去重功能?

目录 前言算法解析总结引申 前言 本节课程思维导图: 网页爬虫是搜索引擎中的非常重要的系统,负责爬取几十亿、上百亿的网页。爬虫的工作原理是,通过解析已经爬取页面中的网页链接,然后再爬取这些链接对应的网页。而同一个网页链接…

Windows内存管理(一):Windows性能监视器(PerfMon)

一、什么是性能监视器 什么是性能监视器? (What is Performance Monitor? )很多时候,我们的计算机只是停止响应、意外关闭或行为异常。这种行为可能有多种原因,指出确切原因可能会有很大帮助。Windows有一个名为Performance Monitor的工具&…

国外高校对于ChatGPT的三种态度及正确使用方法

ChatGPT无疑是23年留学届的热门话题,也成为了不少留学生再也离不开的万能工具,从总结文献、润色论文、给教授写email似乎无所不能。 各大高校对于学生使用ChatGPT的态度也有所不同。例如,哈佛大学教育代理院长 Anne Harrington 在内部邮件中…

MySQL报错:Out of sort memory, consider increasing server sort buffer size

报错内容 ### Error querying database. Cause: java.sql.SQLException: Out of sort memory, consider increasing server sort buffer size ### The error may exist in class path resource [mapper/ProjectCaseReportMapper.xml] ### The error may involve defaultParam…

卸载流氓软件联软

这个流氓软件也是在更新的,下面是本人在联想邵阳笔记本下卸载流程,非常简单 注:按照本文卸载之后,我重新装了一次这个垃圾,但是发现重装完之后,系统启动之后就会进入黑屏,也就是说,…

2024年【熔化焊接与热切割】考试资料及熔化焊接与热切割考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试资料根据新熔化焊接与热切割考试大纲要求,安全生产模拟考试一点通将熔化焊接与热切割模拟考试试题进行汇编,组成一套熔化焊接与热切割全真模拟考试试题,学员可…

java.lang.ClassNotFoundException: jakarta.servlet.Servlet

联系servlet的使用时,编写了servlet的处理器,但是浏览器报500错误,有时候是404错误 WebServlet("/mayikt") public class Servlet1 implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletExc…

畸变矫正-深度学习相关论文学习

目录 DocTr: Document Image Transformer for Geometric Unwarping and Illumination Correction SimFIR: A Simple Framework for Fisheye Image Rectification with Self-supervised Representation Learning Model-Free Distortion Rectification Framework Bridged by Di…