物联网是在互联网的基础上,将用户与物品或者物品与物品用互联网进行连接,并通过互联网进行信息交换和通信的一种概念。物联网主要通过信息采集设备以及能够将这些信息采集设备接入互联网的终端平台来实现。近年来,嵌入式系统以其功能完善,设计方案灵活,功耗可控制等特点,已广泛应用于生活、商业、医疗以及工业等各个领域。比起通用计算机来,嵌入式系统具有针对性更强、体积更小,成本更低等优点,是物联网领域应用设计的首选方案。对于一些数据量不大,传输速率要求不高的应用,要考虑用较低的成本实现最可靠的物联网服务。
一. 平台硬件设计
1.1 平台结构及原理
该平台采用ATMEL公司AT91SAM7X512处理器作为主控芯片,该处理器内部集成了以太网控制器、512kbytes FALSH以及128kbytes SRAM。只需外接一片以太网物理层(PHY)收发芯片DM9161和一个网络变压器HR601680,即可构成以太网终端硬件平台。 AT91SAM7X512采用3.3 V和1.8 V双工作电压,使用频率为18.432 MHZ的晶振作为时钟电路的振荡源,调试电路采用标准的20针JTAG仿真调试接口。该方案成本低,功耗小,并且所用芯片集成度很高因而保证了系统的稳定性。
AT91SAM7X512的以太网控制模块实现了一个与IEEE802.3标准兼容的以太网MAC,支持全双工模式,可通过DMA方式进行数据收发。当物理层芯片DM9161接收到来自以太网的上位机数据时,ARM通过MII接口(媒体独立接口)读取数据,并在内部通过DMA方式将数据读入 SRAM中交给TCP/IP协议栈进行处理。同时,当RFID射频读卡器或者传感模块有数据需要传输时,平台也能沿着相同的通道将数据传输至上位机。系统整体结构如图1所示。
图1 系统结构原理示意图
1.2 AT91SAM7X512和DM9161的接口电路设计
AT91SAM7X512的以太网控制器和物理层收发芯片 DM9161之间有MII(Media Independent Interface)和RMII(Reduced Media Independent Interface)两种接口。这两种接口都能够工作在10 Mb/s和100 Mb/s共两种速率下,在本设计中采用MII接口。MII数据接口总共需要16个信号,包括 TX_ER,TXD《3:0》,TX_EN,TX_CLK,COL,RXD《3:0》,RX_EX,RX_CLK,CRS,RX_DV 等,在时钟速率25 MHz的情况下以4-bit并行方式发送和接收数据。以太网控制器依靠MDIO接口与物理层芯片进行通信,用于自动协商期间确保以太网控制器和物理层芯片被配置为相同的速度和双工模式。AT91SAM7X512和DM9161的接口电路如图2所示。
图2 以太网接口电路原理图
当系统上电后,由AT91SAM7X512给DM9161提供复位信号及引脚初始化电平,完成DM9161的上电初始化工作。当初始化完成后,系统会通过MII接口读取DM9161内部状态寄存器的值来完成对网络连接模式和连接状态的检测。
二. 平台软件的实现
2.1 TCP/IP协议栈的移植
LwIP是瑞典计算机科学研究院(SICS)设计的一个开源的轻量级TCP/IP协议栈。它的目的是减少内存使用率和代码大小,使LwIP能够适用于资源紧张的嵌入式系统。利用μC/OS-Ⅱ提供的信号量和消息传递机制等系统服务可以实现对LwIP的移植。
2.1.1 信号量操作函数
LwIP 使用信号量进行通信,这个信号量可以是计数信号量,也可以是二值信号量,所以在sys_arch中需要实现与信号量操作相关的信号量结构体struct sys_sem_t、信号量建立函数sys_sem_new()、信号量释放函数sys_sem_free()、信号量发出函数 sys_sem_signal()和信号量等待函数sys_arch_sem_wait()。由于在μC/OS-Ⅱ中已经实现了与信号量操作有关的各种函数,而且功能和上述几个LwIP中所需要实现的函数的功能是完全一致的,所以只要调用μC/OS-Ⅱ中的信号量操作函数来重新包装成LwIP中的信号量操作函数即可。
2.1.2 邮箱操作函数
LwIP使用邮箱来进行消息传递,用户可以用一个队列来将其实现,需要注意的一点是,投递进邮箱中的消息只能是一个指针。因此要根据以上要求来实现消息队列结构sys_mbox_t,以及相应的操作函数:sys_mbox_new()、 sys_mbox_free()、sys_mbox_post()和sys_arch_mbox _fetch()。μC/OS-Ⅱ很好地实现了消息队列结构及其操作,为消息队列提供了丰富的管理函数,但μC/OS-Ⅱ没有对消息队列中的消息进行管理,因而不能直接使用,必须在μC/OS-Ⅱ的基础上重新实现。具体实现时,可创建多个邮箱,并使用单向链表将这些邮箱链接在一起,每个邮箱可接收消息的数量由消息数组的大小来决定。对消息队列本身的管理用μC/OS-Ⅱ中的队列操作函数来完成,然后通过对链表的操作来实现对消息的创建、使用、删除和回收,两部分综合起来形成了LwIP的邮箱功能。
2.1.3 创建新线程函数
在μC/OS-Ⅱ中只有任务的概念,建立一个新的线程实际上就是建立一个新的任务。因此只需要把OSTaskCreate()封装一下,就可以实现sys_thread_new()。需要注意的是当前μC/OS-Ⅱ 不支持时间片轮番调度法,不允许两个或两个以上的任务有同样的优先级,所以用户要事先为LwIP中创建的线程分配好优先级。通过对LwIP中的宏 TCPIP_THREAD_PRIO进行包装,来避免TCPIP线程优先级与其他线程相同。
2.1.4 定时器函数
LwIP中每个线程都有一个timeouts链表,这个链表在建立之后其首地址必须固定。因此用于保存链表首地址的sys_timeouts结构必须与线程一一对应,而且其地址不能改变,以便能够随时得到链表的首地址。可用一个静态的sys_timeouts结构数组来存放各个线程的链表,以线程的优先级号来作为数组索引号,这样每一个线程就能对应一个sys-timeouts结构体了,并且在系统运行期间对应的结构体数组成员的地址会一直固定不变。移植时通过实现 stmctsys_timeouts*sys_arch_timeouts(void)函数,来返回目前正处于运行态的线程所对应的timeouts队列指针。
2.2 驱动程序
操作系统是通过各种驱动程序来和各种硬件打交道的,驱动程序为用户屏蔽了各种各样的硬件设备,而只提供了简单明了的函数接口给操作系统调用。LwIP已经设计好了这些框架,用户只需严格按照顺序完成与底层硬件相关的部分即可实现网络接口层和IP层的通信。需要实现的包括:底层网络接口初始化函数ethernetif_init()、网卡接收函数ethernetif_input()、网卡发送函数 ethernetif_output()和网卡中断处理函数ethernetif_isr()等。驱动程序完成了对设备的初始化、释放和管理,并且完成对底层以太网数据包的接收、搬运和发送。
2.3 应用程序
系统应用程序的任务主要是在嵌入式平台上实现网络通信客户端和HTTP网页服务器两方面的功能。利用LwIP提供的API,采用TCP协议客户端到服务器通信的模式,实现嵌入式终端和上位机之间的通信。在这种模式下,嵌入式终端定义为客户端,主动向服务器发起TCP连接;而上位机(PC)定义为服务器端,始终监听来自网络的连接。嵌入式终端主要负责采集来自于传感器或RFID模块的数据,并将这些数据通过以太网传送给上位机。同时嵌入式终端平台上也运行着一个HTTP网页服务器,上位机(PC)可通过网页对嵌入式终端平台进行访问、查看和设置。
三. WEB服务器的实现
HTTP定义了浏览器与服务器交互的不同方法,最基本的方法有4种。本系统的实现只涉及到GET和POST这两种最基本的方法。GET一般用于向服务器获取和查询资源信息,而POST一般用于向服务器上传和更新没有长度限制的、大容量的资源信息。一个基本的WEB服务器要实现动态网页服务的关键是要能够对浏览器发送的GET或POST请求做出响应。一般情况下制作动态网页需要使用语言:HTML+ASP或 HTML+PHP或HTML+ JSP等。要在资源有限的嵌入式系统上实现这样的功能是不现实的,一种明智的办法是通过使用回调函数的方式,为浏览器的每一种请求都设计一个服务函数与之对应。当有新增加的GET或POST请求时,则只需要增加相应的服务函数即可。具体实现时可设计一个存放服务函数地址的结构体,其成员包括所请求服务参数的长度、名称和对应服务函数的地址。然后将所有的结构体都初始化在一个数组中。
在编写应用程序的时候,只需抓取浏览器所发送的请求类型和参数,即可根据不同的请求来调用相应的服务函数。当有新的GET或者POST请求增加时,只需要增加与之对应的服务函数即可,这样就实现了扩展性很强的动态网页服务。WEB服务器响应浏览器访问的流程如图3所示。
图3 浏览器请求响应流程图
POST请求分为带参数和不带参数两类,带参数的POST请求,如:设置IP地址,子网掩码等操作,需要提取相关参数后再调用服务函数进行处理。不带参数的POST请求只需直接调用相应服务函数即可,如:重启系统、恢复默认参数等操作。远端PC可以通过该动态WEB服务器来对平台进行访问,完成上述几项操作。在第一次启动本系统时,系统通过运行DHCP客户端程序,向DHCP服务器(路由器等设备)主动申请IP地址,获得IP后,远端PC即可通过该IP地址对本系统进行访问和设置。
四. 结束语
平台采用AT91SAM7X512处理器和DM9161以太网物理层芯片。两者通过MII接口连接,高集成度的处理器提高了系统稳定性,降低了数据传输出错机率。通过向终端平台移植LwIP协议,使终端具备连入以太网的能力,并通过调用函数的方式在该低成本平台上实现了动态网页服务器。在局域网条件下运行该终端和上位机PC进行连接,能很好的通过网络传递RFID读卡器采集的信息,并且上位机PC能够通过网页对本终端进行访问和参数设置。针对更复杂的远程网络连接和访问,网络延迟和丢包等问题还有待进一步的研究。