IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> OpenHarmony源码评注|Coap协议的定义 -> 正文阅读

[网络协议]OpenHarmony源码评注|Coap协议的定义

总述中提到,discovery模块负责实现设备发现的机制,其核心在于以coap作为协议进行物联网通信。本篇我们主要介绍并分析coap协议。

背景知识

Coap(Constrained Application Protocol)是作用在物联网应用层的协议,是IETF组织发布的互联网系列标准之一(具体参照RFC7252)。其具有允许IP多播、协议小巧、资源消耗低等特点。

其中,支持IP多播的特性能够让设备在同一局域网下向其他设备进行广播,实现主动发现设备。

源码分析

Coap的定义

在communication_softbus_lite-master\discovery\coap\include中的coap_def.h头文件对Coap协议进行了定义。

typedef struct { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定义完整的Coap数据包
 ? ?enum COAP_ProtocolTypeEnum protocol; ? ? ? //协议类型
 ? ?unsigned int len;
 ? ?COAP_Header header; ? ? ? ? ? ? ? ? ? ? ? ?//信息头
 ? ?COAP_Buffer token; ? ? ? ? ? ? ? ? ? ? ? ? //标识符具体内容
 ? ?unsigned char optionsNum; ? ? ? ? ? ? ? ? ?//选项数
 ? ?COAP_Option options[COAP_MAX_OPTION]; ? ? ?//分配选项空间
 ? ?COAP_Buffer payload; ? ? ? ? ? ? ? ? ? ? ? //负载
} COAP_Packet; ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

COAP_Packet定义了整个数据包,包括下层协议类型、信息头、标识符、报文选项,以及负载内容。下面我们一一进行解读。

一、协议类型

枚举COAP_ProtocolTypeEnum中展示了Coap所支持的传输层协议,UDP和TCP均支持。

enum COAP_ProtocolTypeEnum { ? ? ? ?//Coap所用传输协议类型
 ? ?COAP_UDP = 0, ? ? ? ? ? ? ? ? ? //设UDP为0 ?  默认 ? ? ? ? ? ? ? ? 
 ? ?COAP_TCP ? ? ? ? ? ? ? ? ? ? ? ?//设TCP为1
};

二、信息头

和其他协议一样,CoAP协议带有信息头。

以下是信息头COAP_Header的定义

typedef struct {
 ? ?unsigned int ver : 2; ? ? ? ? ? //版本信息
 ? ?unsigned int type : 2; ? ? ? ? ?//消息类型,包括CON,NONCON,ACK,RESET4种
 ? ?unsigned int tokenLen : 4; ? ? ?//token长度
 ? ?unsigned int code : 8; ? ? ? ? ?//响应码或请求码
 ? ?union {
 ? ? ? ?unsigned short msgLen; ? ? ?//信息长度
 ? ? ? ?unsigned short msgId; ? ? ? //信息ID
 ?  } varSection;
} COAP_Header;

[ver] 版本编号,指coap协议的版本号

[type] 报文类型,包括CON, NONCON, ACK, RESET 4种

enum COAP_MsgTypeEnum { ? ? ? ? ? ? //消息类型
 ? ?COAP_TYPE_CON = 0, ? ? ? ? ? ? ?//需要被确认的请求
 ? ?COAP_TYPE_NONCON = 1, ? ? ? ? ? //不需要被确认的请求
 ? ?COAP_TYPE_ACK = 2, ? ? ? ? ? ? ?//应答消息
 ? ?COAP_TYPE_RESET = 3 ? ? ? ? ? ? //复位消息
};

CON 需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。

NONCON 不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。这适用于消息会重复频繁的发送,丢包不影响正常操作。

ACK 应答消息对应的是CON消息的应答。

RESET 复位消息,可靠传输时候接收的消息不认识或错误时,不能回ACK消息,必须回RST消息。

[tokenlen] Coap标识符长度

[code] 响应码或请求码 共8bit,分成前3bit(0~7)和后5bit(0~31),前3bit代表类型。0代表空消息。

enum COAP_MethodTypeEnum { ? ? ? ? ?//请求码
 ? ?COAP_METHOD_GET = 1, ? ? ? ? ? ?//获得资源
 ? ?COAP_METHOD_POST = 2, ? ? ? ? ? //创建资源
 ? ?COAP_METHOD_PUT = 3, ? ? ? ? ? ?//更新资源
 ? ?COAP_METHOD_DELETE = 4 ? ? ? ? ?//删除资源
};

Coap的请求码包括4种,很好理解。

响应码有很多,在此不多赘述。

三、数据缓冲区

标识符内容和负载都是通过结构体COAP_Buffer进行定义,其定义如下

typedef struct {
 ? ?const unsigned char *buffer; ? ?//缓冲区指针
 ? ?unsigned int len; ? ? ? ? ? ? ? //大小
} COAP_Buffer;

这个结构体很简单,就是有一个指针指向具体信息,然后记录其长度。其中,标识符长度在COAP_Header的tokenlen已经定义好。

负载的长度就根据实际情况而定了。由于payload表示实际负载,若有,则前面加payload标识符“0xFF”;如果没有payload标识符,那么就代表这是一个0长度的payload。如果存在payload标识符但其后跟随的是0长度的payload,那么必须当作消息格式错误处理。

四、选项

选项部分由COAP_Option进行定义,包括选项选项数和内容指针

typedef struct { ? ? ? ? ? ? ? ? ? ?
 ? ?unsigned short num; ? ? ? ? ? ? 
 ? ?const unsigned char *optionBuf; 
 ? ?unsigned int len;
} COAP_Option; ? ?

文件中定义了选项数量上限

#define COAP_MAX_OPTION 16
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:54:21  更:2021-09-04 17:54:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/27 1:43:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码