了解一下CoAP(一)

一. 什么是CoAP?

Coap(Constrained Application Protocol)受限应用协议。一种在物联网世界的类web协议。顾名思义,使用在资源受限的物联网设备上。

CoAP是类HTTP协议,它是对HTTP协议简化,协议非常简单,头部和选项字段较少,占用网络带宽和资源较少。对资源受限设备和网络进行优化,具有低能耗和低带宽消耗的特性。

CoAPHTTP
服务器资源(地址)coap(s): //ip:端口/URIhttp(s): //ip:端口/URI
请求码(请求方式)0.01/0.02 …等GET/POST
响应码4.00 …等400 Bad Request
数据类型Content-Format:50 …等Content-Type:application/json
数据传输支持可靠传输,数据重传,块传输。( CoAP通过消息类型(见下方说明)来保证)支持可靠传输,数据重传
默认端口coaps:5684/coap:5683(udp端口)https:443/http:80
安全加密层DTLS(单播时使用,资源有限)TTL
数据内容二进制文本
网络层UDPTCP
通信方式IP多播,同时向多个设备请求 (广播只能通过UDP或原始IP实现)点对点通信
通信方式非长连接通信长连接和短连接都支持

COAP协议有4种消息类型
CON—— 需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。这有点像TCP,对方必须给确认收到消息,用以可靠消息传输。
NON—— 不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。这适用于消息会重复频繁的发送,丢包不影响正常操作。这个和UDP很像。用以不可靠消息传输。
ACK —— 应答消息,对应的是CON消息的应答。
RST —— 复位消息,可靠传输时候接收的消息不认识或错误时,不能回ACK消息,必须回RST消息。

二. 报文格式

  2   2    4          8                     16
+---+---+-----+----------------+---------------------------|
|ver| T | TKL |      Code      |        Message ID         |
+----------------------------------------------------------|
|   Token(if any, TKL bytes)...                            |
+----------------------------------------------------------|
|   Optons(if any)...                                      |
+---------------+------------------------------------------|
|1 1 1 1 1 1 1 1|    Payload(if any)...                    |
+----------------------------------------------------------|

第一行是消息头,必须有,固定4个byte。

字段大小说明
Ver2bit版本信息,当前是必须写0x01。
T2bit消息类型,包括 CON, NON. ACK, RST这4种。
TKL4bittoken长度, 当前支持0~8B长度,其他长度保留将来扩展用。
Code8bit0代表空消息或者请求码, 分成前3bit(0~7)和后5bit(0 ~31),前3bit代表类型(class type), 后5bit代表细节码(detail code)
Message ID16bit代表消息MID,每个消息都有一个ID ,重发的消息MID不变
token(可选)0~8byte用于将响应与请求匹配。 token值为0到8字节的序列。 ( 每条消息必须带有一个标记, 即使它的长度为零)。 每个请求都带有一个客户端生成的token, 服务器在任何结果响应中都必须对其进行回应。token类似消息ID,用以标记消息的唯一性。token还是消息安全性的一个设置,使用全8字节的随机数,使伪造的报文无法获得验证通过。
Option请求消息 与回应消息都可以0~多个options。主要用于描述请求或者响应对应的各个属性,类似参数或者特征描述,比如是否用到代理服务器,目的主机的端口等。
Payload实际携带数据内容,若有,前面加payload标识符“0xFF”,如果没有payload标识符,那么就代表这是一个0长度的payload。如果存在payload标识符但其后跟随的是0长度的payload,那么必须当作消息格式错误处理。

三. 如何使用?

1.引入依赖(git地址:https://github.com/eclipse-californium/californium)

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

2.服务器端(提供接口)

    private void server() throws UnknownHostException {
        CoapServer coapServer = new CoapServer();
        //resource-name 资源名 对应controller的路径参数。路径为/resource-name
        //new ConcurrentCoapResource("resource-name", 5(线程池线程数)) 按需使用线程安全的resource
        coapServer.add(new CoAPResourceExample("resource-name"));
        //CoapEndpoint 是Coap协议的一个传输图层(图层堆栈,层层处理消息),位于 MessageDeliverer 和 Connector 之间。详细解释请看作者类描述,很详细
        CoapEndpoint.CoapEndpointBuilder coapEndpointBuilder = new CoapEndpoint.CoapEndpointBuilder();
        // CoapEndpoint除了传输还可设置端口以及内部有个线程池保证线程安全
        // 设置接口(Resource)绑定的ip地址 和端口
        coapEndpointBuilder.setInetSocketAddress(new InetSocketAddress(InetAddress.getByName("ip"), 5683));
        //or
        coapEndpointBuilder.setPort(5683);
        //网络配置参数,可自定义,这里使用默认配置
        coapEndpointBuilder.setNetworkConfig(NetworkConfig.getStandard());
        //可自定义连接池
        //coapEndpointBuilder.setConnector()
        coapServer.addEndpoint(coapEndpointBuilder.build());
        coapServer.start();
    }

    public static class CoAPResourceExample extends CoapResource {
        public CoAPResourceExample(String name) {
            //resource-name 资源名 对应controller的路径参数/uri
            super(name);
        }

        public void handleGET(CoapExchange exchange) {
            //获取路径参数
            List<String> queries = exchange.getRequestOptions().getUriQuery();
            //ResponseCode 响应码对应http状态码  contentFormat对应http的contentType。50 =》JSON  0 =》text
            exchange.respond(CoAP.ResponseCode.CONTENT, "hello world", 0);
        }

        public void handlePOST(CoapExchange exchange) {
            //发送给客户端消息已到达
            exchange.accept();
            //获取请求参数
            String requestBody = exchange.getRequestText();
            //ResponseCode 响应码对应http状态码  contentFormat对应http的contentType
            exchange.respond(CoAP.ResponseCode.CREATED, "{}", 50);
        }

        public void handlePUT(CoapExchange exchange) {
            // ...
            exchange.respond(CoAP.ResponseCode.CHANGED);
            changed(); //父类方法 notify all observers(client) the state has changed 见方法注释
        }

        public void handleDELETE(CoapExchange exchange) {
            delete();//父类方法 删除当前resource并通知所有observers(client)
            exchange.respond(CoAP.ResponseCode.DELETED);
        }
    }

3.客户端(调用服务器端接口)

    private void client() throws URISyntaxException {
        URI uri = new URI("coap://ip/resource-name?type=1");// 请求服务器资源resource-name,注意默认端口为5683
        String body = "{\"body\":\"hello\"}";
        CoapClient client = new CoapClient(uri);
        CoapResponse response = client.post(body.getBytes(), 50);
        //CoapResponse response = client.get();
        if (response != null) {
            System.out.println(response.getCode()); // 打印请求状态码
            System.out.println(response.getOptions()); // 选项参数
            System.out.println(response.getResponseText()); // 获取内容文本信息
            System.out.println("\nAdvanced\n"); //
            System.out.println(Utils.prettyPrint(response)); // 打印格式良好的输出
        }
    }
03-12
<think>好的,用户想了解CoAP协议的相关信息,特别是协议介绍及应用。首先,我需要回忆CoAP的基础知识。CoAP是Constrained Application Protocol的缩写,专为物联网设备设计的应用层协议。它类似于HTTP,但更轻量,适合资源受限的环境。 接下来,用户的问题需要结构清晰的回答。根据系统级指令,要分点说明,使用中文,并且正确使用LaTeX格式。首先应该介绍CoAP的基本概念,然后讨论其协议特点,接着是报文结构,再讲传输机制,最后是应用场景和相关问题。 记得要引用用户提供的参考文献。比如,用户提到引用[2]指出CoAP基于UDP,所以在协议特点里要强调这点。引用[4]涉及重传机制,需要在传输机制部分详细说明。同时,应用场景部分可能需要结合引用[1]提到的EMQX接入CoAP设备的情况。 需要检查LaTeX格式是否正确,比如行内公式用$...$,独立公式用$$...$$。例如,在讲报文结构时,如果有字段长度,可能需要用数学符号表示,但用户提供的资料中这部分内容较少,可能需要简化。 然后,生成相关问题。根据用户提供的示例,问题应该围绕CoAP的进步细节,如与HTTP的区别、安全性、报文结构解析、重传机制等。要确保问题相关且有深度,帮助用户深入理解。 最后,确保回答结构清晰,分点明确,每个部分都有引用标注。比如,在介绍协议特点时,引用[2]和[4],在应用场景提到引用[1]。需要自然地将引用标识放在句末,避免打断阅读流畅性。 现在整理思路,开始撰写回答,确保每个部分符合要求,并且信息准确可靠。</think>### CoAP协议介绍及应用 #### CoAP协议简介 CoAP(Constrained Application Protocol)是专为资源受限的物联网设备设计的轻量级应用层协议,基于REST架构模型,支持设备间高效通信。其核心设计目标是降低协议复杂度,适应低功耗、低带宽网络环境[^1]。 #### 二、协议核心特点 1. **基于UDP协议** CoAP消息直接封装在UDP数据包中,避免了TCP连接的开销,适用于高延迟或不稳定网络环境[^2]。 2. **报文结构精简** CoAP头部仅占用4字节,最小报文长度可压缩至10字节。典型报文结构如下: ``` | Ver(2b) | T(2b) | TKL(4b) | Code(8b) | Message ID(16b) | | Token(0-8B) | Options(0-N) | Payload(0-N) | ``` 3. **可靠传输机制** 通过CON(Confirmable)和NON(Non-confirmable)两种消息类型实现可靠性控制。CON消息采用指数退避重传策略,参数包括: - 初始超时时间:$ACK\\_TIMEOUT = 2s$ - 最大重传次数:$MAX\\_RETRANSMIT = 4$ 重传时间间隔公式为:$ACK\\_TIMEOUT \\times 2^{n-1} \\times ACK\\_RANDOM\\_FACTOR$(n为当前重试次数)[^4] #### 三、典型应用场景 1. **智能家居** 低功耗传感器(如温湿度计)通过CoAP上报数据至云端平台[^1]。 2. **工业物联网** 在带宽受限的车间网络中,PLC控制器使用CoAP传输状态信息。 3. **城市基础设施** 路灯控制系统通过Observe机制实现远程状态订阅与实时控制。 #### 四、协议交互示例 ```plaintext 客户端 -> 服务器: CON [MID=1234], GET /temperature 服务器 -> 客户端: ACK [MID=1234], 2.05 Content (22.5°C) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值