Java对接CoAP的完整方案

 更新时间:2026年07月03日 08:24:07   作者:思静鱼  
本文深度解析CoAP协议,对比Californium与coap-java两大主流库,手把手教你实现CoAP客户端、服务端及Observe、DTLS加密等高级功能,需要的朋友可以参考下

CoAP 是物联网轻量协议(UDP、二进制、低功耗),Java 主流两个库:

  1. Californium (Cf):工业标准、功能最全,支持 CoAP RFC7252、DTLS、资源观察、块传输(首选)
  2. 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 区别(物联网选型)

特性CoAPMQTT
传输层UDPTCP
头部大小极小(4B起)较大
安全DTLSTLS
适用低功耗单片机、电池设备网关、云端、大量长连接设备
交互模型请求响应(REST风格)发布订阅

四、常见踩坑点

  1. 端口:CoAP 默认 5683;加密 coaps 5684,防火墙开放UDP
  2. UDP 丢包:CoAP 自带重传,但弱网建议增加超时 client.setTimeout(3000);
  3. 数据包过大:开启块传输,Californium 自动处理
  4. 设备DTLS证书:使用 scandium 生成密钥对,一机一密

五、SpringBoot 集成 CoAP 扩展

如果是 SpringBoot 项目,可封装工具类:

  1. 全局单例 CoapClient 池(避免频繁创建销毁)
  2. 统一异常拦截、消息日志
  3. DTLS 证书配置读取yml

以上就是Java对接CoAP的完整方案的详细内容,更多关于Java对接CoAP方案的资料请关注脚本之家其它相关文章!

相关文章

最新评论