协议框架

CoAP默认运行在UDP上,但它也支持运行在SMS,TCP等数据传输层上。本文主要是基于UDP上的CoAP协议介绍

1.消息模型 Messages


COAP协议通信是通过在UDP上传输消息类完成。UDP比作公路话,消息就是公路上汽车。

COAP定义了4种类型消息,来实现设备端与云端之间双向通信

1. 需要确认消息   CON
2. 不需要确认消息 NON (适用于消息会重复频繁的发送,丢掉消息不对业务产生影响)
3. 确认应答消息 ACK
4. 复位消息 RST

基于4种消息类型,可以实现2种传输质量。即可靠消息传输 与 不可靠消息传输。

怎么是可靠消息传输?

主要是通过确认及重传机制来实现的,客户端发送消息后,需要等待服务器收到通知, 如果在规定时间内,没有收到需要重新发送数据。 可靠传输是基于CON消息传输的,服务器端收到CON类型的消息后,需要返回ACK消息,客户端到在指定时间ACK_TIMEOUT内收到ACK消息后,才代表这个消息以可靠到服务器端。

怎么是不可靠消息传输?

客户端只管发送消息, 不管服务器端有没有收到,因此可能存在丢包。不可靠传输是基于NON消息传输的。服务器端收到NON类型的消息后,不用回复ACK消息。

2.资源请求/响应模型 Requests/Responses


对于物联网,服务器上的资源可以简单的认为是物联网设备的实时运行影子, 通过访问服务器上资源就可以实现与设备间数据的交互。 上面谈到的消息模型比如汽车话, 资源请求及响应好比汽车上货物。 资源请求及响应内容最终会被放在CoAP消息包里面。CoAP请求与响应,类似HTTP,且根据RESTful架构设计的。 CoAP客户端发出请求,CoAP服务端进行请求处理然后发送响应。

COAP 请求Request方法: 请求方法与HTTP协议类似,有4个。 GET, PUT, POST, DELETE, 所有的请求方法都会放在CoAP CON/NON消息里面进行传输。

COAP 请求响应Response代码: 响应内容也与HTTP协议类似。 主要有如下3类:

  • Success 2.xx 代表客户端请求被成功接收并被成功处理
  • Client Error 4.xx 代表客户端请求有错误,比如参数错误等
  • Server Error 5.xx 代表服务器在执行客户端请求时出错。

所有的请求服务器响应可以放在CoAP CON/NON/ACK消息里面进行传输。针对CoAP 带CON消息请求,响应如果快速处理完(有些请求的处理需要耗时多,服务器无法立即响应),则可直接放在ACK消息包里面返回。对于无法立即响应的,服务器带资源ready后,会单独发一个响应消息包给客户端

服务器上可访问资源统一用URL来定位(比如/deviceID/temp 访问某个设备的温度信息)。客户端通过某个资源的URL来访问服务器具体资源,通过4个请求方法(GET,PUT,POST,DELETE)完成对服务器上资源增删改查操作。

举个例子: 比如某个设备需要从服务器端查询当前温度信息。

  • 请求消息(CON): GET /temperature , 请求内容会被包在CON消息里面
  • 响应消息 (ACK): 2.05 Content "22.5 C" ,响应内容会被放在ACK消息里面

3.消息报文定义 Messages Define


Header(必须):固定4个byte

  • Ver : 2bit, 代表版本信息,当前是1
  • T: 2bit, 代表该消息类型, CON, NON. ACK, RST
  • TKL: 4bit,token长度, 当前支持0~8B长度,其他长度保留将来扩展用
  • Code:8bit,分成前3bit(07)和后5bit(031),前3bit代表类型。 0代表空消息或者请求码, 2开头代表响应码,取值如下:
0.00 Indicates an Empty message
0.01-0.31 Indicates a request.
1.00-1.31 Reserved
2.00-5.31 Indicates a response.
6.00-7.31 Reserved
  • Message ID:16bit, 代表消息MID,每个消息都有一个ID ,重发的消息MID不变。

token(可选)

也叫做请求ID。把响应与之前的请求关联起来。有时候客户端发送出请求带上token,服务器端有时不能立即响应, 当服务器端准备好数据后,会单独发送一个消息给客户端, 这时候客户端需要判断这个消息是针对之前的哪个请求回复的,token用途就在这里,通过token,客户端收到响应后,取出TOKEN,就可以知道该响应是针对之前哪个请求回复的。

option(可选,0个或者多个)

请求消息 与回应消息都可以0~多个options。 主要用于描述请求或者响应对应的各个属性,类似参数或者特征描述。

payload(可选)

实际携带数据内容, 若有, 前面加payload 标志 OxFF.

option 介绍

格式

当一个消息报文里面有多个option时,每个option需要按照该option在协议里面对应的编号顺序排列下来。并且每个option索引是通过增量来计算的。option Delta 代表相对于前面一个option编号的增量。

举个例子

假设前面一个option编号为20, 当前option编号为25,则当前option的增量Delta就设置为5

增量最大可占用2个byte, 计算方式如下

当option Delta = 0~12时,只占4bit。

当option Delta =13 则占1B, 实际数字是option Delta【extended】 - 13

当option Delta =14 则占2B , 实际数字是option Delta【extended】 - 269

COAP 支持OPTION编号列表, 是HTTP协议 options 子集。

举例 Uri-Host:服务器主机名称,如californium.eclipse.org

Uri-Port:服务器端口号,默认为5683

Uri-Path:资源路路径,如\temperature

Uri-Query:访问资源参数,例如?v=1&t=2

4.块传输


需要传输大量数据时,比如一个大文件,需要采用分块传输,把文件拆解成多个块进行传输。扩展的块传输协议在COAP基础协议上增加了3个options, 2个response codes 用于块传输大小协商及控制。



block option结构

有三部分组成:

SZX: Block Size,占用2bit,取值范围0~6,对应每个block 大小为2xx(SZX+4),即范围(16 ~ 1024),以Byte为单位

M: More Flag,占用1bit, 代表是否还有剩下数据块未传输。如果设置为0,代表数据块都已传输出去

NUM: Block Number, 占用0~3Byte,代表当前块编号,以0开始, 如我们要传10个数据块,则数据块的编号为0~9

option block1: 主要用于客户端发出请求时,分块传输,比如需要上传一个大的数据包到服务器上。

option block2: 主要用于服务器端响应时,分块传输, 比如设备端发起资源发现式,由于服务器上资源较多,就要启动分块传输。

Size option

主要用于向对方说明,这次块传输需要传送的数据总数量。

Size1 option: 代表客户度发出请求里面资源总的大小。

Size2 option: 代表服务器端响应资源总的大小。

如何启动块传输?

当请求消息或者响应消息里面有出息 block1/block2 option时,代表这是块传输通信。需要根据option block 里面M标识,决定是否继续进行块传输。

示例

第一个消息,客户端发起发现资源请求信息CON并设置Block2:0(NUM)/0(M)/64(SZX)告诉服务器端,能接受最大block size为64.

第二个消息。服务器端回复确认消息ACK,并设置Block2:0/1/64,告诉客户端,block size已接受为64, 且后面还有数据,当前传输块编号是0. size2:1094, 告诉客户端,接下来总的数据大小是1094B。

第三个消息,客户端发起请求获取下一个block。设置Block2:1/0/64.告诉服务器端下一个要获取的block编号是1.

5.订阅与发布


MQTT协议是基于订阅与发布模型的,coap通过扩展协议方式也简单的实现了订阅与发布模型。

当一个客户端需要定期去查询服务器端某个资源的最新状态时,订阅与发布模型就非常有用,不用这个模型,客户端就要周期的不断发送请求到服务器端。

模型框架

关键概念 主题Subject: 代表CoAP服务器上的某个资源resource,该资源状态随时可能发生变化 观察者Observer:代表对某个coap资源最新状态感兴趣的客户端CoAP Client 登记Registration: 观察者需要向服务器CoAP server登记感兴趣的主题Subject。

通知Notification:当CoAP观察到某个主题发生状态变化时,CoAP服务器会主动向该主题下的已登记的观察者列表里面的每个观察者发送其订阅的主题最新状态数据。 备注:如果已订阅某个主题的CoAP client对CoAP server Notification无法确认,则会从主题订阅列表里面移除掉。

订阅与发布协议在COAP基础协议上增加了1个Observe option, 其值为整数,通过该options来实现订阅与发布模型管理

在get请求消息里面

oberser value 为 0: 代表向CoAP服务器端订阅一个主题。

oberser value 为 1: 代表向CoAP服务器端移除一个已订阅主题。

在notification消息里面

oberser value 代表 主题发生变化时,检测到顺序,以便客户端可以知道状态变化的先后。

举个例子



\1. 客户端向服务器端登记感兴趣的主题 /temperature

\2. 当temperature发生状态改变时,服务器端主动通知到客户端。

\3. 客户端根据token,就可以与之前订阅主题关联起来,以此确定是哪个主题订阅的。

一个CoAP Client可以分次向CoAP server订阅多个资源主题。 一个CoAP server上的主题可以被多个观察者(CoAP Client)订阅。 这样就通过了CoAP server实现了CoAP Client之间直接数据转发通信。

可以通过灵活设计服务器上的资源链接,来实现对某个主题的条件订阅(类似触发器或者阀值等)。 比如订阅主题是: coap://server/temperature/critical?above=42, 当温度超过42,CoAP Server需要发送通知。

Coap 协议学习:具体协议介绍具体的更多相关文章

  1. TCP/IP协议学习(四) 协议概述

    生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...

  2. 蓝牙 BLE 协议学习: 000-有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...

  3. 物联网协议CoAP协议学习

    CoAP:Constrained Application Protocol协议是为物联网中资源受限的设备制定的应用层协议,即简化版的基于UDP的HTTP协议.其核心内容为资源抽象.REST式交互可扩展 ...

  4. JavaWeb学习----http协议

    一.什么是HTTP协议: 1.概念: 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式(规定客户端和服务器如何 ...

  5. http协议学习系列

    深入理解HTTP协议(转)  http://www.blogjava.net/zjusuyong/articles/304788.html http协议学习系列   1. 基础概念篇 1.1 介绍 H ...

  6. 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较

    一.先看下相关国外的专业数据对四大协议的比较: Protocol                                    CoAP                         XMP ...

  7. NFC协议学习分享

    很多同学在学习NFC协议的时候,觉得NFC的规范从底层到上层的应有尽有,有点无处下手的感觉.这里就和大家分享下我曾经学习NFC规范的经验.如果有不对的地方,也请各位同学批评指正.NFC Forum中有 ...

  8. TCP/IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

  9. TCP协议学习总结(上)

    在计算机领域,数据的本质无非0和1,创造0和1的固然伟大,但真正百花齐放的还是基于0和1之上的各种层次之间的组合(数据结构)所带给我们人类各种各样的可能性.例如TCP协议,我们的生活无不无时无刻的站在 ...

  10. HTTP协议学习笔记(三)

    HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...

随机推荐

  1. 五、Doris数据分布

    在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述 名词解释 数据分布:数据分布是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能 短查询:s ...

  2. Gparted扩展硬盘空间

    需求:有一些磁盘占满了空间,例如/亦或者/opt目录等.可以通过Gparted扩展空间. 1.vmware添加ISO [添加光盘]gparted-live-cd添加至ISO 2.延迟引导启动,强制进入 ...

  3. cuBlas API Launch Latency 耗时异常分析记录

    一.背景 最近在做 AI 编译器生成 Kernel 支持 Bert 模型训练调优工作,在分析 bert 的timeline中发现,在每个 step 的前两个 cinn_instruction_run ...

  4. leaflet利用hotline实现河流差值渲染热力图

    实现效果(这里做了1条主河道和5个支流): 核心代码使用了Leaflet.hotline插件,github下载地址链接 详情见我之前整理的一篇文章介绍河流热力图 核心代码逻辑: // 处理河流数据以及 ...

  5. 使用 Python 旋转PDF页面、或调整PDF页面顺序

    在将纸质文档扫描成PDF电子文档时,有时可能会出现页面方向翻转或者页面顺序混乱的情况.为了确保更好地浏览和查看PDF文件,本文将分享一个使用Python来旋转PDF页面或者调整PDF页面顺序的解决方案 ...

  6. JDK源码阅读-------自学笔记(四)带标签的break和continues

    "标签"是指后面跟一个冒号的标识符,例如:"label:".对Java来说唯一用到标签的地方是在循环语句之前.而在循环之前设置标签的唯一理由是:我们希望在其中嵌 ...

  7. 服务器电源管理(Power Management States)

    目录 文章目录 目录 EIST(智能降频技术) 硬件 固件 操作系统 EIST(智能降频技术) EIST 能够根据不同的 OS(操作系统)工作量自动调节 CPU 的电压和频率,以减少耗电量和发热量.它 ...

  8. .net core 5,6,7【多线程笔记】取消令牌(CancellationToken) CancellationTokenSource

    介绍 在使用C#异步的场景,多多少少会接触到CancellationTokenSource.它和取消异步任务相关的,CancellationToken就是它生产出来的. 演示 任务取消执行回调 var ...

  9. Uni-app极速入门(一) - 第一个小程序

    Uni-app 介绍 官网:https://www.dcloud.io/index.html uni-app是为js开发者提供的一个全端开发框架,可以开发一次编译为web.App.小程序(微信/阿里/ ...

  10. 【昇腾开发全流程】AscendCL开发板模型推理

    前言 学会如何安装配置华为云ModelArts.开发板Atlas 200I DK A2. 并打通一个Ascend910训练到Ascend310推理的全流程思路. 在本篇章,我们继续进入推理阶段! 推理 ...