基于云服务器与Arduino 的GPS定位系统设计*
2018-05-16,,,
,,,
(沈阳工业大学 软件学院,沈阳 110023)
引 言
物联网是新一代信息技术的重要组成部分,也是信息化时代的重要发展阶段。由美国国防部领导下的卫星导航联合计划局(JPO)主导研究的全球定位系统(Global Positioning System,GPS)[1]是目前应用最广泛和成功的定位技术。GPS在许多嵌入式系统中被用于定位服务,如基于蓝牙4.0模块的电子防丢器[2]和基于Android操作系统、WiFi以及GPS等技术为核心的GPS导航应用系统[3]等。由于GPS只能提供定位的数字信息,而不能直接传送到服务器,所以需要使用单片机将GPS的数据发送到服务器。
其中Arduino单片机是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。它是一个基于开放原始码的软硬件平台,构建于开放原始码simple I/O介面版[4],并且具有使用类似Java、C语言的Processing/Wiring开发环境。
本文设计了一种基于Arduino的GPS定位系统,将Arduino与GPS相结合,能够实现对GPS信息的定位并且上传到服务器中,服务器的信息同时可以传送给用户智能终端。
1 总体方案设计
本文设计的GPS定位系统主要包括三个部分:信息采集与处理模块、服务器传送模块、用户智能终端模块,系统如图1所示。用户智能终端主要是支持GSM的智能手机。
图1 系统组成结构图
信息采集与处理模块主要完成GPS信号的接收、数据解析和发送功能。GPS接收单元GPS信号信息,控制单元对此信息进行处理,提取经纬度,通过GSM网络传送单元把经纬度信息位置上传到云服务器中。云服务器把位置信息传送到用户智能终端中,同时,信息采集模块也可以通过短信方式把信息传送到用户智能终端中。
同时,开发Android手机应用程序对从云服务获取来得数据通过高德地图进行显示。
2 系统硬件设计
系统硬件主要由单片机、GPS模块、GPRS模块和GSM模块等构成。由于GPS模块只能提供定位的数字信息,而不能直接传送到服务器,所以需要使用单片机对GPS模块的数据进行接收,通过GSM网络将数据发送到服务器。该系统硬件由控制单元嵌入式系统、GPS信息接收处理单元、GSM位置信息传输单元和电源组成。硬件设计中只对控制单元、GPS信息接收处理单元、GSM位置信息传输单元进行设计。 如图2所示。
图2 硬件平台组成图
① 控制单元模块:嵌入式系统作为控制单元,负责控制终端的整个运作,以单片机为核心,用于协调和控制模块各个功能单元,主要实现监控中心指令并相应获取坐标信息、发送坐标数据等功能。
② GPS信号处理单元:通过GPS模块实时获取使用者地理位置信息,并进行压缩处理以方便传输。
③ GSM位置信息传输单元:通过访问服务器地址,将坐标数据实时上传到中转服务器上。
2.1 Arduino 单片机
单片机采用的是Arduino的Mega2560单片机,其有54路数字输入/输出端口(其中15个可以作为PWM输出)、16路模拟输入端口、4路UART串口、16 MHz的晶振、USB连接口、电池接口、ICSP头和复位按钮。简单地用USB连接电脑或者用交直流变压器就能使用,适合需要大量I/O接口的设计。它的优点是简单易学,适合刚入门的单片机使用者,并且有多端I/O接口,适合本系统GPS/GPRS模块的接入。 Mega2560单片机结构如图3所示。
图3 Mega2560单片机结构示意图
2.2 GPS/GSM/GPRS模块
GPS/GSM/GPRS模块为集成的A7模块,定位采用GPS模块、GSM模块和GPRS模块都集成在此模块中,具体结构如图4所示。
图4 GPS/GSM/GPRS模块结构示意图
2.3 通信串口连接设计
单片机与GPS模块进行连接,实现GPS数据向单片机的传送。具体接线方式为,单片机的GND与GPS模块的GND(3)引脚相连,图3中的7(4路UART)中的TXD14、RXD15、RXD19引脚分别与图4中GPS模块的4、5、11引脚相连接。
3 系统软件设计
3.1 服务器的搭建
本系统采用的服务器搭载的操作系统是Windows操作系统,服务器为租用的腾讯云服务器,服务器程序是以C#语言为基础进行开发的,服务器的后台程序接收到Arduino单片机数据后,将其存入数据库。
在GPS获取用户的经纬度坐标之后,将数据封装好,上传至服务器,以方便客户端访问。
通信程序在接收到发送的指令后,先创建socket对象,再通过bind()函数将ipv6地址和端口号组合赋给socket对象,进行通信地址和指定端口的绑定,通过listen()、connect()函数对服务器进行监听和连接,用accept()函数接收服务请求。在服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址。客户端依次调用socket()、connect()后就向服务器发送了一个连接请求。服务器监听到这个请求之后,就会调用accept()函数接收请求,成功建立连接。
3.2 Arduino通信
本系统的通信方式是通过GSM模块来完成的,主要完成信息上传到服务器和发送短信的功能。它是传统调制解调器与GSM无线移动通信系统相结合的一种数据终端设备。它的出现给GSM的发展注入了新的活力,改变了传统的以话音为主的通信手段,打开了GSM网络数据通信及其应用的大门。调制解调器必须通过PSTN或其它专用通信网进行通信,因而受地域、线路等影响在应用上有很大的局限性。而GSM模块则无此限制,所以基于这种模块以GSM网络作为无线传输网络可以开发出前景极其乐观的各类应用。
3.2.1 短信的发送
GSM模块启动后,都处于命令状态,在该状态下,它以AT命令形式接收命令。GSM模块接收到AT命令后,对命令进行解释和执行,并返回相应的结果码。
首先设置AT+CMGS=0的PUD格式;然后把“> ***** ”语句的*号部分转换成了十六进制的 1A中文文本格式+手机号码,若返回OK字符串,即为发送成功。
memset(send_buf, 0, 20);//设置短信文本长度
strcpy(send_buf,"AT+CMGS="");
strcat(send_buf, number);//设置PUD格式
strcat(send_buf, "" ");
if(sendCommand(send_buf,">",3000, 10) == Success);
if (sendCommand(msg, msg, 3000, 10) == Success);
//短信内容
memset(send_buf, 0, 20);
send_buf[0] = 0x1a;//以16进制发送
send_buf[1] = ' ';
3.2.2 发送位置信息到服务器端
(1)获取GPS定位信息
while (GpsSerial.available()){
gpsRxBuffer[gpsRxCount] =GpsSerial.read();
if (gpsRxBuffer[gpsRxCount++] == ' '){
char*GPS_BufferHead;
char*GPS_BufferTail;
if((GPS_BufferHead =strstr(gpsRxBuffer, "$GPRMC,"))!=NULL||(GPS_BufferHead=strstr(gpsRxBuffer, "$GNRMC,")) != NULL ){
if(((GPS_BufferTail=strstr(GPS_BufferHead," ")) != NULL) && (GPS_BufferTail > GPS_BufferHead)){
memcpy(Save_Data.GPS_Buffer,GPS_BufferHead,GPS_BufferTail -GPS_BufferHead);
Save_Data.isGetData = true;
clrGpsRxBuffer();}}
clrGpsRxBuffer();}
if(gpsRxCount==gpsRxBufferLength)clrGpsRxBuffer();}
(2)解析GPS信息
if((subStringNext=strstr(subString,",")) != NULL) {
charusefullBuffer[2];
switch (i) {
case 1:memcpy(Save_Data.UTCTime,subString,subStringNext- subString); break; //获取UTC时间
case2:memcpy(usefullBuffer,subString,subStringNext - subString); break; //获取UTC时间
case3:memcpy(Save_Data.latitude,subString,subStringNext - subString); break; //获取纬度信息
case4:memcpy(Save_Data.N_S,subString,subStringNext - subString); break; //获取N/S
case5:memcpy(Save_Data.longitude,subString,subStringNext- subString); break; //获取纬度信息
case6:memcpy(Save_Data.E_W,subString,subStringNext - subString); break; //获取E/W
default: break; }
subString=subStringNext;Save_Data.isParseData=true;
if (usefullBuffer[0] == 'A')
Save_Data.isUsefull = true;
else if (usefullBuffer[0] == 'V')Save_Data.isUsefull = false; }
(3)发送数据
移动端通过GSM模块中的SIM卡发送到云端服务器。
if(sendCommand(send_buf,"CONNECT", 10000, 5) == Success);
if(sendCommand("AT+CIPSEND ", ">", 3000, 5) == Success);
if(sendCommand(send_buf,send_buf, 3000, 1) == Success);
memset(send_buf, 0, 100); //清空
send_buf[0] = 0x1a;
if(sendCommand(send_buf,send_buf, 5000, 5) == Success);
if(sendCommand("AT+CIPCLOSE ", "OK ", 5000, 10) == Success);
在移动端接收完毕所有的信息之后,会通过GPRS网络链接到云服务器对外的预留通信端口(测试IP:139.199.39.122,测试预留端口:5000)。通过此端口,移动端会将接收到的数据上传至服务器进行数据的基础处理和转发操作。
4 系统测试结果
在测试实验,硬件连接如图5所示。
图5 硬件实物图
图5中,插入具有上网功能的SIM卡,为了避免室内信号不强的影响,附加了一条长10 m的外接天线。
信号采集与处理模块发送信息到服务器的运行情况如图6所示。
图6 信息发送示意图
使用Android Studio开发程序,用于接收服务器发送来的GPS信息,手机应用程序中调用高德地图API,把位置信息显示在高德地图中,定位结果如图7所示。
图7 客户端真机运行结果示意图
通过本系统设计出基于Android平台的GPS定位报警系统[6]。在移动端,系统使用GPS模块进行定位,将GPS模块采集到的地理位置信息通过GSM网络上传到云服务器,并开发Android客户端的程序对云服务器转发的用户位置信息进行接收,并将接收到的数据在地图上进行匹配,如图7所示。同时,当移动端用户发出报警信息时,客户端用户可以接收短信并展开定位追踪。本项目设计的个人定位报警系统既具有定位功能,又能实现应急情况实时报警功能,可以有效地保证人身财产安全。
结 语
参考文献
[1] 吴晓平.异军突起的多方位、高精度空间大地测量技术——美国全球定位系统(GPS)研究进展[J].地壳形变与地震,1990(1):42-45.
[2] 霍丙乾,罗涛,李剑峰.基于蓝牙4.0的防丢系统的研究与设计[J].软件,2014,35(9):94-97.
[3] 赵萌,崔刚.基于WiFi的Android移动设备导航系统的设计开发[J].智能计算机与应用,2013,3(3):60-63,68.
[4] 袁本华,董铮.基于Arduino控制板的温室大棚测温系统设计[J].安徽农业科学,2012,40(8):5049-5050.
[5] 翁浩峰.在Flash课件中使用传感器[J].物理通报,2010(6):35-37.
[6] 高偲程,马广焜,李想,等. 基于Android平台的个人GPS定位报警系统的设计与开发[J].智能计算机与技术,2018,8(1):141-144.