# GPS-CS **Repository Path**: lvcp/gps-cs ## Basic Information - **Project Name**: GPS-CS - **Description**: 本项目包含两个程序:Client端和Server端,Client端模拟GPS信号接收机,通过串行口接收真实的GPS信号(需要GPS信号接收器),或者通过程序模拟每隔一秒钟发出一帧NMEA-0183格式的标准GPS信号,对GPS信号进行一定的处理后发送给Server端。Server端通过IPC(进程间通信)获得Client发出的信号,进行解析,并把解析出的地理位置信息进行存储和处理后输出。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: https://gitee.com/lvcp/gps-cs - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 1 - **Created**: 2020-09-21 - **Last Updated**: 2024-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GPS-CS #### 运行说明: 拉去到本地,打开工程。 先运行Server#main() 在运行Client#main() #### 介绍 本项目包含两个程序:Client端和Server端,Client端模拟GPS信号接收机,通过串行口接收真实的GPS信号(需要GPS信号接收器),或者通过程序模拟每隔一秒钟发出一帧NMEA-0183格式的标准GPS信号,对GPS信号进行一定的处理后发送给Server端。Server端通过IPC(进程间通信)获得Client发出的信号,进行解析,并把解析出的地理位置信息进行存储和处理后输出。 #### 软件架构 **1. 项目描述** 本项目包含两个程序:Client端和Server端,Client端模拟GPS信号接收机,通过串行口接收真实的GPS信号(需要GPS信号接收器),或者通过程序模拟每隔一秒钟发出一帧NMEA-0183格式的标准GPS信号,对GPS信号进行一定的处理后发送给Server端。Server端通过IPC(进程间通信)获得Client发出的信号,进行解析,并把解析出的地理位置信息进行存储和处理后输出。 1). GPS固定输出数据语句 格式:$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh 举例:$GPGGA,115542.000,3155.3446,N,11852.4283,E,1,03,4.4,32.6,M,5.4,M,,0000*5A - 纬度ddmm.mmmm(度分)格式(前面的0 也将被传输) - 纬度半球N(北半球)或S(南半球) - 经度dddmm.mmmm(度分)格式(前面的0 也将被传输) - 经度半球E(东经)或W(西经) - GPS 状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算 - 正在使用解算位置的卫星数量(00-12)(前面的0 也将被传输) - HDOP水平精度因子(0.5-99.9) - 海拔高度(-9999.9-99999.9) - 地球椭球面相对大地水准面的高度 - 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空) - 差分站ID 号0000-1023(前面的0 也将被传输,如果不是差分定位将为空) 2). 主要技术点: - C语言基础、指针、字符串操作、格式化输入输出、文件操作、结构体,链表、图的操作等 3). 技术难点: - 字符串操作、指针、文件操作、结构体、链表、多线程、进程间通信 **2. 任务概述和要求** - 程序设计框架正确 - 容错处理要考虑 - 数据处理正确、高效 - 界面设计简洁、友好、美观大方; - 操作简单、快捷方便; - 数据存储安全、可靠; - 信息分类清晰、准确; **3. 系统的设计说明** 1).Client端(发送模块) 基本要求:Client模拟产生GPS信号,每隔一秒发出如下模拟GPS信号的字符串:$GPGGA,115542.000,3155.3446,N,11852.4283,E,1,03,4.4,32.6,M,5.4,M,,0000*5A。要求发出的模拟GPS信号 - 时间每隔1秒要自动改变,同时考虑秒到分钟、分钟到小时的进位要正确。 - 经纬度在设定范围内可以随机波动,考虑如何实现这个随机的波动来模拟真实的情况。 - Client每秒钟输出2帧GPS信号。每隔1秒钟,把产生的GPS信号构造一个标准的字符串存入硬盘中的文件,设计好文件的存储格式。 - 通过SOCKET把GPS信息发送给Server端。 提高要求:通过串行口接一个GPS模块,接收真实的GPS信号。 - 多线程的编程,Client设计成由两个线程组成:线程1负责不断产生、输出GPS信号,线程2负责输出一个字符的人机交互界面,通过这个界面可以改变输出的信号的各个域,对于域的修改要考虑到用户的输入是否合理,即进行容错处理。 - ★串行口的读取操作,掌握串行口的初始化以及读写操作的方法,通过串行口获取真正的GPS信号。 - ★发送给Server的数据除了原始的GPS信号意外,再应用哈夫曼编码对GPS信号进行压缩,压缩后的数据和原始数据一并发送。 - ★移植安装Sqlite3数据库,把本机产生(接收)的GPS数据存储在Sqlite3数据库中。 - ★Client还要能接收Server并正确处理Server下发的命令。 2)Server端(接收模块) 基本要求:Server从SOCKET或内存映射文件中获得GPS信号, - 利用sscanf函数进行解析,解析得到的时间、经度、纬度、速度四个信息,作为一个整体加上编号,存储在单链表中。 - 把接收到的原始数据以及解析出的相关信息存储在文件中。 提高要求: - Server由两个线程构成,线程1负责接收GPS信号、解析并把信息存储在单链表中,线程2负责提供一个查询界面,用户可以输入查询信息,线程2对单链表或文件进行查询并输出。 - ★★Server可以通过SOCKET接收多个Client的输出并存储。 - ★把所有Client的位置抽象成一个图,能求从一个顶点到任意一个顶点的最短路径。 - ★★★当Client的坐标偏移一条给定路线超出一定范围时,Server记录这个异常事件,并在本机发出报警信息(文字闪烁,扬声器蜂鸣),或者通过ADB Shell拨打指定的电话(对于Android手机,要求计算机上安装相应手机的驱动程序并把手机通过USB连接在计算机上)。