Java 对接 CoAP 完整方案
📅 2026/7/3 13:10:37
👁️ 阅读次数
📝 编程学习
CoAP 是物联网轻量协议(UDP、二进制、低功耗),Java 主流两个库:
- Californium (Cf):工业标准、功能最全,支持 CoAP RFC7252、DTLS、资源观察、块传输(首选)
- coap-java:轻量简单,仅基础 CoAP,无 DTLS,适合简单测试
一、Californium(推荐,生产用)
1. Maven 依赖
<!-- core 核心 --><dependency><groupId>org.eclipse.californium</groupId><artifactId>californium-core</artifactId><version>3.9.0</version></dependency><!-- coap协议标准封装 --><dependency><groupId>org.eclipse.californium</groupId><artifactId>element-connector</artifactId><version>3.9.0</version></dependency><!-- DTLS 加密(设备安全通信必加) --><dependency><groupId>org.eclipse.californium</groupId><artifactId>scandium-core</artifactId><version>3.9.0</version></dependency>2. CoAP 客户端(请求设备/CoAP服务)
importorg.eclipse.californium.core.CoapClient;importorg.eclipse.californium.core.CoapResponse;importorg.eclipse.californium.core.coap.MediaTypeRegistry;publicclassCoapSimpleClient{publicstaticvoidmain(String[]args){// coap://IP:端口/资源路径Stringuri="coap://127.0.0.1:5683/sensor/temp";CoapClientclient=newCoapClient(uri);try{// 1. GET 请求(读取设备数据)CoapResponsegetResp=client.get();if(getResp.isSuccess()){System.out.println("GET 响应:"+getResp.getResponseText());System.out.println("状态码:"+getResp.getCode());}// 2. PUT 请求(下发配置,携带JSON)Stringpayload="{\"temp\":25}";CoapResponseputResp=client.put(payload,MediaTypeRegistry.APPLICATION_JSON);// 3. POST 请求(上报数据/执行指令)CoapResponsepostResp=client.post("open",MediaTypeRegistry.TEXT_PLAIN);// 4. DELETEclient.delete();}catch(Exceptione){e.printStackTrace();}finally{client.close();}}}3. CoAP 服务端(Java 搭建CoAP服务,供设备上报)
importorg.eclipse.californium.core.CoapResource;importorg.eclipse.californium.core.CoapServer;importorg.eclipse.californium.core.server.resources.CoapExchange;publicclassCoapSimpleServer{publicstaticvoidmain(String[]args){CoapServerserver=newCoapServer(5683);// 默认5683端口// 定义资源 /sensor/tempCoapResourcetempResource=newCoapResource("temp"){@OverridepublicvoidhandleGET(CoapExchangeexchange){// 设备读取温度exchange.respond("26.5 ℃");}@OverridepublicvoidhandlePOST(CoapExchangeexchange){// 设备POST上报数据Stringdata=exchange.getRequestText();System.out.println("设备上报:"+data);exchange.respond(201,"ok");}@OverridepublicvoidhandlePUT(CoapExchangeexchange){Stringcfg=exchange.getRequestText();System.out.println("下发配置:"+cfg);exchange.respond("update success");}};CoapResourcesensorRoot=newCoapResource("sensor");sensorRoot.add(tempResource);server.add(sensorRoot);server.start();System.out.println("CoAP Server 启动,端口5683");}}4. 关键高级功能(物联网常用)
(1)观察模式 Observe(设备主动推送,类似订阅)
// 客户端订阅资源变化client.observe(resp->{System.out.println("推送数据:"+resp.getResponseText());});(2)DTLS 加密 coaps:// 安全传输
// coaps 加密地址,需加载证书CoapClientsecureClient=newCoapClient("coaps://127.0.0.1:5684/device");(3)块传输(大数据分包,CoAP块1/块2)
Californium 默认自动分片,无需手动处理。
二、轻量 coap-java(简单测试场景)
Maven
<dependency><groupId>com.github.svetleishaya</groupId><artifactId>coap-java</artifactId><version>1.4.0</version></dependency>示例极简,但不支持DTLS、Observe、工业扩展,仅学习用,不推荐生产。
三、CoAP 与 MQTT 区别(物联网选型)
| 特性 | CoAP | MQTT |
|---|---|---|
| 传输层 | UDP | TCP |
| 头部大小 | 极小(4B起) | 较大 |
| 安全 | DTLS | TLS |
| 适用 | 低功耗单片机、电池设备 | 网关、云端、大量长连接设备 |
| 交互模型 | 请求响应(REST风格) | 发布订阅 |
四、常见踩坑点
- 端口:CoAP 默认5683;加密 coaps5684,防火墙开放UDP
- UDP 丢包:CoAP 自带重传,但弱网建议增加超时
client.setTimeout(3000); - 数据包过大:开启块传输,Californium 自动处理
- 设备DTLS证书:使用
scandium生成密钥对,一机一密
五、SpringBoot 集成 CoAP 扩展
如果是 SpringBoot 项目,可封装工具类:
- 全局单例 CoapClient 池(避免频繁创建销毁)
- 统一异常拦截、消息日志
- DTLS 证书配置读取yml
编程学习
技术分享
实战经验