无桩式公共自行车租赁系统站点研究与设计第4章上.docx
- 文档编号:1296900
- 上传时间:2022-10-20
- 格式:DOCX
- 页数:19
- 大小:389.66KB
无桩式公共自行车租赁系统站点研究与设计第4章上.docx
《无桩式公共自行车租赁系统站点研究与设计第4章上.docx》由会员分享,可在线阅读,更多相关《无桩式公共自行车租赁系统站点研究与设计第4章上.docx(19页珍藏版)》请在冰豆网上搜索。
无桩式公共自行车租赁系统站点研究与设计第4章上
本章主要对无桩式公共自行车租赁系统站点进行详细设计。
分别对站点控制器和车载终端进行了详细设计,规定了无线通信数据帧格式,并针对无线通信的可靠性和安全性进行了设计。
4.1站点控制器软件详细设计
站点控制器软件包括启动引导程序、嵌入式操作系统、支持库和应用程序组成。
站点控制器选用Linux嵌入式操作系统作为软件运行平台,采用Sqlite数据库作为本地数据库,用来保存车辆信息等;站点控制器提供TFTP(TrivialFileTransferProtocol,简单文件传输协议)功能和Telnet远程登陆服务,便于更新站点文件和维护管理;应用程序采用Qt开发平台进行开发,Qt是挪威Trolletch公司开发的一个跨平台的GUI开发工具,采用面向对象编程。
站点控制器软件结构如图4.1所示。
图4.1站点控制器软件结构
4.1.1站点控制器开发板环境搭建
站点控制器具备稳定、可靠、功能健全的运行环境是站点控制器应用程序可靠、有效运行的前提。
Linux开发平台搭建主要包括u-boot的移植和linux内核移植、SQLite数据库的移植,TFTP文件传输功能和Telnet远程登录功能的支持,QT库的移植。
开发环境搭建流程如图4.2所示。
图4.2开发板环境搭建流程
下面仅介绍站点控制器开发板Linux开发环平台境的搭建,内容包括uboot、Linux内核的移植,各种支持库的移植和文件系统的制作。
1.移植uboot、Linux内核
本文采用的ARM核心板是由德州仪器(TexasInstruments,TI)开发的AM3354嵌入式核心板,TI公司提供了针对AM3354嵌入式核心板的软件开发工具包(SoftwareDevelopmentKit,SDK),在TI官网下载SDK包6.00,进行配置、编译。
由于TI的am335xevm开发使用eeprom保存了板载配置信息,用来区分不同板子的型号的,需要修改eeprom相关代码:
include/configs/ti_armv7_common.h、board/ti/am335x/board.c、board/ti/am335x/board.h、board/ti/am335x/mux.c,去掉读取eeprom的相关代码。
2.制作文件系统
由于站点控制器对支持库要求较多,如sqlite3数据库支持、QT库支持、TFTP文件传输功能支持、Telnet远程登录功能支持,而官方提供的文件系统中不能完全支持这些功能。
因此,根据需要制作自己的文件系统。
(1)Busybox版本为busybox-1.9.2,配置时需要添加对Telnet和TFTP的支持,经过编译、安装,生成根文件系统的初始化文件和工具库。
(2)嵌入式Linux系统采用udev管理设备文件,启动udev服务要将sysfs文件系统挂载到/dev下。
/dev目录下的设备文件在内核挂载完根文件系统后,系统使用mdev自动建立;mdev是通过调用init进程来启动的,init进程会用到/dev目录下的两个设备文件:
“dev/null”和“/dev/console”,必须要在/dev目录下创建这两个设备文件。
(3)etc目录必须添加inittab、fstab、init.d/rsC、profile等文件。
其中,inittab为启动脚本配置文件,必须添加“:
:
sysinit:
/etc/init.d/rcS”,然后创建init.d目录,在init.d目录下创建rcS启动脚本文件,rcS启动脚本文件内容需要手动编写,必须添加“mount–a”命令语句来挂在fstab中的文件系统,添加“mdev-s”命令来动态更新驱动程序,添加“source/etc/profile”来执行proflie脚本文件,proflie脚本文件用来对环境变量、开机启动程序进行配置,rcS文件要具有可执行权限。
(4)添加telnet远程登录功能,需要在etc下创建文件passwd,group,shadow三个文件,使用adduser添加用户root,在profile添加命令行提示符格式,并启动启动telnet服务。
(5)移植sqlite3数据库,经过配置、编译安装后,必须将编译安装文件夹中/bin、/lib、/include目录中的可执行文件sqlite3、库文件libsqlite3.a和头文件sqlite3ext.h、sqlite3.h分别复制到文件系统对应的文件夹下,即可。
(6)移植Qt图形界面库:
QT源码版本为qt4.5.3,经过配置、编译、安装,生成Qt库文件;将编译安装生成的Qt库文件拷贝到开发板指定的目录/forlinux/qt/lib下,在/etc/profile脚本文件设置环境变量,指定库文件路径;需要注意的是,必须移植wenquanyi中文字符库到指定的Qt字符库文件夹下,使Qt库支持中文显示。
QT移植配置时必须选择对sql数据库的支持,否则无法支持sqlite3数据库。
4.1.2站点控制器管理程序设计
站点控制器管理程序主要在后台实现,采用多线程编程技术[38],分为三个部分:
与WEB服务器间的交互,与车载终端的交互,自身的管理控制。
与WEB服务器间的交互:
主要是由TCP线程、UDP线程、FTP线程以及定时器线程来完成。
与车载终端的交互:
CC1101线程。
自身的管理控制包括主线程,CC1101线程。
站点控制器管理程序线程规划如图4.3所示。
图4.3站点控制器应用程序线程规划
Qt提供了独立于平台的线程类QThread,它是Qt提供的一个接口,用于控制一个子线程,QThread提供了一个公共槽接口start(),通过调用start()即可开启线程,在QThread类的virtualprotected函数run()中添加用户程序,可以在不同的线程中调用不同的方法实现不同的功能。
1.主线程设计
主线程从main函数开始执行,而在主线程中创建其他线程,其他线程派生于QThread类;主线程程序流程如图4.4所示。
图4.4车辆管理应用程序主线程程序流程
主线程主要负责界面初始化、配置初始化,初始化sql数据库,服务器端口,与后台服务器进行TCP、UDP连接,开启串口线程、定时器线程、UDP线程、FTP线程、服务器线程、CC1101线程。
主线程从main函数开始执行,通过font.setFamily(("wenquanyi"))指定QT字符库,完成界面初始化等操作;站点控制器设置采用配置文件方式设置IP地址和定时参数,通过QSettings类实现对配置文件的读取,读取并设置IP地址如下:
QSettings*configIniRead=newQSettings("config/SiteIp.ini",QSettings:
:
IniFormat);
//将读取到的ini文件保存在QString中,先取值,然后通过toString()函数转换成QString类型
QStringServerIp=configIniRead->value("ServerIp/Ip").toString();
数据库的初始化通过QSqlDatabase类完成,QSqlDatabase类提供一个通过数据库连接来访问数据库的接口,定义一个QSqlDatabase对象db,通过db.setDatabaseName("./sql/LocalSiteSql")连接到工程目录下的sql/LocalSiteSql数据库,通过接口函数tcpserverconnection()完成与服务器的连接。
2.定时器线程
定时器线程periodthread负责完成站点控制器与后台服务器的周期性时间同步,定时监测网络和环境温度,定时查询当前站点下的车辆状态。
定时器线程中时间同步流程如图4.5所示。
图4.5时间同步程序流程
在QT中,采用定时器类QTimer使用定时器,定时器类QTimer提供当定时器触发的时候发射一个信号的定时器,提供只触发一次的超时事件。
通过定义一个QTimer类来创建站点控制器时间同步定时器SyncWithBackTimer,通过connect函数将定时器信号与槽联系,通过SyncWithBackTimer->start(1000)启动定时器,并设置定时间隔,当同步时间到达时,通过执行时间同步命令与后台管理系统实现时间的同步。
ntpdateip表示与后台进行时间同步,hwclock–w表示将系统时间写入到硬件时钟。
信号—槽机制:
定时器线程采用Qt中信号—槽机制用于对象之间的通信,定时器采用信号—槽机制将定时器的timeout()连接到适当的槽,当定时器时间到达后,发射timeout()信号。
槽通常是类中的成员函数,用于接收信号,信号和槽通过connect()函数关联,当有信号发生时触发相应的槽函数。
定时器信号—槽机实现如下所示:
QTimer*SyncWithBackTimer=newQTimer(this);//创建定时器
connect(SyncWithBackTimer,SIGNAL(timeout()),this,SLOT(period_ntp()));//将定时器超时信号与槽(功能函数)联系起来
3.UDP线程
UDP线程主要用于接收服务器发送的广播信息,功能包括初始化UDP线程,完成UDP广播包接收,并对广播包进行分析处理。
UDP线程流程如图4.6所示。
图4.6UDP线程程序流程
与后台服务器连接采用QTcpSocket类实现,QTcpSocket类提供一个TCP套接字,通过tcpsocket_udp_9600->connectToHost(ServerIp,9600)连接到服务器,服务器端口号为9600,监听来自后台服务器的下发广播数据。
QTcpSocket使用连续的数据流,QUdpSocket类共享了QTcpSocket的大多数接口,以数据包的形式发送数据,这里采用QUdpSocket:
:
bind()绑定到9050端口,并接收进入的数据报,当一个或者多个数据报到达时,QUdpSocket就会发送readyRead()信号,通过信号-槽连接机制connect(sUdpSocket,SIGNAL(readyRead()),this,SLOT(read_9050())),将信号和read_9050()联系起来,在read_9050()中调用QUdpSocket:
:
readDatagram()来读取数据报,将数据传递给processdata(dataStr),processdata()函数根据协议对数据进行分析处理。
4.FTP线程
FtpThread线程与后台进行文件传输,线程主要进行初始化FTP连接,完成文件的接收和上传的功能,同时完成对文件的转换。
FTP线程流程如图4.7所示。
图4.7FTP线程程序流程
启动FTP线程时,根据站点情况下载相应的配置文件,包括:
站点费用管理表、站点网络配置表、所有站点信息表等;在站点运行过程中,需要上传的文包括:
租车记录表、租还车记录表、锁定车辆记录表等。
站点控制器文件的上传和下载方式具体实现过程是:
(1)打开文件,读取文件类容;
(2)将文件内容采用linux套接字方式进行传送给接收方;(3)在接收方创建相同文件,将接收到的内容写入到文件中。
文件传输实现过程是:
首先通过socket(AF_INET,SOCK_STREAM,0)创建套接字m_sockdata,通过connect(m_sockctrl,(sockaddr*)&addr,sizeof(addr))请求连接,通过fread(sendbuf,1,255,pf)将发送文件内容写入发送数据缓存sendbuf[256]中,通过send(m_sockdata,sendbuf,len,0)将缓存中数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 无桩式 公共 自行车 租赁 系统 站点 研究 设计