没有合适的资源?快使用搜索试试~ 我知道了~
当前项目讲的就是设备端的实现,如何读取GPS坐标、转换、上传到服务器的流程。 GPS模块是串口接口,Linux开发板有串口接口,如果串口接口不够用,也可以把模块接到CH340这种USB转TTL模块上,再插在开发板的USB口上,在/dev下会生成ttyUSBx节点。Linux下串口编程有一套标准的接口,编程非常方便。 读取串口数据可以采用 poll、select、epoll机制等。也可以使用异步通知机制:fasync。串口配置的时候可以配置每次读取的超时时间,方便知道什么时候一包数据接收完毕了。 GPS模块也支持配置,正常情况下GPS模块会将接收的卫星所有数据返回来,如果想要提高效率,可以设置GPS模块,让它只是返回想要的字段,这样接收数据解析数据效率就高很多。
资源推荐
资源详情
资源评论
(1)我的CSDN博客主页: https://blog.csdn.net/xiaolong1126626497
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 <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
1
2
3
4
5
6
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
#include <stdio.h>
/*
标准串口属性:
波特率 : 115200
停止位 : 1个
奇偶校验位: 没有校验位
数据位 : 8位
*/
int uart_fd;//存放串口的文件描述符
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("参数格式: ./app /dev/ttySACx 或者 /dev/ttyUSBx\n");
exit(-1);
}
/*1. 打开串口*/
uart_fd=open(argv[1],O_RDWR|O_NOCTTY);
if(uart_fd<0)
{
printf("%s 串口设备打开失败!\n",argv[1]);
exit(-1);
}
/*2. 清空终端未完成的输入/输出请求及数据、刷新缓存*/
tcflush(uart_fd,TCIFLUSH);
/*3. 填充保存串口属性结构体*/
struct termios newtio;
memset(&newtio,0,sizeof(newtio)); //初始化结构体空间为0
cfsetispeed(&newtio, B115200); //配置串口的输入波特率为115200
cfsetospeed(&newtio, B115200); //配置串口的输出波特率为115200
newtio.c_cflag |= CREAD; //启用串口的接收功能
newtio.c_cflag &= ~CSIZE; //清除串口的数据位
newtio.c_cflag |= CS8; //配置串口的数据位为8位
newtio.c_cflag &= ~PARENB; //配置串口的校验位:无校验
newtio.c_cflag &= ~CSTOPB; //配置的停止位:1个
//newtio.c_lflag &= ~(ICANON); //不使用规范模式(非标准模式)
newtio.c_cc[VTIME]=100;
newtio.c_cc[VMIN]=10;
//newtio.c_iflag &= ~ IGNCR; //不忽略回车字符
//newtio.c_iflag &= ICRNL;//不转换
/*4. 配置串口的属性*/
tcsetattr(uart_fd,TCSANOW,&newtio);
int i,cnt=0;
char usart_rx_buff[1024];
while(1)
{
cnt=read(uart_fd,(void*)usart_rx_buff,1024); //从串口RX端口读取数据
if(cnt>0)
{
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
剩余12页未读,继续阅读
资源评论
DS小龙哥
- 粉丝: 4w+
- 资源: 523
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功