基于无线自组网通信的应用程序设计与应用
姜云超
南京六九零二科技有限公司 南京 210009
摘要:本文首先介绍了软件开发过程中应用程序要实现的功能以及在实际中的作用,并基于无线自组网通信介绍了应用软件的整体结构设计。其次使用多线程编程、消息队列、信号通知、套接字等机制完成各项功能需求。最后,根据实际项目需求完成了应用程序设计,并在公司自研设备上进行了应用。
关键词:自组网;无线通信;应用程序;程序设计
1.引言
在软件开发过程中,应用程序具有提供用户界面与操作、实现业务逻辑、建立与底层服务的桥梁、数据处理与展示等重要作用[1]。它不仅提供了用于与系统交互的接口,还将底层复杂的技术细节进行了封装,提高用户需求的同时又提升了系统易用性。在无线自组网通信中,需要实现数据传输、参数配置、LED灯状态显示、按键状态检测等功能,这些功能都需要应用程序来控制实现。本文探讨无线自组网通信中的应用程序设计,并将其在实际项目中应用。
2.应用软件系统概述
2.1应用软件功能需求
在无线自组网通信中,需要实现话音数据传输、视频数据传输、协议层与物理层相关参数配置、LED灯状态显示、按键输入控制、上位机命令配置等功能,这些都需要应用程序参与完成。在应用程序运行中,多项任务需要同时进行或协作进行,如在视频数据传输时需要实时捕获按键状态以及LED灯状态显示等。为了实现多项任务并行、提高程序响应能力及性能[2],本文采用多线程编程,对应用程序进行设计。多线程在共享资源时可能出现竞争问题,导致数据不一致或冲突,在线程间通过消息队列机制进行数据传输,多线程间协作运行,完成各项任务。
2.2应用软件整体结构设计
根据功能需求,该应用程序一共设计了9个线程,如图1所示。分别为LED灯控制线程、上位机交互线程、话音数据接收线程、话音数据发送线程、协议处理线程、网口数据接收线程、网口数据发送线程、按键控制线程、北斗数据接收线程,在初始化后9个线程开始工作运行。
LED灯控制线程主要用于显示当前数据发送状态、数据接收状态、北斗开关状态、组网状态等信息。在需要切换LED灯状态时,该线程会收到相关命令,并对LED灯进行显示状态进行切换。
上位机接收线程主要用于与上位机进行交互,接收上位机下发的操控命令将其执行或发送至协议层和物理层,同时将当前系统工作的各项状态及参数轮询发送至上位机进行显示。该线程在初始化过程中创建socket套接字,等待上位机连接。
话音数据接收线程与话音数据发送线程主要用于通过串口向话音模块读写数据。在发送话音时,话音模块捕获话音数据并将其进行编码,话音数据发送线程通过串口读取话音模块的编码并将其发出;在接收话音时,话音数据接收线程通过串口将接收的数据写入话音模块进行解码播放。
网口数据发送线程与网口数据接收线程主要用于发送与接收网络数据包。在为其它节点设备提供视频流时,网口数据发送线程负责捕获所连接的摄像头向该设备网口发送出的视频流数据包,并将该网络数据包送发送出。在获取视频流时,网口数据接收线程负责将收到的其它节点发送过来的网络数据包发送至相应网口,连接该网口的电脑端读取到网络数据包数据后在相应软件播放视频流。
按键控制线程主要用于实时捕获设备按键状态,并根据按键状态改变执行相关操作,如实现参数复位、进行组网操作等。
北斗数据接收线程主要用于通过串口读取北斗数据,并将北斗数据解析出送至上位机进行显示。
协议处理线程作为数据接收与发送枢纽,该线程中又分为发送线程与接收线程。发送线程用于接收当前节点中需要发送的话音或视频数据,并将其送至协议发出。接收线程用于接收协议收到的其它节点数据,并按类别发送给相应线程进行解析。
3.应用软件功能模块设计
3.1初始化
在应用程序启动后,首先进行初始化。初始化过程主要任务如图2所示。首先创建多个线程分配相应资源,并初始化相关消息队列用于多线程间数据传输。在创建完成后,读取系统配置文件。该文件存于设备中,主要用于保存该设备的默认配置参数,如当前设备节点号、宽窄带状态、发送频率、接收频率、发送增益、接收增益等参数。该设备与话音模块、北斗模块都是通过串口获取数据,因此在初始化阶段需以相应的波特率打开对应串口,并与串口描述符进行绑定。
在完成上述操作后,进行注册信号、初始化定时器等操作。信号是一种重要的通信机制,主要用于异步通知线程或进程特定的事件发生。在本设计中信号主要用于接收协议层的组网状态通知,在设备使用过程中,协议层组网状态会发生变化,协议层将组网状态通过信号上报至应用程序,应用程序在接收到信号后根据不同信号数据执行相应操作。定时器在本设计中主要用于实现看门狗功能,在系统运行过程中,应用程序需要实时与协议进行交互,当协议出现异常时,如出现运行异常导致挂死时,应用程序无法察觉(协议栈在其它CPU上运行,本文暂不介绍双核交互部分)。因此通过定时器实时检测,当出现协议异常挂死时,应用程序在定时器规定时间内没有检测到协议层的任何通知即喂狗操作,此时应用程序将执行系统重启。当一切初始化就绪,通过LED灯状态显示告知用户已初始化完成进入工作状态。
3.2多线程间协作交互
在系统运行过程中,各个线程不是独立运行的,它们之间存在协作关系。在发送话音数据时,按住设备话音按键进行话音录音,此时按键控制线程检测到按键状态发生变化,按键控制线程发送数据通知话音数据发送线程;话音数据发送线程收到通知后,首先通过串口向话音模块写入话音模块开启指令并进行编码,开启编码后通过话音模块串口读取编码数据,并将数据发送至协议处理线程;协议处理线程获取数据后进行组帧并发送至协议层,同时通知LED灯控制线程改变LED灯状态告知用户数据正在发送。当松开设备按键时,同样由按键控制线程检测到按键状态发生变化,发送数据通知话音数据发送线程使其向话音模块写入话音模块关闭指令并停止解码。协议处理线程将编码数据发送完毕后阻塞等待下一次数据到来。
同理,在接收网络数据包时,首先由协议处理线程接收到协议层发送来的网络数据包,协议处理线程首先对数据帧结构进行解析,根据数据帧头部确定数据类型,判断为网络数据包后将该数据发送给网口数据接收线程,同时发送数据至LED灯控制线程,通过状态指示灯告知用户接收到数据。网口数据接收线程收到数据后将网络数据包交付至相应网口,相应网口连接的电脑或摄像头收到网络数据包后对数据进行处理。
在系统运行过程中,多个线程协作交互运行,而消息队列充当多线程间数据交互的桥梁。
3.3消息队列传输数据
消息队列是一种常用的线程或进程间通信机制,能够有效传递数据并实现任务协同。在本文使用的多线程编程中,线程间交互由消息队列来完成。消息队列主要功能有任务同步、数据解耦、缓冲数据、异步处理等[3]。在使用消息队列传输数据过程中,它不仅协调了多个线程的执行顺序,还起到了缓存接收与发送数据的作用,确保了多线程快速、稳定的运行。本文设计的应用程序在数据发送与接收流程中均使用了多个消息队列,数据接收流程图如图3所示。应用程序中协议处理线程在接收到协议层交付的数据后,根据数据帧头部解析出的类别发送至网口接收消息队列或话音接收消息队列中。网口数据接收线程和话音数据接收线程都在阻塞式等待消息队列中的数据,在消息队列中接收到数据后开始执行后续流程。同理,对LED灯的控制命令也发送至LED灯控制消息队列中,LED灯控制线程在读取到LED灯控制消息队列中的数据时,根据命令执行相应操作。
数据发送流程为数据接收流程逆过程,与数据接收流程类似,同样采用消息队列通信机制。
3.4上位机数据交互
在根据LED灯状态确定系统初始化完成后,打开上位机软件,根据设备IP地址与设备建立连接。设备的状态信息会在上位机上进行显示。同时,初始化过程中的参数配置也会在上位机软件中进行显示,其中包括本地节点号、发送频点、发送增益、接收频点、接收增益、当前速率、软件版本、主/属台、目的节点号等信息。并且,可以通过上位机软件对上述参数进行配置,新的参数在设备中生效后,上位机软件显示的参数也会及时更新。在通过上位机软件打开北斗后,北斗数据信息也将被实时显示。上位机软件作为人机交互的工具,它将新的指令传输至应用程序,应用程序根据相应指令执行相应操作。如在与其他节点进行话音通话时,在上位机软件中设置目的节点号,应用程序根据上位机下发的目的节点号,给协议发送相应数据,从而与目的节点建立通信来发送话音数据。
4.测试
4.1测试设计
测试平台:公司自研无线自组网通信设备
测试系统:Linux
其它设备:电脑、语音受话器、摄像头
测试设备连接图如图4所示,测试步骤如下:
(1) 将应用程序编译后,得到可执行文件。
(2) 将可执行文件拷贝到设备根文件系统目录下。
(3) 启动设备,分别测试话音数据传输、视频数据传输、按键控制、LED状态显示、上位机软件交互等功能。
(4) 结果分析:
通过对设计的应用程序进行应用测试,验证了程序设计的各项功能。话音数据、视频数据均可流畅传输,LED灯可以实时显示数据发送状态、数据接收状态、组王国状态以及北斗开关状态等信息,上位机可实现参数配置与实时显示等功能,与此同时,按键控制也可以实时响应,通过应用验证了程序的有效性。
5.结束语
本文探讨了无线自组网通信的应用程序设计与应用,包括无线自组网通信中的应用软件功能需求、应用软件整体结构设计、应用软件功能模块设计、应用测试等部分;设计过程中运用了多线程编程、消息队列、信号通知、定时器等多种机制,满足了无线自组网通信中的各项业务需求,最后使用公司自研设备进行了验证测试。通过本文可以得出,应用程序在软件程序设计过程中起着非常重要的作用,它作为用户和系统之间的桥梁,让复杂的系统功能简单化,并且集中处理业务逻辑,将用户操作转化为系统指令,完成特定功能。
参考文献:
[1] 蔡建平.关于嵌入式应用开发技术[J].单片机与嵌入式系统应用,2001,(03):5-11+34.
[2] 吴先亮,刘春生.基于多线程的串口通信软件的设计与实现[J].控制工程,2004,(02):171-174.
[3] 李小群,赵慧斌,孙玉芳.进程间通信机制的分析与比较[J].计算机科学,2002,(11):16-21.