王云亮 ,王光林
(1.天津理工大学 天津市复杂系统控制理论及应用重点实验室,天津300384;2.天津理工大学 自动化学院,天津300384)
现如今无线通信的方式越来越多,组网模式也千姿百态。一般研究同种操作系统下的Socket或WiFi通信的比较多,但在两种系统开发环境下WiFi之间的通信研究却并不多。众所周知,Linux操作系统由于其系统源码的自由和开放性,以及系统性能的稳定性,被广泛用作服务器的操作系统。而Windows由于其友好的图形界面和强大的编程环境,常被广泛用作客服端的开发环境和操作系统[1]。因此,研究两大操作系统的实时通信问题具有一定的现实意义。
本文主要研究嵌入式Linux下的ARM与Windows环境开发下的STC80C51单片机之间的无线通信问题,通过套接字编程由WiFi进行传输,成功实现了两大开发环境下数据的无线传输,基本解决了两者之间的通信问题。
Socket通常称作 “套接字”,用于描述IP地址和端口,是一个通信链的句柄。在客户端/服务器通信模型中,Socket是网络通信的基本操作单元,一个Socket描述就是通信连接的一端,在一个网络通信连接中,两端通信程序应各有一个Socket对其进行描述,不同的进程通过各自的Socket发送和接收消息,从而实现了网络通信[2-3]。
Linux Socket支持以下 3种常见的套接字类型:(1)流式Socket(SOCK_STREAM),一种最常用的套接字类型,可以保证数据传输的可靠性,不会出现数据丢失、破损或重复出现等差错;(2)数据报 Socket(SOCK_DGRAM)是一种无连接和不可靠的双工数据传输服务,数据通过独立的报文进行传输,是无序的,并且不保证数据的可靠性和无重复性,适用于可靠性要求不高的一些场合;(3)原始 Socket(SOCK_RAW),这种类型的 Socket允许对底层协议(如IP或ICMP)直接访问,它功能强大但使用不太方便,一般用于新协议的开发。
Socket的编程方法很多,但主要有两种方式——面向连接的TCP协议方式和无连接的UDP协议方式。本文采用的是TCP协议方式。
本文研究的是两个平台的通信,服务器是内有嵌入式Linux操作系统的ARM开发板,客户端是运行于Windows操作系统开发环境下的单片机。本文在实际研究中,服务器端选用ARM11系列的S3C6410为开发平台,内部嵌入Linux2.6.28内核版本,目标代码的编译平台选用装有Ubuntu12.04操作系统的普通PC,它们通过交叉编译和NFS挂载的方式实现了服务器端编译平台和运行平台的正常运行;客户端是在Windows XP系统开发环境下的带有各种传感器的51单片机。
为了实现二者之间的通信,WiFi模块在此过程中起到枢纽的作用,因此通信两端都有一个WiFi模块。在服务器端的WiFi模块选用的是Marvell 88w8686[4],它是一款低成本、低功耗、自带数据链路层的WiFi协议栈,内部集成了两个工作频率为128 MHz的ARM7 Core,一个 Core负责网络数据的处理,另一个Core负责处理RF方面的工作。该模块通过SDIO接口与ARM开发板相连。
客户端的WiFi模块选用海凌科电子有限公司新推出的HLK-RM04模块[5],是基于通用串行接口的符合网络标准的低成本嵌入式模块。通过该模块,传统的串口设备在不需要更改任何配置的情况下,即可通过Internet网络传输自己的数据。模块通过双9针工头串口线与单片机相连,功能结构图如图1所示,由于该模块内置了TCP/IP协议栈,能够实现用户串口、以太网、无线网(WiFi)3个接口之间的转换。
图1 HLK-RM04模块的功能结构图
至此,整个系统的通信平台的搭建已经完成,系统的整体结构功能框图如图2所示,从图中可以看出WiFi模块的组网模式。
本文以采集到的温度值的传输来说明实现的过程。下面分别从服务器端和客户端进行介绍。
图2 系统的整体功能结构框图
虽然在举例中采用的是单一客户端与服务器进行通信,但考虑到实际中往往会遇到多个客户端连接服务器的情况,像常用的recv、send都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入睡眠状态,这样就无法处理I/O多路复用的情况。鉴于此,使用select函数既可以实现非阻塞I/O或信号驱动I/O,还可以设置等待时间。服务器端实现的程序流程图如图3所示。
接下来对其中一些关键性的步骤进行阐述。
(1)建立 Socket
socketfd=socket(AF_INET,SOCK_STREAM,0);
图3 服务器端的程序流程图
AF_INET表示的是针对Internet的通信协议,允许在远程主机之间通信;SOCK_STREAM表明使用的是TCP协议,这样会提供按顺序的、可靠的、双向的、面向连接的比特流;0表示成功时返回文件描述符,失败时返回-1,这样通过errno即可知道出错的详细情况。
(2)绑定和监听
它们都是成功时返回0,出错时返回-1。
(3)调用select函数与客户端连接
客户端的实现实际上分两部分进行:一是单片机通过DALLAS公司的DS18B20温度传感器将采集的数据传送给串口;二是与之用串口线相连的 RM04模块,通过 WiFi与服务器建立连接,具体实现的程序流程如图4所示。
图4 客户端的程序流程图
第一部分采集数据传给串口的过程需要注意数据在发送的过程中应该把数据以ASCII形式发送,这样服务器端才能以想要的十进制的形式显示出来,其他的比较简单,不再赘述。主要介绍第二部分中RM04模块的配置。
(1)调到相应的端口,搜索到该模块。
(2)以无线网卡的模式配置该模块,选择TCP客户端模式,远程端口的IP和端口号,无线局域网的名称与密码,本模块的IP等,具体配置图如图5所示。
图5 RM04模块配置图
(3)在命令窗口下 ping 192.168.1.120,如果 ping通,说明该模块成功。
在Linux系统中进入开发板,先启动服务器端,再运行客户端程序,服务器端出现如图6所示的结果。
图6 服务器端的运行结果图
通过图6可以看出,客户端与服务器端之间能够正常通信,并能正确显示出当前测量的温度是27.35℃。该项研究主要针对总控制器与分节点之间的无线通信,对于需要这种模式通信的系统有很大的实际使用价值。
[1]Li Fei,Yuan Lin,Wang Zhihuo,et al.Realization of communication between Linux and Windows based on Socket[C].Proceedings of the 2010 International Conference on Information Technology and Scientific Management,2010.
[2]王远洋,周渊平,郭焕丽.Linux下基于Socket多线程并发通信的实现[J].微计算机信息,2009,25(5-3):70-72.
[3]郭东升,田秀华.Linux环境下基于Socket的网络通信[J].软件导刊,2009,8(1):116-118.
[4]王云亮,李莹.嵌入式安防远程监控系统的设计[J].化工自动化及仪表,2013,40(2):237-240.
[5]深圳市海凌科电子有限公司.HLK-RM04应用手册1串口转以太网应用[K].2012.