如何让一张幻灯片中的内容一个一个出来(制作幻灯片时,怎样让答案一个一个出来)
687
2022-05-30
1. 前言
GPS电子围栏这个功能是地图的一个扩展技术功能,通过地图经纬度在地图上圈一个范围,在这个范围内进出可以在服务器上进行实时记录,提示警报。现在的共享单车、共享汽车都有这个功能,限制车辆只能在某一个范围内使用,超出后就自动断电或者作出提示。要实现这个地理围栏,就需要实时获取当前的经纬度,然后调用地图SDK接口进行处理,完成围栏逻辑设计。
这种地理围栏应用的场景非常多,比如:
(1)上面说的共享单车,超出区域断电;
(2)小孩子的儿童手表、可以设置地理围栏,家长可以给孩子设置一个地图范围,如果孩子离开了这个范围,父母的就可以收到通知,方便知道孩子当前位置在哪里,防止走丢;
(3)4S店的车子也会设置电子围栏,当试驾、试乘离开规定的范围会通知4S店。
在完成GPS围栏功能之后,通过得到的GPS数据还可以做很多相关的事情,比如:导航路线规划,行走的路线记录、实时定位等。
这篇文章就采用linux开发板来实现这个GPS围栏功能,这个项目分为了两个部分:1. 服务器部分 2. 设备部分
设备端就是实时采集GPS模块得到的经纬度,通过网络上传给服务器,服务器调用百度地图、高德地图的API接口,根据规划的地理围栏范围进行判断,在地图上绘制当前设备所在的位置,还可以画出轨迹线。
2. 项目实现代码
当前文章讲的就是设备端的实现,如何读取GPS坐标、转换、上传到服务器的流程。
GPS模块是串口接口,Linux开发板有串口接口,如果串口接口不够用,也可以把模块接到CH340这种USB转TTL模块上,再插在开发板的USB口上,在/dev下会生成ttyUSBx节点。Linux下串口编程有一套标准的接口,编程非常方便。
读取串口数据可以采用 poll、select、epoll机制等。也可以使用异步通知机制:fasync。串口配置的时候可以配置每次读取的超时时间,方便知道什么时候一包数据接收完毕了。
GPS模块也支持配置,正常情况下GPS模块会将接收的卫星所有数据返回来,如果想要提高效率,可以设置GPS模块,让它只是返回想要的字段,这样接收数据解析数据效率就高很多。
2.1 GPS坐标数据读取
下面这份代码是接收GPS经纬度的串口代码。
#include 2.2 GPS数据格式与字段含义 $GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F $GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D $GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37 $BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A $GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B $GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C $GPGSV,3,3,10,31,50,287,36,32,66,018,*7F $BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62 $GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D $GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14 $GNZDA,114955.000,06,11,2017,00,00*47 $GPTXT,01,01,01,ANTENNA OK*35 序号 命令 说明 最大帧长 1 $GNGGA GPS/北斗定位信息 72 2 $GNGSA 当前卫星信息 65 3 $GPGSV 可见 GPS 卫星信息 210 4 $BDGSV 可见北斗卫星信息 210 5 $GNRMC 推荐定位信息 70 6 $GNVTG 地面速度信息 34 7 $GNGLL 大地坐标信息 -- 8 $GNZDA 当前时间(UTC1)信息 -- 1, $GNGGA (GPS 定位信息, Global Positioning System Fix Data) $GNGGA 语句的基本格式如下(其中 M 指单位 M, hh 指校验和, CR 和 LF 代表回车 换行,下同): $GNGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF) (1) UTC 时间,格式为 hhmmss.ss; (2) 纬度,格式为 ddmm.mmmmm(度分格式); (3) 纬度半球, N 或 S(北纬或南纬); (4) 经度,格式为 dddmm.mmmmm(度分格式); (5) 经度半球, E 或 W(东经或西经); (6) GPS 状态, 0=未定位, 1=非差分定位, 2=差分定位; (7) 正在使用的用于定位的卫星数量(00~12) (8) HDOP 水平精确度因子(0.5~99.9) (9) 海拔高度(-9999.9 到 9999.9 米) (10) 大地水准面高度(-9999.9 到 9999.9 米) (11) 差分时间(从最近一次接收到差分信号开始的秒数,非差分定位,此项为空) (12) 差分参考基站标号(0000 到 1023, 首位 0 也将传送,非差分定位,此项为空) 举例如下: $GNGGA,095528.000,2318.1133,N,11319.7210,E,1,06,3.7,55.1,M,-5.4,M,,0000*69 2, $GNGSA(当前卫星信息) $GNGSA 语句的基本格式如下: $GNGSA,(1),(2),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(4),(5),(6)*hh(CR)(LF) (1) 模式, M = 手动, A = 自动。 (2) 定位类型, 1=未定位, 2=2D 定位, 3=3D 定位。 (3) 正在用于定位的卫星号(01~32) (4) PDOP 综合位置精度因子(0.5-99.9)ALIENTEK (5) HDOP 水平精度因子 1(0.5-99.9) (6) VDOP 垂直精度因子(0.5-99.9) 举例如下: $GNGSA,A,3,14,22,24,12,,,,,,,,,4.2,3.7,2.1*2D $GNGSA,A,3,209,214,,,,,,,,,,,4.2,3.7,2.1*21 注 1: 精度因子值越小,则准确度越高。 3, $GPGSV(可见卫星数, GPS Satellites in View) $GPGSV 语句的基本格式如下: $GPGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF) (1) GSV 语句总数。 (2) 本句 GSV 的编号。 (3) 可见卫星的总数(00~12,前面的 0 也将被传输)。 (4) 卫星编号(01~32,前面的 0 也将被传输)。 (5) 卫星仰角(00~90 度,前面的 0 也将被传输)。 (6) 卫星方位角(000~359 度,前面的 0 也将被传输) (7) 信噪比(00~99dB,没有跟踪到卫星时为空)。 注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$GPGSV 语句中输出。 举例如下: $GPGSV,3,1,11,18,73,129,19,10,71,335,40,22,63,323,41,25,49,127,06*78 $GPGSV,3,2,11,14,41,325,46,12,36,072,34,31,32,238,22,21,23,194,08*76 $GPGSV,3,3,11,24,21,039,40,20,08,139,07,15,08,086,03*45 4, $BDGSV(可见卫星数, GPS Satellites in View) $BDGSV 语句的基本格式如下: $BDGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF) (1) GSV 语句总数。 (2) 本句 GSV 的编号。 (3) 可见卫星的总数(00~12,前面的 0 也将被传输)。 (4) 卫星编号(01~32,前面的 0 也将被传输)。 (5) 卫星仰角(00~90 度,前面的 0 也将被传输)。 (6) 卫星方位角(000~359 度,前面的 0 也将被传输) (7) 信噪比(00~99dB,没有跟踪到卫星时为空)。 注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$BDGSV 语句中输出。 举例如下: $BDGSV,1,1,02,209,64,354,40,214,05,318,40*69 5, $GNRMC(推荐定位信息, Recommended Minimum Specific GPS/Transit Data) $GNRMC 语句的基本格式如下: $GNRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF) (1) UTC 时间, hhmmss(时分秒) (2) 定位状态, A=有效定位, V=无效定位 (3) 纬度 ddmm.mmmmm(度分) (4) 纬度半球 N(北半球)或 S(南半球)ALIENTEK (5) 经度 dddmm.mmmmm(度分) (6) 经度半球 E(东经)或 W(西经) (7) 地面速率(000.0~999.9 节) (8) 地面航向(000.0~359.9 度,以真北方为参考基准) (9) UTC 日期, ddmmyy(日月年) (10) 磁偏角(000.0~180.0 度,前导位数不足则补 0) (11) 磁偏角方向, E(东)或 W(西) (12) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效) 举例如下: $GNRMC,095554.000,A,2318.1327,N,11319.7252,E,000.0,005.7,081215,,,A*73 6, $GNVTG(地面速度信息, Track Made Good and Ground Speed) $GNVTG 语句的基本格式如下: $GNVTG,(1),T,(2),M,(3),N,(4),K,(5)*hh(CR)(LF) (1) 以真北为参考基准的地面航向(000~359 度,前面的 0 也将被传输) (2) 以磁北为参考基准的地面航向(000~359 度,前面的 0 也将被传输) (3) 地面速率(000.0~999.9 节,前面的 0 也将被传输) (4) 地面速率(0000.0~1851.8 公里/小时,前面的 0 也将被传输) (5) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效) 举例如下: $GNVTG,005.7,T,,M,000.0,N,000.0,K,A*11 7, $GNGLL(定位地理信息, Geographic Position) $GNGLL 语句的基本格式如下: $GNGLL,(1),(2),(3),(4),(5),(6),(7)*hh(CR)(LF) (1) 纬度 ddmm.mmmmm(度分) (2) 纬度半球 N(北半球)或 S(南半球) (3) 经度 dddmm.mmmmm(度分) (4) 经度半球 E(东经)或 W(西经) (5) UTC 时间: hhmmss(时分秒) (6) 定位状态, A=有效定位, V=无效定位 (7) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效) 举例如下: $GNGLL,2318.1330,N,11319.7250,E,095556.000,A,A*4F 7, $GNZDA(当前时间信息) $GNZDA 语句的基本格式如下: $GNZDA,(1),(2),(3),(4), (5), (6)*hh(CR)(LF) (1) UTC 时间: hhmmss(时分秒) (2) 日 (3) 月 (4) 年 (5) 本地区域小时(NEO-6M 未用到,为 00) (6) 本地区域分钟(NEO-6M 未用到,为 00) 举例如下: $GNZDA,095555.000,08,12,2015,00,00*4C 2.3 GPS数据解析 /* 函数功能:从buf里面得到第cnt个逗号所在的位置 返 回 值:0~254,代表逗号所在位置的偏移. 255,代表不存在第cnt个逗号 */ u8 GPS_GetCommaOffset(u8 *buf,u8 cnt) { u8 *p=buf; while(cnt) { if(*buf=='*'||*buf<' '||*buf>'z')return 255;//遇到'*'或者非法字符,则不存在第cx个逗号 if(*buf==',')cnt--; buf++; } return buf-p; //计算偏移量 } /* 函数功能:m^n函数 返 回 值:m^n次方. */ u32 GPS_GetPow(u8 m,u8 n) { u32 tmp=1; while(n--)tmp*=m; return tmp; } /* 函数功能:str转换为数字,以','或者'*'结束 函数参数:buf:数字存储区 dx:小数点位数,返回给调用函数 返 回 值:转换后的整数数值 */ int GPS_StrtoNum(u8 *buf,u8*dx) { u8 *p=buf; u32 ires=0,fres=0; u8 ilen=0,flen=0,i; u8 mask=0; int res; while(1) //得到整数和小数的长度 { if(*p=='-'){ mask|=0X02; p++; }//是负数 if(*p==','||(*p=='*'))break;//遇到结束了 if(*p=='.'){ mask|=0X01; p++; }//遇到小数点了 else if(*p>'9'||(*p<'0')) //有非法字符 { ilen=0; flen=0; break; } if(mask&0X01)flen++; else ilen++; p++; } if(mask&0X02)buf++; //去掉负号 for(i=0; i 2.4 GPS数据打印 /* 函数功能:显示GPS定位信息 */ void GPS_MsgShow(void) { float tp; tp=GPS_DecodingInfo.longitude; sprintf((char *)dtbuf,"经度:%.5f %1c",tp/=100000,GPS_DecodingInfo.ewhemi); //得到经度字符串 printf("%s\r\n",dtbuf); tp=GPS_DecodingInfo.latitude; sprintf((char *)dtbuf,"纬度:%.5f %1c",tp/=100000,GPS_DecodingInfo.nshemi); //得到纬度字符串 printf("%s\r\n",dtbuf); tp=GPS_DecodingInfo.altitude; sprintf((char *)dtbuf,"高度:%.1fm",tp/=10); //得到高度字符串 printf("%s\r\n",dtbuf); tp=GPS_DecodingInfo.speed; sprintf((char *)dtbuf,"速度:%.3fkm/h",tp/=1000); //得到速度字符串 printf("%s\r\n",dtbuf); if(GPS_DecodingInfo.fixmode<=3) //定位状态 { sprintf((char *)dtbuf,"定位模式:%s",fixmode_tbl[GPS_DecodingInfo.fixmode]); printf("%s\r\n",dtbuf); } sprintf((char *)dtbuf,"GPS+BD 定位的GPS卫星数:%02d",GPS_DecodingInfo.posslnum); //用于定位的GPS卫星数 printf("%s\r\n",dtbuf); sprintf((char *)dtbuf,"GPS 可见GPS卫星数:%02d",GPS_DecodingInfo.svnum%100); //可见GPS卫星数 printf("%s\r\n",dtbuf); sprintf((char *)dtbuf,"BD 可见北斗卫星数:%02d",GPS_DecodingInfo.beidou_svnum%100); //可见北斗卫星数 printf("%s\r\n",dtbuf); sprintf((char *)dtbuf,"UTC日期:%04d/%02d/%02d ",GPS_DecodingInfo.utc.year,GPS_DecodingInfo.utc.month,GPS_DecodingInfo.utc.date); //显示UTC日期 printf("%s\r\n",dtbuf); sprintf((char *)dtbuf,"显示UTC时间:%02d:%02d:%02d ",GPS_DecodingInfo.utc.hour,GPS_DecodingInfo.utc.min,GPS_DecodingInfo.utc.sec); //显示UTC时间 printf("%s\r\n",dtbuf); } Linux 单片机
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。