项明浩, 华惊宇, 徐志江, 张 昱, 李 枫
(浙江工业大学 a.信息工程学院; b.通信工程系, 杭州 310023)
物联网被称为继计算机、互联网之后,世界信息产业的第三次浪潮[1]。近年来,随着物联网产业的迅猛发展,许多高校也纷纷开设物联网工程相关专业。物联网工程是涉及计算机科学与技术、通信工程、电子科学与技术等多个学科的综合性专业,体系架构可分为感知层、网络层、应用层三部分[2]。感知层[3]用于识别外界物体和采集信息;而网络层[4]是通过通信网络进行信息传输。网络协议是计算机网络课程的重要内容,但抽象晦涩的协议往往让学生无所适从,相应实验课程也仅仅使用现成的工具观察网络通断或者抓包分析,学生无法了解到协议底层的工作原理与具体的帧结构[5]。
本文基于实验室现有的MT7620A无线路由模块,在对802.11帧结构分析的基础上,设计了一套基于OpenWRT的WiFi探针实验装置,可以捕捉附近数据包并解析出移动设备的mac地址。与传统的抓包工具如wireshark[6]、micro network monitor等必须运行在PC机上不同[7],该装置可以在嵌入式设备上运行。利用该装置,学生可对802.11及无线通信的数据包有一个全面的认识,并且可以了解Linux应用层及嵌入式软件开发的基本流程。该装置提供了一个综合性实验平台,有利于高校对物联网人才的培养,且目前对于智能手机WiFi mac地址的捕捉有实际的需求与应用,该实验较好的贴近社会实际需求。
WiFi探针实验装置的设计原理是利用终端采集设备采集附近移动终端发送的数据包并进行数据解析,解析内容包括移动终端的MAC地址、目的地址、信号强度、SSID等,将解析后的数据按照约定的格式封装,上报给后台。学生可通过在Linux系统上编写、修改软件源码,生成ipk形式的软件包在OpenWRT系统上安装。同时,该实验装置提供配置文件,对于基础较弱的学生,可以不对源代码进行修改,而是对配置文件进行配置即可运行整个实验系统。
WiFi探针实验装置包括终端采集设备、STA和后台服务器。终端采集设备即WiFi探针,用于捕捉经过无线网卡的所有数据包,并进行过滤解析。STA是手机设备或者其他具有无线网卡的移动设备,这些设备会不定期地发送Probe帧广播,用于标识设备,WiFi探针正是捕捉这一类帧来收集数据的。后台服务器的主要功能是接收采集设备发送来的数据包并按照协议进行分包,最后在Web端展示采集的数据。设备总体架构框图如图1所示。
图1 总体架构框图
设备的硬件部分选用联发科的MT7620A[8]芯片,在实验室现有的MT7620A嵌入式路由实验板上搭建,实验板如图2所示。操作系统选用开源的OpenWRT[9]系统。本实验系统用的服务器依托于实验室4 GB实验平台的现有设备。其中,联发科MT7620A是联发科推出的一款WiFi路由器解决方案芯片,片上集成了一个主频为580 MHz MIPS 24 KB[10]的处理器,可以满足整个系统的处理速度要求;一个5端口百兆以太网交换机,包含了实现无线路由器所需的全部功能模块。另外,开发板上提供了丰富的外设,可供二次开发与实验[11]。
图2 硬件实验板
本文设计的实验系统事先在芯片内部集开源的不死uboot,可以有效防止学生不当的实验操作导致装置变成变砖。不死uboot提供Web界面用于固件烧写,在开发板与PC连接上后即可通过固定的网址进入。图形化的界面也降低了学生的学习成本。
软件设计整体分为探针采集部分和平台部分。探针采集部分功能模块如图3所示。主线程在读取完配置文件及初始化后创建3个子线程,分别为采集线程、缓存线程和发送线程。
图3 探针采集前端功能模块图
采集模块负责采集WiFi探针数据,并且对数据进行解析和粗略的过滤,之后将数据入队,分别存入缓存队列和发送队列,这也是该实验装置最核心的部分。采集模块软件流程图如图4所示。为了捕获网段内的所有数据包和帧,需要将网卡设置为混杂模式[12]。在混杂模式下,网卡不验证MAC地址,会接收所有经过网卡的数据包。
缓存模块的主要功能是缓存数据,并对缓存文件进行管理:超出给定的数目后要对最先缓存的文件进行删除,以防止内存消耗过大。
图4 采集模块流程图
发送模块负责与服务器通信:读取发送队列中的数据,通过TCP/IP协议发送给服务器,并且与服务器进行交互,如心跳保活,以确保tcp正常连接。
对探针数据封装后,通过发送模块与后台服务器建立socket连接,将数据包传送到后台,用于在界面上展示;另外,为防止网络不通时后台无法接收数据,造成数据的丢失,本系统在本地对同样的数据包进行缓存,缓存的文件前后缀以及文件大小、目录可由用户修改配置文件进行自定义。考虑到系统长时间运行堆积大量缓存文件,系统的内存势必会不够,因此当达到一定文件数目后要对较早的缓存文件覆盖。软件流程图见图5。
图5 数据存储与传输模块
后台服务框图见图6。后台的数据接收服务器收到前端模块传输来的数据后,首先进行分包,解析出原始数据存入mysql数据库。数据库与数据中转模块间的数据传输选用Redis,它是一个开源(BSD许可)内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。如图6所示,HTTPServer通过WebSocket实时地将探针数据上报给HTTPClient,用于Web界面上的实时显示。另外,静态数据通过HTTPclient与HTTPServer的交互实现,如读取历史信息、查找数据等等。
IEEE 802.11 协议[13]中定义了无线接入点(AP)和客户端(STA)的两种工作模式以及多种无线帧类型。AP会周期性地发送BEACON帧,用于宣告某个网络的存在;而手机等客户端站点(STA)也会定期发送Probe Request帧询问AP是否可以接入,AP收到该帧后发送Probe Response作为应答。由于STA在开启WiFi功能后就会不断地发送probe request帧,帧内包含设备mac地址等信息。探针抓取到这类帧后即可解析出设备的mac地址,因此只关心这一阶段的数据交互。
在传输过程中,数据按固定的格式被封装成帧,802.11MAC帧帧格式[14]如图7所示。Preamble是一个前导标识,用于接收设备识别802.11,PLCP域中包含了一些物理层的协议参数,比如需要的信号频率与信号强度。
图7 802.11数据帧格式
MAC层处理的是帧数据,将MAC帧展开,包含了帧控制域、地址域与序列控制域等。地址2为源地址,即传送的来源:移动设备mac地址,位于MAC header中的偏移为10。帧控制字段第2、3位为Type和Sub type,标识出帧类型,在捕获所有数据包之后,根据这两个标志可过滤出特定帧。Probe Request帧为管理帧的一类子帧,其type为00,subtype为0100。
网卡捕获的管理帧,前18 B为Radiotap,它是网卡在接收信号时,去除PLCP header部分后,在本地增加的头部字节,包含功率、信道等物理层信息,可以通过radiotap解析库对一段radiotap数据进行解析。18、19 B为帧控制位,根据图7给出解析帧类型的代码:
pktWBuf = (uint8_t *)(pktbuf + le16(rhdr->it_len));
frametype = *pktWBuf;
wfp.wp.fType = (frametype >> 2)& 0x03;
wfp.wp.fSubType = (frametype >> 4) & 0x0f;
20~21 B为持续时间,22~27 B为目的地址,28~33 B为源地址。在该帧中,tag number相对偏移为42,tag length相对偏移为43,表示ssid的长度,随后字节即是ssid。
解析完成后,在数据传输前需要进行封装,加入帧头、校验方式、数据长度等头部信息用于标识,表1给出了一个封装示例用于参考。
表1 数据封装示例
数据包通过tcp协议进行传输,tcp协议交给应用层的数据和发送时的数据是一致的,但由于tcp的数据是没有消息边界的,故需要采用分包机制,在设备端的消息头中用定长字节来存储整个消息长度,在数据接收服务端需要对分包进行重组和校验,主要交互流程如图8所示。
图8 数据传输
根据通信协议,在数据接收服务端采取边接收边解析的方式来处理数据包,一个包可能由若干个包组成,此时根据协议的PKGT字段来判断是不是分包发送。
如果发现数据包不对,则直接丢弃,同时发送相应的ACK包给前端系统。
实验系统连接的后台服务器不是固定的,ip地址会随着应用场景的改变而变化,若每一次新的实验都要更改源码中的socket服务器地址,重新编译、烧录固件,会造成效率低下并且带来很大的工作量。为了增加系统的可塑性,特别添加了配置文件,程序每一次启动后会先去读取配置文件中的内容。将SERVER下的ip修改成对应服务器的ip地址,探针在启动后即可与该服务器建立socket连接,从而将采集到的探针数据上报到后台。另外,用户可以根据自己需求自定义采集的帧类型、缓存文件的存储地址、文件名等等。
配置文件为.ini文件,由节、键、值组成,一般格式为:
[SECTION]
Key=value
程序读取配置文件的主要步骤为:解析配置文件,匹配到节,再去查找键对应的值。
基于OpenWRT的WiFi探针实验装置在充分考虑到实验课时及学生能力的因素下,将内容分为基础性实验和开放性实验两类[15]。该实验装置的功能性测试也将通过实验的形式在本文中展示。基础性实验的设计方案,要求学生能完成OpenWRT系统下软件包的安装,WiFi探针实验装置采集端与后台服务器的连接等实验内容;开放性实验要求学生能下载软件包进行系统TCP吞吐量测试,并且可自行编写软件包,修改采集部分底层源码以实现个性化定制等[16]。
(1) 运行环境的搭建。学生需掌握基本的操作指令与文件配置。开启实验板以后,可以用终端仿真程序secureCRT查看板子输出信息,初始界面如下:
①更改系统ip地址:打开配置文件vi etc/config/network,更改 option ipaddr ‘192.168.10.1’。保存退出后重启网络:/etc/init.d/network restart即可完成ip地址的更改(见图9)。
图9 OpenWRT界面
②创建一个monitor模式的虚拟无线网卡mon0,监听模式允许网卡不用连接WiFi就可以抓取特定频道的数据。
grep -q mon0 /prov/net/dev || /usr/sbin/iw phy phy0 interface add mon0 type monitor
/sbin/ifconfig mon0 up
该步骤成功的现象是能通过ifconfig查看到mon0网卡。
(2) 软件包安装。学生需掌握软件包的安装方法以及opkg指令集的使用。
利用opkg软件包管理工具,即可安装软件包,命令如下:opkg install xxx.ipk。
图10 服务端数据
(3) 数据包的测试。运行实验装置后,通过网络调试助手模拟tcp的服务器,可以接收查看实验装置发送的tcp包。一个tcp包中包含了AA A5 01 00等头部数据,用于标识数据包类型以及校验等。阴影为部分有效数据,解析见表2。
表2 数据解析
(4) 与后台连接。修改配置文件中的ip地址为后台ip。连接成功后可登录Web页面查看上报的数据,包含了源地址、信道、信号强度、帧类型、设备名称与采集时间。实验成功的现象如图11所示。特别地,根据mac地址前3 Byte可以判别出设备厂商。
为了测试系统的稳健性,长时间开启采集功能,图11中包含了19 923条数据,经测试,系统运行良好,能正常解析与上报数据,达到预期目标。
图11 测试结果
基于OpenWRT的WiFi探针实验装置全部源代码开放给学生,方便学生理解探针采集的具体工作原理,学生也可自定义采集的内容发送给平台侧交互。同时,实验装置提供编写好的makefile作为示例,里面包含了生成软件包的必要规则,学生只需按格式稍作修改,即可生成自己的软件包,在开发板上运行验证。
为了测试系统的采集功能是否达标,在Windows系统上通过Microsoft network monitor抓包作为对照,如图12所示,同时开启探针系统的采集功能,测试时间为5 min,数据对比见表3(表中未列出全部数据)。可以看出,探针系统采集的数据与MNM采集的数据基本一致。同一设备会不断地发送probe request帧,而探针系统在代码里已经对这些重复帧进行了过滤。
吞吐量测试。netperf 是一种常见的测量网络带宽的工具,可以由opkg在线安装获得该软件包。经测试,传输速度达到了数据实时传输的要求,结果见图13。
图12 Microsoft network monitor 工具
进程占用内存。与Linux系统类似,通过top指令可以查看到系统资源占用情况。从图14可以看出,探针进程使用7 326 KB虚拟内存,占总资源的6%。查看 /proc/pid/status 文件可以获取到物理内存信息,如图15所示,VmRSS为504 kB。最后,通过free指令查看系统总体物理内存使用情况,如图16所示,物理内存使用约为16%。
表3 数据对比
图13 吞吐量测试
图14 系统性能分析
图15 查看进程状态
图16 物理内存使用情况
本文基于现有的嵌入式试验板开发了数字通信网络实验装置。其优点有3个方面。①实验装置可以同时实现嵌入式系统教学和通信网络教学,且有利于学生理解通信网络设备的底层工作机制。②由于OpenWRT系统的操作指令与Linux基本相同,故实验板无需额外安装虚拟机与Linux系统,学生可以通过在该系统上练习指令学习Linux的基本操作。③实验装置开发的WiFi探针,从硬件、系统到软件给出了详细的设计方案,有利于学生理解小系统开发和通信协议实现。最后,智能手机的WiFi MAC地址作为个人身份识别数据对于安防应用具有重要作用,目前相关应用也在同步推进,如商店的回头客分析,公安的大人流预警布控等等。因此,本文提出的这一实验装置也具有前瞻性,贴合社会实际需求。