Coap协议介绍,及其开源实现Californium实战

2024-04-30 09:32

本文主要是介绍Coap协议介绍,及其开源实现Californium实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

物联网Coap协议介绍

Coap(Constrained Application Protocol)是一种特殊的Web协议用在不可靠的设备或者网络,这些设备一般是只有8-bit ROM或RAM的微控制器,这个协议主要用于点到点(machain-to-machain)应用,例如:小电量设备、智能设备,同时支持组播。coap和http类似,我们可以把coap看成http的缩小版,用于小存储不可靠的环境

在各设备间采用request/response的互联模式,有uri的概念(coap://ip:port/path/path/path?p1=v2&p2=v2)

有互联网媒体类型的概念,如下图:

同时也提供:GET、POST、PUT、DELETE四种请求类型

 

Coap是基于二进制的协议,header只有4个字节,非常紧凑

 

Californium开源实现

Coap是基于UDP的应用层,但是Californium实现了coap udp和tcp两种传输层协议,单次请求传输限制在1M以内

maven依赖

<dependencies><dependency><groupId>org.eclipse.californium</groupId><artifactId>californium-core</artifactId><version>2.0.0-M3</version></dependency><dependency><groupId>org.eclipse.californium</groupId><artifactId>element-connector</artifactId><version>2.0.0-M3</version></dependency><dependency><groupId>org.eclipse.californium</groupId><artifactId>scandium</artifactId><version>2.0.0-M3</version></dependency>
</dependencies>

服务端示例

package soap;import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;import org.eclipse.californium.core.CoapResource;
import org.eclipse.californium.core.CoapServer;
import org.eclipse.californium.core.network.CoapEndpoint;
import org.eclipse.californium.core.network.config.NetworkConfig;
import org.eclipse.californium.core.server.resources.CoapExchange;
import org.eclipse.californium.elements.tcp.TcpServerConnector;public class Server {private static AtomicInteger count = new AtomicInteger();public static void main(String[] args) {final CoapServer server = new CoapServer();//默认就是ucp实现传输层server.addEndpoint(new CoapEndpoint(new InetSocketAddress("127.0.0.1", 5683)));//加入tcp实现传输层server.addEndpoint(new CoapEndpoint(new TcpServerConnector(new InetSocketAddress("127.0.0.1", 5683), 4, 20000),NetworkConfig.getStandard()));//可以加入dtls支持,也就是coaps
//		server.addEndpoint(new CoapEndpoint(
//				new DTLSConnector(), //这里只是抛砖引玉,需要构建DtlsConnectorConfig
//				NetworkConfig.getStandard()));server.add(new CoapResource("tuyou"){@Overridepublic void handleGET(CoapExchange exchange) {handlePOST(exchange);};@Overridepublic void handlePOST(CoapExchange exchange) { //1System.out.println(exchange.getRequestOptions().getUriQueryString());System.out.println(exchange.getRequestText().length());exchange.respond("asdfasdf");super.handlePOST(exchange);}}.add(new CoapResource("lenovo"){@Overridepublic void handlePOST(CoapExchange exchange) {  //2int c = count.incrementAndGet();if(c % 10000 == 0){System.out.println(c);}exchange.respond(String.valueOf(c));super.handlePOST(exchange);}}));Executors.newSingleThreadExecutor().execute(() -> {server.start();});}
}

当用户请求url为:coap://localhost:5683/tuyou?p1=v1时,是响应1处的函数

当用户请求url为:coap://localhost:5683/tuyou/lenovo?p1=v1时,是响应2处的函数

客户端示例

package soap;import java.time.Clock;
import java.util.concurrent.CountDownLatch;import org.eclipse.californium.core.CoapClient;
import org.eclipse.californium.core.CoapHandler;
import org.eclipse.californium.core.CoapResponse;
import org.eclipse.californium.core.Utils;
import org.eclipse.californium.core.coap.MediaTypeRegistry;public class Client {public static void main(String[] args) throws InterruptedException {int count = 100;CountDownLatch countDown = new CountDownLatch(count);long start = Clock.systemUTC().millis();CoapClient client = new CoapClient("coap://127.0.0.1:5683/tuyou/lenovo?appKey=zq6NDc3sb6QmoQF1&appSecret=PosmJNUoMLD777Nf7tlu");for(int i = 0; i < count; i++){client.post(new CoapHandler() {@Overridepublic void onLoad(CoapResponse response) {System.out.println(Utils.prettyPrint(response));countDown.countDown();}@Overridepublic void onError() {}}, "payload message", MediaTypeRegistry.TEXT_PLAIN);}countDown.await();long end = Clock.systemUTC().millis();System.out.println(end - start);}
}


提示:示例代码需要用java8运行,否则有些语法会报错

 

听说,打赏我的人最后都找到了真爱。

 

这篇关于Coap协议介绍,及其开源实现Californium实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948496

相关文章

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs