物联网协议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.mzph.cn/news/602901.shtml

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

相关文章

给Flutter + FireBase 增加 badge 徽章,App启动器 通知红点。

在此之前需要配置好 firebase 在flutter 在项目中。(已经配置好的可以忽略此提示) Firebase 配置教程:flutter firebase 云消息通知教程 (android-安卓、ios-苹果)_flutter firebase_messaging ios环境配置-CSDN博客 由于firebase 提供的消息…

在Gitee上维护Erpnext源

在Gitee上维护Erpnext源 官方的frappe和erpnext地址: GitHub - frappe/frappe: Low code web framework for real world applications, in Python and Javascript GitHub - frappe/erpnext: Free and Open Source Enterprise Resource Planning (ERP) 1, 仓库地址输入frappe的官…

HAL——SPI

学习目标 掌握SPI配置方式掌握SPI读写操作 学习内容 需求 SPI配置 打开SPI1,选中全双工模式。观察下方自动生成的引脚,是否和自己开发板引脚对应。 修改引脚,来动右侧芯片引脚视图,找到开发板对应引脚,进行修改。 观察修改后的…

SpringBoot-Redis

依赖 <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId>配置 # 服务器连接端口 spring.redis.port6379 # 服务器地址 spring.redis.host127.0.0.1 # 数据库索引&#xff08;默认为0&#xff09…

【GitHub】-design-pattern-extend(设计模式扩展)

写在前面 偶然间看到一篇文章 《Java 中保持扩展性的几种套路和实现》&#xff0c;写的不错&#xff0c;但是类图画的差了点儿意思。于是&#xff0c;自己动手画了画&#xff0c;对其中的内容作了一些调整&#xff0c;对包做了进一步划分&#xff0c;便于理解消化。以下是对Git…

Linux rsh命令教程:远程shell命令的使用和注意事项(附案例详解和注意事项)

Linux rsh命令介绍 rsh&#xff08;remote shell&#xff09;提供用户环境&#xff0c;也就是Shell&#xff0c;以便指令能够在指定的远端主机上执行。rsh连接到指定的主机&#xff0c;并执行指定的命令。rsh将其标准输入复制到远程命令&#xff0c;将远程命令的标准输出复制到…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑多元不确定性和备用需求的微电网双层鲁棒容量规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及微电网&#xff08;Microgrid&#xff09;的双层鲁棒容量规划&#xff0c;考虑了多元不确定性和备用需求。让我们逐步解读这个标题&#xf…

【KD】知识蒸馏(knowledge distillation)简单介绍

最近学到了知识蒸馏的相关知识&#xff0c;来简单总结一下૮꒰ ˶• ༝ •˶꒱ა。 知识蒸馏 知识蒸馏&#xff0c;是一种模型压缩的手段。通过训练学生模仿教师的行为&#xff0c;将嵌入在大的教师模型中的知识迁移到小的学生模型。 例如&#xff0c;TinyBERT(Jiao et al.,2…

RocketMQ源码 发送顺序消息源码分析

前言 rocketmq 发送顺序消息和普通消息的主流程区别大部分一致的&#xff0c;区别在于&#xff1a;普通消息发送时&#xff0c;从所有broker的队列集合中 轮询选择一个队列&#xff0c;而顺序队列可以提供用户自定义消息队列选择器&#xff0c;从NameServer 分配的顺序 broker…

使用JavaScript实现动态生成并管理购物车的深入解析

一、引言 在当前的互联网时代&#xff0c;电子商务已成为我们日常生活的重要组成部分。购物车作为电子商务网站的核心功能之一&#xff0c;其实现方式对于用户体验至关重要。本文将深入探讨如何使用JavaScript实现一个动态生成并管理购物车的功能&#xff0c;并详细介绍其实现…

Linux Shell数学运算与条件测试

一、Shell数学运算 1.Shell常见的算术运算符号 序号算术运算符号意义1、-、*、/、%加、减、乘、除、取余2**幂运算3、–自增或自减4&&、||、&#xff01;与、或、非5、!相等、不相等&#xff0c;也可写成6、、-、*、/、%赋值运算符&#xff0c;a1相等于aa1 2.Shell常…

.NET Standard 支持的 .NET Framework 和 .NET Core

.NET Standard 是针对多个 .NET 实现推出的一套正式的 .NET API 规范。 推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。 .NET 5 及更高版本采用不同的方法来建立一致性&#xff0c;这种方法在大多数情况下都不需要 .NET Standard。 但如果要在 .NET Framewo…

QT 高DPI解决方案

一、根据DPI实现动态调整控件大小&#xff08;三种方式&#xff09; 1、QT支持高DPI&#xff08;针对整个进程中所有的UI&#xff09; // main函数中 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling)tips&#xff1a;&#xff08;1&#xff09;如果不想全局设置&am…

Nodejs搭配axios下载图片

新建一个文件夹&#xff0c;npm i axios 实测发现只需保留node_modules文件夹&#xff0c;删除package.json不影响使用 1.纯下载图片 其实该方法不仅可以下载图片&#xff0c;其他的文件都可以下载 const axios require(axios) const fs require(fs) var arrPic [https:…

最大输出 18W,集成 Type-C PD 输出和各种快充输出协议

一、产品简介 IP6510是一款集成同步开关的降压转换器、支持 9 种输出快充协议、支持 Type-C 输出和 USB PD协议&#xff0c;为车载充电器、快充适配器、智能排插提供完整的解决方案。 IP6510 内置功率 MOS&#xff0c;输入电压范围是 4.5V到 32V&#xff0c;输出电压范围是 3…

案例101:基于微信小程序的停车共享管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

一个命令查看linux系统是Centos还是Ubuntu

目 录 一、 背景介绍 二、一个命令查看linux系统的简单方法 1、 uname -a 2、cat /etc/issue 3、lsb_release -a 4、 dmesg | grep Ubuntu 一、 背景介绍 Linux 系统基本上分为两大类&#xff1a; 1. Red Hat 系列&#xff1a;包括 Red Ha…

使用pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集

superpoint与superglue的组合可以实现基于深度学习的图像配准,官方发布的superpoint与superglue模型均基于coco数据训练,与业务中的实际数据或许存在差距,为此实现基于开源的pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集。然而,在训练pytorch-superpoin…

电缆线标书:打造高质量工程的关键一步

电缆线标书制作是工程项目中至关重要的一环&#xff0c;它不仅仅是一份文件&#xff0c;更是对工程质量和实施过程的全面规划和控制。在电缆线标书中&#xff0c;涉及到的内容十分丰富&#xff0c;包括但不限于工程概况、技术要求、材料清单、施工方案、质量控制等多个方面。 …

【LMM 012】TinyGPT-V:24G显存训练,8G显存推理的高效多模态大模型

论文标题&#xff1a;TinyGPT-V: Efficient Multimodal Large Language Model via Small Backbones 论文作者&#xff1a;Zhengqing Yuan, Zhaoxu Li, Lichao Sun 作者单位&#xff1a;Anhui Polytechnic University, Nanyang Technological University, Lehigh University 论文…