Java对接CoAP的完整方案
作者:思静鱼
本文深度解析CoAP协议,对比Californium与coap-java两大主流库,手把手教你实现CoAP客户端、服务端及Observe、DTLS加密等高级功能,需要的朋友可以参考下
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服务)
import org.eclipse.californium.core.CoapClient;
import org.eclipse.californium.core.CoapResponse;
import org.eclipse.californium.core.coap.MediaTypeRegistry;
public class CoapSimpleClient {
public static void main(String[] args) {
// coap://IP:端口/资源路径
String uri = "coap://127.0.0.1:5683/sensor/temp";
CoapClient client = new CoapClient(uri);
try {
// 1. GET 请求(读取设备数据)
CoapResponse getResp = client.get();
if (getResp.isSuccess()) {
System.out.println("GET 响应:" + getResp.getResponseText());
System.out.println("状态码:" + getResp.getCode());
}
// 2. PUT 请求(下发配置,携带JSON)
String payload = "{\"temp\":25}";
CoapResponse putResp = client.put(
payload,
MediaTypeRegistry.APPLICATION_JSON
);
// 3. POST 请求(上报数据/执行指令)
CoapResponse postResp = client.post(
"open",
MediaTypeRegistry.TEXT_PLAIN
);
// 4. DELETE
client.delete();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
}
3. CoAP 服务端(Java 搭建CoAP服务,供设备上报)
import org.eclipse.californium.core.CoapResource;
import org.eclipse.californium.core.CoapServer;
import org.eclipse.californium.core.server.resources.CoapExchange;
public class CoapSimpleServer {
public static void main(String[] args) {
CoapServer server = new CoapServer(5683); // 默认5683端口
// 定义资源 /sensor/temp
CoapResource tempResource = new CoapResource("temp") {
@Override
public void handleGET(CoapExchange exchange) {
// 设备读取温度
exchange.respond("26.5 ℃");
}
@Override
public void handlePOST(CoapExchange exchange) {
// 设备POST上报数据
String data = exchange.getRequestText();
System.out.println("设备上报:" + data);
exchange.respond(201, "ok");
}
@Override
public void handlePUT(CoapExchange exchange) {
String cfg = exchange.getRequestText();
System.out.println("下发配置:" + cfg);
exchange.respond("update success");
}
};
CoapResource sensorRoot = new CoapResource("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 加密地址,需加载证书
CoapClient secureClient = new CoapClient("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;加密 coaps 5684,防火墙开放UDP
- UDP 丢包:CoAP 自带重传,但弱网建议增加超时
client.setTimeout(3000); - 数据包过大:开启块传输,Californium 自动处理
- 设备DTLS证书:使用
scandium生成密钥对,一机一密
五、SpringBoot 集成 CoAP 扩展
如果是 SpringBoot 项目,可封装工具类:
- 全局单例 CoapClient 池(避免频繁创建销毁)
- 统一异常拦截、消息日志
- DTLS 证书配置读取yml
以上就是Java对接CoAP的完整方案的详细内容,更多关于Java对接CoAP方案的资料请关注脚本之家其它相关文章!
