基于CoAP的AP无线网络数据传输设计

这篇内容是关于AP的改造设计,该设计可分为AP网络扫描功能设计和AP数据传输设计。即AP扫描网络环境数据包,同时将网络数据通过CoAP协议上传。由此,AP可作为网络安全代理起,实时监控无线网络环境数据。

功能模块:

  1. 网络扫描功能

  2. 基于CoAP协议传输功能

AP网络环境扫描实现

核心实现

该功能模块参考AP开源应用iwcap,packet可在OpenWrt wiki上查询, github源代码

其核心实现是通过绑定本地无线网卡,建立socket通信通道,完成无线数据包抓取。

具体实现代码:

1
2
3
capture_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); #简历socket通道
bind(capture_sock, (struct sockaddr *)&local, sizeof(local)); # 绑定网卡与通道
pktlen = recvfrom(capture_sock, pktbuf, sizeof(pktbuf), 0, NULL, 0); #从通道抓包

socket通信

在Unix/Linux系统中,为了统一对各硬件的操作,简化接口,不同硬件设备可以被看成一个文件,等同于对磁盘上普通文件的操作。

用socket()函数创建一个网络连接,其返回值就是文件描述符。根据文件描述符,我们可以使用普通的文件操作来传输数据。

相关函数:accept, bind, connect, listen…

头文件:

1
2
#include <sys/types.h>
#include <sys/socket.h>

函数定义:

1
int socket(int domain, int type, int protocol);

参数domain指定使用何种地址类型,常见的包括:

1
2
3
4
5
6
7
8
9
10
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX #进程通信协议
PF_INET?AF_INET Ipv4 #网络协议
PF_INET6/AF_INET6 Ipv6 #网络协议
PF_IPX/AF_IPX IPX-Novell #协议
PF_NETLINK/AF_NETLINK #核心用户接口装置
PF_X25/AF_X25 #ITU-T X.25/ISO-8208 协议
PF_AX25/AF_AX25 #业余无线AX. 25 协议
PF_ATMPVC/AF_ATMPVC #存取原始 ATM PVCs
PF_APPLETALK/AF_APPLETALK #appletalk (DDP)协议
PF_PACKET/AF_PACKET #初级封包接口

参数type:

1
2
3
4
5
6
SOCK_STREAM #提供双向连续且可信赖的数据流, 即TCP. 支持 OOB 机制, 在所有数据传送前必须使用connect()来建立连线状态.
SOCK_DGRAM #使用不连续不可信赖的数据包连接
SOCK_SEQPACKET #提供连续可信赖的数据包连接
SOCK_RAW #提供原始网络协议存取
SOCK_RDM #提供可信赖的数据包连接
SOCK_PACKET #提供和网络驱动程序直接通信. protocol 用来指定socket 所使用的传输协议编号, 通常此参考不用管它, 设为0 即可.

在此应用中,协议指定从数据链路中接收分组。ETH_P_ALL定义于 /usr/include/linux/if_ether.h中

1
2
3
4
5
6
7
8
9
10
#define ETH_P_ALL 0x0003
#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */
#define ETH_P_PUP 0x0200 /* Xerox PUP packet */
#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */
#define ETH_P_IP 0x0800 /* Internet Protocol packet */
#define ETH_P_X25 0x0805 /* CCITT X.25 */
#define ETH_P_ARP 0x0806 /* Address Resolution packet */
#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN
#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */
#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packe[t*/

参考链接1)

参考链接2

CoAP客户端/服务器在AP上的C语言实现

协议参考RFC7252

CoAP以各种语言的具体实现均有版本,如有需要可以在此博客查看。

我在实现上参考了microcoap中的coap.c, coap.h 和 endpoint.h。

传输方案设计

将CoAP客户端部署在AP上,CoAP服务器部署在云平台。

CoAP client 主动向 Server发送CON消息,完成认证和连接。Server向Client发送ACK消息,消息option中存放”start” / “stop” 控制程序开始 / 结束。

程序开始,AP抓取网络数据包,数据内容存放在CoAP数据包 payload中,并以NON类型上传至Server。具体传输过程如图:

接下来简单介绍客户端和服务器代码实现的核心内容。

CoAP包结构

microcoap代码中的核心函数主要包括:coap_build、coap_parse、coap_handle_req 分别执行数据包构建、数据包解析和数据包回复的功能。熟悉CoAP协议的包结构后理解比较简单,下面主要介绍一下CoAP协议的包结构。

【Ver】 版本编号,指示CoAP协议的版本号。类似于HTTP 1.0 HTTP 1.1。版本编号占2位,取值为01B。

【T】报文类型,CoAP协议定了4种不同形式的报文,CON报文,NON报文,ACK报文和RST报文。

【TKL】CoAP标识符长度。CoAP协议中具有两种功能相似的标识符,一种为Message ID(报文编号),一种为Token(标识符)。其中每个报文均包含消息编号,但是标识符对于报文来说是非必须的。

【Code】功能码/响应码。Code在CoAP请求报文和响应报文中具有不同的表现形式,Code占一个字节,它被分成了两部分,前3位一部分,后5位一部分,为了方便描述它被写成了c.dd结构。其中0.XX表示CoAP请求的某种方法,而2.XX、4.XX或5.XX则表示CoAP响应的某种具体表现。

【Message ID】报文编号

【Token】标识符具体内容,通过TKL指定Token长度。

【Option】报文选项,通过报文选项可设定CoAP主机,CoAP URI,CoAP请求参数和负载媒体类型等等。

【1111 1111B】CoAP报文和具体负载之间的分隔符。

Code部分

Code部分被分成了两部分,为了便于阅读,Code被描述为c.dd形式。具体内容可参考RFC7252 #12.1.1 Method Codes

请求

​ 在CoAP请求中,Code被定义为CoAP请求方法,这些方法有GET、POST、PUT和DELETE,这些方法和HTTP协议非常相似。

​ (0.01)GET方法——用于获得某资源

​ (0.02)POST方法——用于创建某资源

​ (0.03)PUT方法——用于更新某资源

​ (0.04)DELETE方法——用于删除某资源

响应

​ 在CoAP响应中,Code被定义为CoAP响应码,类似于HTTP 200 OK等等。

​ (2.01)Created

​ (2.02)Deleted

​ (2.03)Valid

​ (2.04)Changed

​ (2.05)Content。类似于HTTP 200 OK

​ (4.00)Bad Request 请求错误,服务器无法处理。类似于HTTP 400。

​ (4.01)Unauthorized 没有范围权限。类似于HTTP 401。

​ (4.02)Bad Option 请求中包含错误选项。

​ (4.03)Forbidden 服务器拒绝请求。类似于HTTP 403。

​ (4.04)Not Found 服务器找不到资源。类似于HTTP 404。

​ (4.05)Method Not Allowed 非法请求方法。类似于HTTP 405。

​ (4.06)Not Acceptable 请求选项和服务器生成内容选项不一致。类似于HTTP 406。

​ (4.12)Precondition Failed 请求参数不足。类似于HTTP 412。

​ (4.15)Unsuppor Conten-Type 请求中的媒体类型不被支持。类似于HTTP 415。

​ (5.00)Internal Server Error 服务器内部错误。类似于HTTP 500。

​ (5.01)Not Implemented 服务器无法支持请求内容。类似于HTTP 501。

​ (5.02)Bad Gateway 服务器作为网关时,收到了一个错误的响应。类似于HTTP 502。

​ (5.03)Service Unavailable 服务器过载或者维护停机。类似于HTTP 503。

​ (5.04)Gateway Timeout 服务器作为网关时,执行请求时发生超时错误。类似于HTTP 504。

​ (5.05)Proxying Not Supported 服务器不支持代理功能。

在程序中,code占8位,具体编程实现:

1
2
3
#define MAKE_RSPCODE(clas, det)((clas << 5) | det)

COAP_RSPCODE_CONTENT = MAKE_RSPCODE(2,5)

Option部分

CoAP支持多个Option,CoAP的Option的表示方法比较特殊,采用增量的方式描述,细节可参考RFC7252 #3.1

option1

一般情况下Option部分包含Option Delta、Option Length和Option Value三部分。

​ 【Option Delta】表示Option的增量,当前的Option的具体编号等于之前所有Option Delta的总和。

​ 【Option Length】表示Option Value的具体长度。

​ 【Option Value】表示Option具体内容

​ CoAP中所有的Option都采用编号的方式,这些Option及编号的定义如下图所示。

option2

在这些option中,Uri-Host、Uri-Port、Uri-Path和Uri-Query等和资源“位置”和参数有关。

​ 【3】Uri-Host:CoAP主机名称,例如iot.eclipse.org

​ 【7】Uri-Port:CoAP端口号,默认为5683

​ 【11】Uri-Path:资源路由或路径,例如\temperature。资源路径采用UTF8字符串形式,长度不计第一个”\”。

​ 【15】Uri-Query:访问资源参数,例如?value1=1&value2=2,参数与参数之间使用“&”分隔,Uri-Query和Uri-Path之间采用“?”分隔。

​ 在这些option中,Content-Format和Accept用于表示CoAP负载的媒体格式

​ 【12】Content-Format:指定CoAP复杂媒体类型,媒体类型采用整数描述,例如application/json对应整数50,application/octet-stream对应整数40。

​ 【17】Accept: 指定CoAP响应复杂中的媒体类型,媒体类型的定义和Content-Format相同。

​ CoAP协议中支持多个Option,例如

​ 第一个Option Delta=11,表示该Option表示Uri-Path(11)

​ 第二个Option Delta=1,表示该Option=1+11,表示Content-Format(12)

​ 第三个Option Delta=3,表示该Option=3+1+11,表示Uri-Query(15)

​ CoAP采用这样的方式表示多个Option,而每种Option都可以在HTTP协议中找到对应项。