基于ARM和Linux的嵌入式网关的设计与实现

2010-08-15 00:49马新涛李洪平
中国新技术新产品 2010年7期
关键词:开发板网卡网关

马新涛 李洪平

(1、中国海洋大学信息科学与技术学院,山东 青岛 2661002、中国海洋大学海洋遥感所,山东 青岛 266100)

1 引言

本文中所要设计实现的嵌入式网关需要完成的功能就是连接两个不同协议的无线网络,实现数据的转发。基于ZigBee网络协议的无线传感器节点采集有用数据,并通过ZigBee网络将数据准确传输至ZigBee协调器,网关通过读串口操作将协调器的数据写入缓冲区,最后将缓冲区的数据通过与网关相连的usb无线网卡打包送入无线局域网。网关本质上是一个RS232协议转换为802.11g协议的协议转换器。

2 开发平台配置

2.1 硬件平台介绍

我们选用了联智公司基于EP9301处理器的开发板DG9301。DG9301开发板的主要组件包括:EP9301 ARM9处理器,16M的FLASH 和32M的SDRAM,两个RS232串行接口,一个自适应的10M/100M以太网接口,24个引出的GPIO引脚,支持用户外接,标准的 JTAG 接口,2个 USB host,5路 12bit的模拟输入等等。

2.2 软件平台搭建

2.2.1 开发方式介绍

由于目标板不具备一定的处理器能力和存储空间,所以只有在宿主机上对即将在目标机上运行的应用程序进行编译,生成可以在目标机上运行的代码格式,然后移植到目标板上,才可以完成程序开发,即目前嵌入式程序开发的Host/Target模式。宿主机采用的是运行redhat9.0系统的x86通用PC机平台,并安装交叉编译环境。

2.2.2 搭建交叉编译环境

所谓交叉编译,简单地说就是在一个平台上生成在另一个平台上执行的代码,即在宿主机上对应用程序进行交叉编译,生成可以在目标板上执行的代码。制作交叉编译器可行性较高的方法是采用现成的、有专门的机构维护的交叉工具链,出现问题容易得到技术支持。在这里,我们仍以面向DG9301的开发为例:

首先,将资料光盘中的arm-linux-gcc-3.3.tar拷贝到开发机的根目录,并将文件解压缩。

然后,再把资料光盘中的arm-elf-gcc-3.2.1-full.tar.bz2拷贝到开发主机的根目录,并将文件解压缩。

最后,为了不每次设置PATH,将下面这行加到开发主机的.bash_profile文件中:

PATH =/usr/local/arm/3.3/bin:/usr/local/arm/3.2.1-elf/bin:$PATH

至此,PC机的交叉编译环境就已经建立起来了,可以用arm-linux-gcc命令编译在PC机上编辑好的程序,然后下载到目标板上测试执行。

2.2.3 搭建NFS环境

首先,在装有redhat9.0的PC主机上执行setup命令,弹出菜单界面后选中System services进入系统服务选项菜单,在其中选中[*]nfs,然后退出setup界面返回到命令提示符下。

编辑/etc/exports文件,将这个默认的空文件修改为只有一行内容:/(rw),保存退出后执行如下命令以启动NFS服务:service nfs restart,如果每个启动项的结果都显示为OK,则说明配置成功。

2.2.4 配置TFTP服务

进入System services菜单界面,选中tftp一项,并去掉ipchains和iptables两项服务。

然后,退出setup界面,执行service xinetd restart命令以启动TFTP服务。

3 Linux下读串口程序的开发设计

前面已经介绍过,嵌入式网关的功能在本质上是实现RS232串口到无线局域网的数据转发,所以应用层软件实际上就是读串口数据,借助于公共缓冲区,打成标准的TCP数据包,利用无线网卡实现数据的发送。

在Linux系统中,串口的驱动由Linux内核的drivers文件夹内的serial.c来实现。在Linux下,/dev是提供给应用层的接口,Linux通过识别/dev下串口设备的主设备号和次设备号,配合找到底层的串口驱动,并进行调用。而我们需要做的就是在应用层借助read()和write()函数进行读串口程序的开发。

读串口程序设计大致可以分为打开串口、配置串口、读串口三个步骤。其中,打开串口可以使用open_port函数来实现。配置串口可以使用set_opt函数来实现。读串口操作可以使用read()函数来实现。

4 嵌入式Linux下的网络编程

4.1 Linux网络编程基础

Linux中的网络编程是通过socket接口来进行的。系统在pc机与ARM开发板之间通过一个可靠的面向连接的网络套接字服务,使得嵌入式网关可以通过连有无线网卡的usb口与连有无线ap的pc机进行数据交换。

4.2 Linux网络编程模型

在客户端/服务器模式中,一个服务程序通常在一个指定的地址监听对服务的请求,当一个客户对这个服务的地址提出了连接请求。此时,服务程序被激活,它创建一个子进程为客户提供服务,而父进程继续在原地址监听。在子进程完成了相应的操作后,服务器关闭此连接套接字,并结束此子进程。

4.3 Linux下socket与读串口程序的综合编程

在这里,我们的嵌入式网关被看作是客户端,无线局域网的pc节点被看作是服务器端。通过socket编程和读串口程序的综合,可以在实现服务器和客户端网络连接的基础上,完成读串口写网口的操作以及数据的转发、传输和接收。

在client.c程序编辑完成后,使用Linux下ARM的交叉编译工具arm-linux-gcc将其编译成ARM芯片上可运行的应用程序client:arm-linux-gcc-o client client.c

然后再将client通过网口下载到ARM开发板上。同时在服务器端编辑编译server程序,配置好双方的ip地址之后就可以执行应用程序实现开发板和主机之间的通讯。实验证明,我们可以在服务器端接收到来自ZigBee协调点的数据信息。

测试成功后我们还需要将客户端应用程序client添加到ramdisk文件系统中,然后再将其压缩的映像文件ramdisk.gz下载烧写到开发板的flash上。同时,我们还需要修改系统脚本/etc/rc.sysinit,使开发板能够在系统启动后自动加载无线网卡驱动和客户端应用程序client。

5 结束语

和通用计算机不同,嵌入式系统是面向应用、产品和用户的。本文就是结合实际需求,以应用为基础,详细介绍了嵌入式设备--网关开发设计和实现的整体过程,并在实际项目中得到了检验,希望能对其他嵌入式系统产品的开发有一定的借鉴意义。

[1]许先斌,熊慧军,李洲,等.基于 ARM9 的嵌入式Linux开发流程的研究[J].微计算机信息,2006:87-89.

[2]尤盈盈,孟利民.构建嵌入式Linux交叉编译环境[J].计算机与数字工程,2006:30-32.

[3]李驹光,郑耿,江泽明.嵌入式 Linux 系统开发详解[M].清华大学出版社,2006:166-182.

[4]王丹,祝跃飞,李勤,等.基于 Linux2.6 内核的嵌入式VPN网关实现[J].微电子学与计算机,2006:137-140.

[5]孙琼.嵌入式Linux应用程序开发详解[M].人民邮电出版社,2006.

[6]俞冬丽.基于嵌入式Linux系统的网络编程技术[J].中国科技信息,2006:77-80.

猜你喜欢
开发板网卡网关
在DDS 中间件上实现双冗余网卡切换的方法
Server 2016网卡组合模式
Microchip最新推出两款PIC32 Curiosity开发板
浅析单片机开发板的设计与制作
应对气候变化需要打通“网关”
读编往来
Mouser为您呈上开发关键之STMicroelectronics Nucleo开发板
Arduino和Atmel发布Arduino Zero开发板
一种实时高效的伺服控制网关设计
基于Zigbee与TCP的物联网网关设计