嵌入式系统与移动设备间探讨

时间:2022-10-20 09:43:03

嵌入式系统与移动设备间探讨

1基于Socket的嵌入式广播服务系统软件体系

本广播服务系统软件体系分为嵌入式服务器端与移动客户端。其中,嵌入式服务器端与通用计算机软件体系类似,分为硬件层、驱动层、操作系统层、中间层及应用层。硬件层汇集了网卡芯片,一般情况下自适应10/100M网络,并含有网络接口连接头;驱动层为操作系统层和应用层提供硬件驱动或底层核心支持,对于网络通信来说需要加载与网卡芯片相适应的网络驱动;操作系统层负责嵌入式系统的全部软硬件资源的分配、调度工作控制、协调并发活动,使得编写应用程序更加快速、高效、稳定;中间层用于支持应用软件开发的软件,如与网络有关的测试软件等。本系统开发的Socket服务器程序处于特定应用领域的应用层,此层的产品要求功耗低、专用高效。移动客户端软件主要由App构成,它可通过TCP方式下的Socket与嵌入式服务器端进行通信。

2嵌入式系统Socket服务器广播功能核心技术

2.1TCPC/S方式下Socket通信基本流程流式

Socket提供可靠的、面向连接的通信流,它使用TCP协议,保证了数据传输的正确性和顺序性。从Socket程序执行的流程上看,服务器先行启动,通过调用socket()建立一个Socket,然后调用bind()绑定本地网络地址与端口,再调用listen()创建Socket监听队列并开始监听,之后调用accept()来接收客户端的连接请求,此时服务器程序会阻塞等待在这里,直到TCP客户端主动调用connect()进行三次握手建立连接。客户端通过socket()建立Socket后,调用connect()与服务器建立连接。连接后客户端的write()函数向服务器发送数据,服务器端通过read()来读取数据,服务器向客户端发送数据仍然遵循这样的方式。最后服务器与客户端均可通过close()主动关闭彼此间的连接。图2展示了TCPC/S方式下的Socket程序设计流程。

2.2Socket通信信息结构

Socket服务器程序在网络中是通过IP地址和端口号来标识自身的唯一性的,IP地址指明了Socket服务器程序所在的网络主机,端口号指明了网络主机上的服务程序,需要两个结构体类型(sockaddr_in和sockaddr)用来保存Socket信息[3]。

2.3Socket服务器转发信息实现广播服务的核心问题解决

由于每个移动客户端均要与Socket服务器建立连接并做互不干扰的通信,Socket服务器程序有必要将与客户端的连接功能和通信功能分开,保证服务器程序与某一客户端程序通信时,其他客户端也能与服务器程序建立连接,反之亦然。因而,程序在连接与通信这两种任务之间来回切换,并发执行,这就需要采用多线程技术。多线程对数据是共享的,也就是每个线程都能够从同一个共享数据池获取数据[5],这也是本程序没有采用多进程技术的原因,在多进程设计中,数据共享复杂,需要使用IPC;对于多线程设计,数据共享简单[6]。2.4Socket服务器程序的编译与运行服务器端Socket程序是在Xubuntu系统下Code::Blocks开发环境完成的,它需要绑定armlinuxgcc交叉编译器,采用LinuxC++语言编写,编译后的程序可通过串口通信方式移植到嵌入式开发板(如Friendlymini2440)上运行。在Xubuntu上的控制终端书写指令程序,运行状况如图3所示。

3移动设备TCP客户端程序的实现

Android或苹果系统手机及平板电脑可以作为Socket客户端的移动设备,由于嵌入式服务系统中使用了C语言构建Socket服务程序,客户端程序使用XE10(C++Build-er)中的FireMonkey框架开发跨平台的应用程序[7]适应性较强,更关键的是其提供的TIdTCPClient组件完全支持Socket阻塞式工作模式,可以简单快速地实现Socket客户端网络通信功能。

3.1TIdTCPClient组件常用属性与方法

XE10开发软件多以组件为基础,为开发人员提供了高效开发的快捷元素。移动客户端程序涉及的Socket通信组件TIdTCPClient常用属性与方法如表1所列。

3.2移动客户端向服务器发送数据

客户端程序可视化界面由文本框Edit1、多行文本框Memo1以及按钮Button1、Button2组成。Edit1用于书写向服务器发送的信息;Memo1主要用于显示服务器转发给客户端的信息,此外也显示客户端的异常信息;Button1用于启动发送信息功能,Button2用于发送关闭连接功能。

3.3运用多线程技术接收服务器数据

当移动客户端向嵌入式系统服务器发送信息后,服务器会将信息转发给已经与该服务器建立连接的各个移动客户端,客户端在接收信息后需实时显示到Memo1多行文本框中,而且还要保障发送按钮Button1能够正常发送数据,所以接收数据需要多线程技术的支撑,也就是将接收数据的功能从发送数据的主线程中独立出来。C++BuilderXE10在开发移动程序时启用了崭新的多线程技术,TThread类中的静态方法CreateAnonymousThread可用于创建匿名线程对象[7]。其参数是线程中被执行的方法,该方法同属于主窗体类,无需建立额外的线程类实现其功能。

4结语

随着硬件系统的不断发展以及物联网技术的不断成熟,嵌入式软件得到了广泛的应用[8]。本文阐述了嵌入式系统下Socket广播服务的原理结构、核心技术及实现方法,采用一个移动客户端对应服务器程序开辟的一个通信子线程的方式,解决了多个移动客户端与Socket服务器程序连接与通信相互干扰的问题,成功进行了广播服务通信,并且极大地简化了网络通信程序的开发过程。

作者:王双立 王楷鑫 王雁鹏 魏强 单位:北华大学山西传媒学院