计算机系统应用  2018, Vol. 27 Issue (2): 112-116   PDF    
IPv6物联网接入网关的设计实践
张美平, 丁文才, 许友泽     
福建师范大学 数学与计算机科学学院, 福州 350007
摘要:在智能农业大棚物联网系统中, 传感器节点采集的数据需通过互联网上传到远程服务器, Contiki节点间使用6LoWPAN, 与传统的IPv4不能直连, 需配置一个物联网网关. 通过移植OpenWRT系统至HG255D无线路由器, 使得该路由器成为一个小巧、实用的嵌入式Linux系统, 能够运行开源或自行开发的程序. 本文将介绍如何在HG255D路由器上实现IPv6物联网接入网关设计的过程. 主要涉及OpenWRT固件的编译、路由器配置修改、网关程序的移植, 以及效果演示.
关键词: 物联网    网关    OpenWRT    IPv6    
Design and Practice of IPv6 Access Gateway for Internet of Things
ZHANG Mei-Ping, DING Wen-Cai, XU You-Ze     
Colledge of Mathematics and Computer Science, Fujian Normal University, Fuzhou 350007, China
Abstract: In the IOT of intelligent agricultural greenhouse system, the data collected by the sensor nodes need to be uploaded to the remote server via the Internet, and 6LoWPAN is used between the Contiki nodes. It cannot connect directly with the traditional IPv4, so it is necessary to configure an Internet of Things gateway. By transplanting the OpenWRT system to HG255D router, the router can be changed into a small, practical embedded Linux system, so that they can run open source or developed program. This article introduces how to implement HG255D routers on the IPv6 Internet access gateway, mainly involving the compilation of the OpenWRT firmware, router configuration changes, the transplantation of gateway program, as well as the effect of demonstration.
Key words: Internet of Things     gateway     OpenWRT     IPv6    

引言

随着科学技术的发展, 信息技术的进步, 我们正逐渐的从互联网向物联网迈进. 物联网就是物物相连的互联网, 是新一代信息技术的重要组成部分, 也是“信息化”时代的重要阶段.

物联网技术在现代农业中的应用, 对提高农业的生产管理水平效果显著. 搭建一个智能农业大棚系统模拟系统, 监测环境数据, 探究温度、湿度、光强等环境因素对农作物的影响. 采集节点采用移植了Contiki操作系统的传感器, 该操作系统支持6LoWPAN协议, 该协议是IPv6在无线传感网的一种实现, 为使传感器节点接入网络, 与现有的IPv4融合, 需要设计移植一个支持IPv6的嵌入式设备作为物联网接入网关.

物联网网关, 作为一个新的名词, 在未来的物联网时代将会扮演非常重要的角色, 它将成为连接物联网与互联网的纽带. 作为网关设备, 物联网网关可以实现物联网与通信网络以及不同类型无线传感器与执行器网络之间的协议转换设备. 既可以实现广域互联, 也可以实现局域互联[1]. 对于使用IPv6的无线传感器与执行器网络的设备来说, 如果要跟互联网上的设备终端进行连接, 那就必须经过协议转换才能做到, 但由于自身性能的限制, 而不能自行进行协议转换, 若在传统的无线路由器上, 结合开源无线路由操作系统OpenWRT, 将其作为网关设备, 就能实现与互联网的无缝连接.

本网关是在OpenWRT无线路由器上部署MQTT\MQTT-SN协议, 以实现无线传感器与执行器网络与传统通信网络的无缝连接. 消息队列遥测传输(Message Queuing Telemetry Transport, MQTT)是IBM开发基于消息发布与订阅机制的即时通讯协议, 有可能成为物联网的重要组成部分. 该协议支持大部分的嵌入式系统平台, 几乎可以把大部分的物联网硬件和外部网络连接起来, 通常被用来当做传感器和执行器(比如通过Twitter让房屋联网)的通信协议[2]. MQTT-SN协议是MQTT针对无线传感器网络(Wireless Sensor Networks, WSN)的拓展. MQTT-SN的运行需要依赖于已部署MQTT协议的网络. MQTT-SN协议中有两个角色: 节点(Node)和网关(GW). WSN节点通过MQTT-SN协议与网关交互, 网关进行协议转换之后使节点接入MQTT服务器. 由于MQTT-SN协议运行需要依赖于MQTT协议, 下文使用MQTT-SN协议泛指MQTT\MQTT-SN的组合[3].

1 IPv6物联网接入网关设计 1.1 IPv6物联网接入网关总体框架

本文提出的IPv6物联网接入网关将IPv6无线传感网与现有的IPv4网络相融合, 进行协议转换. 底层的物联网使用部署了MQTT-SN协议的contiki节点, 这些节点通过IEEE 802.15.14无线协议与边界节点通信; 边界节点则使用PL2302 USB转串口芯片与运行MQTT-SN网关的无线路由器相连; 运行OpenWRT系统的路由器可与contiki节点组建一个网络, MQTT服务器通过网线或Wifi接入网关所在的局域网内; 物联网应用程序可运行在手机、电脑、开发板或其它平台, 也是通过网线或Wifi接入该局域网, 并与MQTT服务器通信, 系统结构如图1所示.

1.2 物理网网关硬件软件设计方案

网关选择华为HG255D无线路由器作为硬件平台, 其处理器为MIPS架构的Ralink RT3052, 拥有4个Lan口、1个Wan口、一个USB接口. 运行OpenWRT系统, 可拓展路由器的功能, 配合contiki物联网节点, 共同完成本设计.

图 1 系统结构

Contiki传感器与执行器节点的处理器为意法半导体公司的STM32W108, 该处理器采用了32位ARMCortex-M3内核, 其特点是低功耗、处理能力强, 该微控制器提供了丰富的GIPO接口, 可以当作连接外部设备的控制接口, 如用于提供LED、按键、蜂鸣器接口, 使节点具有丰富的人机交互与设备控制功能; STM32W108提供丰富外设接口如UART、ADC等.

OpenWRT是一个高度模块化、高度自动化的嵌入式Linux操作系统, 具有强大的网络功能和扩展能力. 同时, 还提供了100多个软件以供编译选择, 而且数量还在不断增加, 其中包含支持IPv6的相关软件. 在同类的无线路由器固件系统中, OpenWRT在性能、稳定性、可扩展性方面的出色表现, 赢得众多开发者的支持. 是一个全功能的, 易于扩展的路由器操作系统, 成为在同类产品中最好的固件解决方案. 由于OpenWRT系统拥有强大的可扩展性, 可以通过交叉编译来运行OpenWRT官方未提供的程序, 以满足用户定制的需求. 此外, Linux也为用户提供了众多的开源且免费的软件, 基于此, 本系统选择OpenWRT作为网关的操作系统.

2 IPv6物联网接入网关工作原理 2.1 虚拟网卡tun0及tunslip6

在物联网中, 运行contiki系统的无线传感器与执行器网络的节点通过contiki边界节点与外界通信, 基于6LoWPAN的物联网使用IPv6协议, 因此在路由器上需有一个IPv6的网络接口与之建立通信. 在路由运行contiki自带的tunslip6程序, 该程序执行后会建立一个名为“tun0”的虚拟网卡. Tunslip6的作用是建立RPL边界节点与tun0两者之间相互通信的桥梁, 给边界路由器赋予IPv6网络地址, 例如aaaa: : 1/64, 它的原理是在主机上为tun0 虚拟网卡配置网络参数(虚拟网卡设备位于/dev/net/tun0, 可以直接用程序读写该设备, tun0建立在数据链路层, 所以读写内容为IP数据包), 边界路由器(border-router)与主机之间通信使用的是slip协议, slip协议为一个串口IP协议, tunslip6程序中包含读串口的代码, 可将读到的内容可以写到tun0设备上, tunslip6程序中还包含读tun0的代码, 可以将tun0读到的内容通过slip协议封装后写到串口, 其原理可由图2表示.

图 2 tunslip6原理

2.2 MQTT以及MQTT-SN

MQTT协议是为大量计算能力有限, 且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议. 使用消息发布/订阅模式, 提供一对多的消息发布, 使用TCP/IP提供网络连接, 小型传输, 开销很小(固定长度的头部是2字节), 协议交换最小化, 以降低网络流量, 使用Last Will和Testament特性通知有关各方客户端异常中断的机制以及“至多一次”、“至少一次”、“只有一次”三种消息发布服务质量.

在MQTT协议中有发布者、订阅者和代理(broker)三种角色, 消息由发布者通过topic发布, 由订阅者对感兴趣的topic进行订阅, 一个发布者可以对应多个订阅者, 一个订阅者也可以订阅多个topic, 另外订阅者也可以是发布者, 发布者也可以是订阅者, 这样就实现了“M2M”(Machine to Machine)的通信. Broker类似于信差的角色, 主要作用就是接收信件并投递给订阅信件的人. 如果订阅者不在线, 也就是说没有connected to the broker, 那么消息会保留, 等订阅者在线时推送. 图3为MQTT协议消息订阅发布模型.

图 3 MQTT订阅发布模型

MQTT是基于TCP/IP协议的, 在无线传感器网络中, 可以采用MQTT-SN (MQTT for Sensor Networks)协议进行补充, 它是为了资源受限硬件如传感器设计的, 能够通过IEEE 802.15.4发送UDP数据包, 再通过MQTT-SN网关与MQTT broker建立连接. MQTT-SN的网关程序名为“mipsmqttsn”, 负责处理tun0上的数据, 然后由tun0转发处理这些数据. 在运行mipsmqttsn程序时, 需要MQTT服务器的IPv4地址作为参数. 应用程序则与MQTT服务器直接通信. 其工作原理可由图5表示, 图4为物联网网关设计系统结构示意图.

图 4 系统结构

图 5 MQTT-SN订阅发布交互模型

3 系统运行测试

为了测试该设计, 我们搭建一个简单的测试环境, 逻辑如图6所示.

其中, MQTT服务器运行在Windows系统, 应用程序运行在Linux系统中; contiki节点连接光敏传感器, 路由器为运行OpenWRT的物联网网关. Contiki光照节点捕获光照数据后, 将所获取的光照数据以IPv6数据包形式通过无线射频发送给边界节点, 边界节点通过串口将数据包传输到物联网网关, 网关进行协议转换, 转换为IPv4数据包, 发布到MQTT服务器, 运行在Linux中的QT程序向MQTT服务器订阅该topic, 服务器收到订阅请求后, 向订阅者推送订阅消息, 组网测试实物连接如图7所示.

图 6 测试环境逻辑框图

图 7 测试环境实物图

在该测试系统中, contiki节点采集光敏传感器的数据, 并向服务器发布数据; contiki边界节点则负责contiki节点与tun0网卡间的相互通信.

测试步骤:

1) 启动MQTT服务器apache-activemq, 运行“apache-activemq-5.9.0\bin\win64”目录中的activemq.bat批处理文件, 即可启动服务器. 该服务器的IP地址即为PC的IP地址, 通过开始→运行→cmd→ipconfig来查看PC的IP地址. 此时, IP地址为192.168.1.141.

图 8 MQTT服务器IP地址

2) 查看无线路由器是否挂载边界节点, 若成功挂载上contiki的RPL边界节点, 则会在/dev/目录下找到名为“ttyUSB0”的设备文件.

3) 运行tunslip6命令生成tun0网卡:

tunslip6 -s/dev/ttyUSB0 aaaa::1/64 &

运行tunslip6, 该程序使用tun/tap网络协议使USB口可以作为虚拟网接口使用, 在这里是建立起Contiki边界节点与tun0之间的相互通信, 结果如图9所示.

图 9 运行tunslip6

启动成功后, 建立了tun0的接口, tun0节点的ip为aaaa::1/64, 程序与边界节点交互, 根据tun0的网段与边界节点自身的mac地址, 获得边界节点的IPv6地址为“aaaa::280:e102:15:c635”.

4) 成功启动tunslip6程序后, 即可运行MQTT-SN协议的网关程序. 在路由器的终端输入命令mipsmqttsn-h “MQTT服务器IP地址”, 结果如图10所示.

图 10 运行mipsmqttsn

5) 接入contiki节点, 给contiki节点上电, 它将自动与边界节点组成6LoWPAN网络, 根据边界节点所处网段与节点自身mac地址, 获得一个与边界节点处于同一网段的IPv6地址“aaaa::280:e102:15:cda5”, 并开始向MQTT服务器发布光照强度的数据.

图 11 Contiki节点串口信息

6) 在Linux虚拟机中运行一个Qt数据采集程序, 该程序向MQTT服务器订阅光照强度的数据, 如图12所示.

图 12 Qt应用程序界面

结果显示, 该Qt程序能从MQTT服务器上获取相应的数据.

4 总结与教训

在选择物联网网关的嵌入式设备与操作系统的过程中, 我们曾考虑使用各种ARM嵌入式开发板, 我们分别尝试过运行Arm-Linux的Tiny210、Mini2440开发板, 最后选择了支持带USB接口并支持OpenWRT的无线路由器. 因为要使ARM开发板支持IPv6, 就需要重新编译内核、新增相关模块如tun/tap、IPv6以及各种硬件驱动, 如果希望该网关提供无线热点功能, 还需要增加并驱动无线网卡, 配置并交叉编译HostAP, 步骤繁琐复杂. 而提供USB接口的无线路由器可以方便连接contiki IPv6边界路由节点, 并且OpenWRT提供官方固件, 各项内核模块以及相关硬件驱动(如USB串口驱动)均可通过“opkg install xxx”命令在线安装(opkg是一个轻量快速的套件管理系统, 目前已成为Opensource界嵌入式系统标准. 常用于路由、交换机等嵌入式设备中, 用来管理软件包的安装升级与下载). 更重要的是无线路由器本身就板载无线Wifi模块, 并完美驱动可作为无线热点AP使用, 此外OpenWRT提供的WEB配置界面方便用户配置各种网络参数.

在选择MQTT服务器方面, 当前流行的开源MQTT代理服务器(MQTT Broker)的实现有: Mosquitto、HiveMQ、Apache ActiveMQ、RabbitMQ、Apollo、RSMB等. MQTT客户端也有不同操作系统和编程语言的实现, 流行的客户端库有: Eclipse Paho(支持C、C++、Java、JavaScript、Python、Go、C#), M2MQTT(C#), FusesourceMQTTClient(Java), MQTT.js(javascript), libmosquitto(c/c++)等等, 我们使用了Apache ActiveMQ作为MQTT服务器; 由于contiki的应用程序使用C语言开发, 在MQTT客户端的开发也采用了基于Mosquitto库来开发客户端.

本设计是为解决物联网中无线传感器与执行器网络与传统互联网的接入网关问题, 通过部署MQTT-SN协议, 使无线传感器与执行器网络的各节点具备订阅/发布的功能, 通过移植MQTT-SN协议的网关程序到OpenWRT系统上, 并与MQTT服务器相连, 再加入自行开发的C/C++ Linux应用程序, 即可构成一个简单、实用的IPv6物联网应用系统.

无线传感与执行器网络的各节点采用IPv6协议, 打破了传统的IPv4物联网格局, 增大了地址量、增强了安全性. 外部终端通过有线无线均可接入, 使底层物联网的控制变得更方便, 具有一定的实际应用意义与推广价值.

但本次的设计也存在一些不足, 如未将MQTT服务器架设到Internet上, 以实现真正意义上的远程控制物联网, 如果将MQTT服务器架设到Internet上, 将能实现远程推送服务, 增强物联网应用系统的实用功能.

参考文献
[1]
互联网. 物联网网关总结. http://wenku.baidu.com/link?url=R847CuPuArEW4ErfZwkV_yYoLBfVyjjhdgvK0sZGvignP6wYik-GiG_DQ6TNES011Hx8wNn-N-CyLAbBfS1KRArSntR1nr549XYjoBJQwwe. [2015-01-29].
[2]
互联网. MQTT. http://baike.baidu.com/link?url=DEeX5HzgZIOlxUTy2w5VjX2e__WcmkRmQxr7iXg_prTVM-1dU0JRtdPu8HbsHAXMtW2sVaOiDdRr9BzIWf9Uw_. [2016-08-01].
[3]
陈旖, 张美平, 许力. WSN应用层协议MQTT-SN与CoAP的剖析与改进. 计算机系统应用, 2015, 24(2): 229-234.