一、安装启动守护进程

准确来说 libgps(man libgps)是一个与 GPS 守护进程进行通信的 C 库。包含打开、收发、解析数据包等接口,我们只需要使用libgps提供的接口就可拿到GPS数据。但是这个库的接口的使用,依赖 GPS 守护进程的运行。而这个守护进程才是真正基于上述协议与 GPS 接收器进行通信的。
1、选配上gpsd编译进文件系统(make menuconfig)

2、在开发板启动这个守护进程

/usr/sbin/gpsd -N -n -S 2947 /dev/ttyUSB0

3、如果说你要获取gps数据,目前我的gps模块被开发板识别为/dev/ttyUSB0,你可以直接通过cat 查看得到的gps数据,前提是需要关掉gpsd服务,同时gps天线能够在室外:

4、GPS数据分析(图片来自供应商提供的手册)

$GNGGA,052656.000,3107.52352,N,12121.56231,E,1,15,0.8,106.2,M,10.4,M,,0000*48
全球定位信息,接收机的时间、位置和定位相关数据。
$GNGLL,3107.52352,N,12121.56231,E,052656.000,A,A*41
地理定位信息,位置、时间和固定状态。
$GNGSA,A,3,10,18,23,24,25,31,32,193,,,,,1.4,0.8,1.2*12
当前卫星信息,用于表示用于定位的卫星的ID。当使用GPS卫星定位时,输出$GNGSA语句,系统ID为1。使用GLONASS卫星定位时,输出SGNGSA语句,系统ID为2。使用北斗卫星进行定位时,输出SGNGSA语句,系统ID为4。
$BDGSV,5,3,17,201,46,141,,214,42,322,34,224,40,204,29,204,34,123,*64
卫星仰角、方位角和CNR信息,SGPGSV用于GPS卫星,SGLGSV用于GLONASS卫星,SGAGSV用于GALILEO卫星,$GBGSV用于北斗卫星
$GNRMC,052656.000,A,3107.52352,N,12121.56231,E,000.0,065.6,081121,,,A*78
推荐定位信息,时间,日期,位置,航向,和速度
$GNVTG,065.6,T,,M,000.0,N,000.0,K,A*16
地面速度信息,相对于地面的航向和速度
$GNZDA,052656.000,08,11,2021,00,00*43
UTC时间,年月日和时区

二、启动客户端

代码如下:因为本人需要将gps数据转换为JSON格式数据上传给前端工程师,从而在web端显示设备位置,所以得到数据后进行了处理

#include <stdio.h>
#include "mgps.h"
#include "gps.h"
#include <fcntl.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <syslog.h>
#include <termios.h>
#include <time.h>
#include <unistd.h>#define MESH_GPSD_LOCALTION_JSON "/www/meshgps.json"
#define LOCATION_SERVICE_EXIT "/bin/rm -rf /var/run/meshgps.pid"
#define GPSD_DATE_LOCALTION_JSON "/www/meshgps.json"
#define GPSD_SERVICE_RESTART "/etc/init.d/gpsd restart"FILE *fp;
char coor_buf[128] = {0};
char type_buf[32] = {0};
pthread_mutex_t gps_mutex = PTHREAD_MUTEX_INITIALIZER;int mesh_query_console_baudrate(const char *device)
{int fd = 0;speed_t baudrate = B115200;struct termios tio;if ((fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0){printf("%s open serial console failed\n", __func__);return -1;}if (tcgetattr(fd, &tio) != 0){printf("%s get console attr error\n", __func__);close(fd);return -1;}syslog(LOG_INFO, "console input buadrate  %d output buadrate  %d\n",cfgetispeed(&tio), cfgetospeed(&tio));if (cfgetispeed(&tio) == cfgetospeed(&tio) && baudrate == cfgetispeed(&tio)){printf("%s correct console baudrates\n", __func__);close(fd);}else{printf("%s console buadrate input %d output %d  src %d is unavailable\n",__func__, cfgetispeed(&tio), cfgetospeed(&tio), baudrate);cfsetispeed(&tio, baudrate);cfsetospeed(&tio, baudrate);int ret = tcsetattr(fd, TCSANOW, &tio);printf("%s after set console buadrate input %d output %d ret %d\n",__func__, cfgetispeed(&tio), cfgetospeed(&tio), ret);close(fd);}system(GPSD_SERVICE_RESTART);return 0;
}
void *parse_location(struct gps_data_t *gps_data)
{int i = 0;while(1){pthread_mutex_lock(&gps_mutex);memset(coor_buf, 0, sizeof(coor_buf));memset(type_buf, 0, sizeof(type_buf));/*if over 6 minutes no gps data,then exit and report*/if (i > 120){printf( "receive GPS data timeout\n");goto ERR_RET;}/* non block wait for 2 seconds to receive data */if (gps_waiting(gps_data, 2 * 1000 * 1000)){/* read data */if ((gps_read(gps_data, NULL, 0)) == -1){printf("error occured reading gps data\n");goto ERR_RET;}/* Display data from the GPS receiver. */if ((gps_data->status == STATUS_NO_FIX)){printf("gps status %d mode %d latitude %f longitude %f\n", gps_data->status, gps_data->fix.mode, gps_data->fix.latitude, gps_data->fix.longitude);}if ((gps_data->status != STATUS_NO_FIX) && (gps_data->fix.mode == MODE_2D ||gps_data->fix.mode == MODE_3D) &&!isnan(gps_data->fix.latitude) && !isnan(gps_data->fix.longitude)){printf("latitude: %f, longitude: %f, timestamp:%ld\n",gps_data->fix.latitude, gps_data->fix.longitude, gps_data->fix.time.tv_sec);strcat(coor_buf, "{\"time\":\"");                                                                                                                                                           sprintf(type_buf, "%ld", gps_data->fix.time.tv_sec);strcat(coor_buf, type_buf);strcat(coor_buf, "\",\"latitude\":\"");sprintf(type_buf, "%lf", gps_data->fix.latitude);strcat(coor_buf, type_buf);strcat(coor_buf, "\"}");if (strlen(coor_buf) != 0){printf("coor_buf = %s\n",coor_buf);fp = fopen(GPSD_DATE_LOCALTION_JSON, "w+");fputs(coor_buf, fp);fclose(fp);}goto ERR_RET;}else{i++;}pthread_mutex_unlock(&gps_mutex);sleep(3);}}
ERR_RET:pthread_mutex_unlock(&gps_mutex);gps_stream(gps_data, WATCH_DISABLE, NULL);gps_close(gps_data);system(LOCATION_SERVICE_EXIT);return NULL;
}
int main()
{struct gps_data_t gps_data;pthread_t thread;if (mesh_query_console_baudrate("/dev/ttyUSB0")){printf("gpsd error\n");goto ERR_EXIT;}if ((gps_open("localhost", "2947", &gps_data)) == -1){printf("gps open device fail\n");goto ERR_EXIT;}if (-1 == gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL)){printf("%s gps stream error\n", __func__);gps_close(&gps_data);goto ERR_EXIT;}pthread_create(&thread, NULL, (void *)parse_location,(struct gps_data_t *)&gps_data);pthread_join(thread, NULL);return 0;ERR_EXIT:system(LOCATION_SERVICE_EXIT);return -1;

三、交叉编译运行程序

因为我目前只需要时间和经纬度这三个数据,就读取了这三类数据:

使用 libgps 库获取gps数据相关推荐

  1. Matlab Mobile手机版获取gps数据和加速度信号融合

    Matlab Mobile手机版获取gps数据和加速度信号融合 前言 安装matlab mobile Matlab Drive Connector 安装 Matlab Mobile 记录数据 Matl ...

  2. 如何关闭大疆gps_如何使用djisdkforwindows从mavic 2获取gps数据?

    我使用windows sdk. 我正在尝试使用以下方法获取gps数据: var flightControllerHandler = _djiManagerInstance.ComponentManag ...

  3. 树莓派连接GPS模块,python获取GPS数据

    文章主要内容: 模块之间的连接 树莓派识别gps模块 使用Python语言获取GPS数据 1.连线 ---- 使用 USB转TTL转换器,将树莓派和GPS模块连接 需要的设备:gps模块,gps天线, ...

  4. Python用tushare库获取股票数据批量存入mysql成功

    之前用了很多方法无法批量存入mysql中,现在这个方法可以了 首先你需要安装tushare,现在最新版本是1.2.15 2018/10/15 如果之前没有安装,请用"开始-所有程序-附件-命 ...

  5. wpf获取gps数据在地图上显示定位

    1.gps数据换算成正常经纬度值, 换算公式:GPS获取数据为 3958.472727,N,11619.957711,E 换算结果为N:39+58.472727/60 E:116+19.957711/ ...

  6. python获取gps数据_python获取android设备的GPS信息脚本分享

    在android上,我们可以使用QPython来编写.执行Python脚本.它对很多android 系统函数进行了方便的封装,使用QPython编写功能简单的小程序异常方便. 这个示例是我之前用来读取 ...

  7. 利用python的tushare库获取在线数据,绘制股票k线图

    可视化是python的一个强大功能,也是金融数据分析中重要的工具.本文给出的python代码可以用于绘制贵州茅台(600519)在2019年1月1日到2019年12月31日的周k线图. 注意:本文使用 ...

  8. python获取gps数据_Python GPS模块:读取最新的GPS数据

    加我两分钱. 无论出于何种原因,我的覆盆子pi将继续执行一个线程,我必须硬重置pi. 所以我结合了sysnthesizerpatel和我在Dan Mandel的博客here上找到的答案. 我的gps_ ...

  9. 在WindowsMobile5.0系统上进行获取GPS信号(3)

    上两章中我们介绍了两个类,这个两个类已经把串口的设置和数据的解析功能封装了起来了,下面我们该如何用它呢...好,这章我们来看一下如何去用它. using System; using System.Co ...

  10. STM32+移远MC20模块采用MQTT协议登录OneNet上传GPS数据

    一.环境介绍 MCU:  STM32F103C8T6 GSM模块: 移远MC20 (MT2503D)(GSM+GPS共存)功能很强大 开发软件: Keil5 MQTT协议采用OneNet的旧版协议,登 ...

最新文章

  1. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)
  2. 深度学习中图片数据增强方法
  3. Html5 History API解析
  4. 高并发之CAS机制和ABA问题
  5. Could not import extension sphinxcontrib.blockdiag (exception: No module named sphinxcontrib.blockdi
  6. VTK:可视化之Visualize2DPoints
  7. init.d目录理解
  8. react 生成图片二维码_21个React开发神器
  9. system.data oracleClient 需要Oracle客户端8.1.7或high
  10. 网易整合邮箱和博客 可通过邮件更新博客日志
  11. anylogic中编写java代码_anylogic 使用
  12. synergy一套键鼠控制两台电脑
  13. python二级题库(百分之九十原题) 刷题软件推荐 第二套
  14. lua——牛牛牌型处理相关算法(中)——牌型判定
  15. Oracle中的数据类型---NUMBER
  16. The credentials mode of request initiated by the XMLHttpRequest is controlled by the withCredentials
  17. 【转】[DirectShow] 033 - Using Windowed Mode
  18. 只会PC端测试怎么行?智能手机ETT测试学习一下
  19. 「面向对象程序设计-C++」学习笔记(下半部分)
  20. android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片

热门文章

  1. 高通平台android9.0充电电量,充电指示灯以及充电图标读取分析
  2. 「技术人生」第7篇:从业务视角谈信息技术与业务的关系
  3. 给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1,N=3时,S=1+11+111=123。
  4. 什么是子域名?如何设置子域名解析?
  5. 结巴分词 java_Java版结巴分词自定义词库
  6. 手机怎样设置垃圾短信拦截?
  7. 史上最强的烧脑合集!能全都搞懂的只有天才!
  8. 不要害怕超级人工智能
  9. 编程,初来乍到,多多关照。
  10. pyTest官方手册(Release 4.2)之蹩脚翻译(6)