我如何实现一个 gpsd 客户端(在 C 中)来获取纬度、经度和海拔高度?
How can I implement a gpsd client (in C) to get Latitude, Longitude and Altitude?
我正在为启用了 GPS 的 Raspberry Pi 编写数字处理数据记录 C 程序。我抓住了 gpsd, and its sample app cgps displays gps information correctly. I wanted to use libgps 来与守护程序交互,以便我可以在我的应用程序中获得所有方便的信息,但我很快就被其 API.
的复杂性所淹没
其 HOWTO page points me to look at cgps and gpxlogger for example code, but there's so much coupling that I can't wade through it all. On the opposite end of the spectrum, the C code example on the libgps 页面上的文档非常简陋,无法使用。
任何人都可以指出一个 class 示例来揭开这个谜团吗?也许包含 getCoordinates()
函数的东西?
我说得太快了。在浏览了其他 SO 问题后,我 运行 变成了 this 完全不相关的问题。这是我稍微修改过的版本:
#include <gps.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <errno.h>
int main() {
struct timeval tv;
struct gps_data_t gps_data;
if ((gps_open("localhost", "2947", &gps_data)) == -1) {
printf("code: %d, reason: %s\n", errno, gps_errstr(errno));
return EXIT_FAILURE;
}
gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);
while (1) {
/* wait for 2 seconds to receive data */
if (gps_waiting (&gps_data, 2000000)) {
/* read data */
if ((gps_read(&gps_data,NULL,0)) == -1) {
printf("error occured reading gps data. code: %d, reason: %s\n", errno, gps_errstr(errno));
} else {
/* Display data from the GPS receiver. */
if ((gps_data.status == STATUS_FIX) &&
(gps_data.fix.mode == MODE_2D || gps_data.fix.mode == MODE_3D) &&
!isnan(gps_data.fix.latitude) &&
!isnan(gps_data.fix.longitude)) {
//gettimeofday(&tv, NULL); EDIT: tv.tv_sec isn't actually the timestamp!
printf("latitude: %f, longitude: %f, speed: %f, timestamp: %lf\n", gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time); //EDIT: Replaced tv.tv_sec with gps_data.fix.time
} else {
printf("no GPS data available\n");
}
}
}
sleep(3);
}
/* When you are done... */
gps_stream(&gps_data, WATCH_DISABLE, NULL);
gps_close (&gps_data);
return EXIT_SUCCESS;
}
我通过运行gcc -o gps filename.c -lm -lgps
编译
为了完整起见,我想提供以下 Nathan 程序的编辑版本,它演示了 共享内存接口 方法。我花了一个下午的时间寻找缺少的钥匙来让它工作。
编辑:我使用 errno 更正了正确处理来自 gps_open 和 gps_read 的错误的方法。
#include <gps.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <errno.h>
int main() {
int rc;
//struct timeval tv;
struct gps_data_t gps_data;
if ((gps_open(GPSD_SHARED_MEMORY, NULL, &gps_data)) == -1) {
printf("code: %d, reason: %s\n", errno, gps_errstr(errno));
return EXIT_FAILURE;
}
for(int i=0; i<10; i++) {
/* read data */
if ((gps_read(&gps_data,NULL,0)) == -1) {
printf("error occured reading gps data. code: %d, reason: %s\n", errno, gps_errstr(errno));
} else {
/* Display data from the GPS receiver. */
if ((gps_data.status == STATUS_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, speed: %f, timestamp: %lf\n", gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time);
} else {
printf("no GPS data available\n");
}
}
sleep(3);
}
/* When you are done... */
gps_close (&gps_data);
return EXIT_SUCCESS;
}
我正在为启用了 GPS 的 Raspberry Pi 编写数字处理数据记录 C 程序。我抓住了 gpsd, and its sample app cgps displays gps information correctly. I wanted to use libgps 来与守护程序交互,以便我可以在我的应用程序中获得所有方便的信息,但我很快就被其 API.
的复杂性所淹没其 HOWTO page points me to look at cgps and gpxlogger for example code, but there's so much coupling that I can't wade through it all. On the opposite end of the spectrum, the C code example on the libgps 页面上的文档非常简陋,无法使用。
任何人都可以指出一个 class 示例来揭开这个谜团吗?也许包含 getCoordinates()
函数的东西?
我说得太快了。在浏览了其他 SO 问题后,我 运行 变成了 this 完全不相关的问题。这是我稍微修改过的版本:
#include <gps.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <errno.h>
int main() {
struct timeval tv;
struct gps_data_t gps_data;
if ((gps_open("localhost", "2947", &gps_data)) == -1) {
printf("code: %d, reason: %s\n", errno, gps_errstr(errno));
return EXIT_FAILURE;
}
gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);
while (1) {
/* wait for 2 seconds to receive data */
if (gps_waiting (&gps_data, 2000000)) {
/* read data */
if ((gps_read(&gps_data,NULL,0)) == -1) {
printf("error occured reading gps data. code: %d, reason: %s\n", errno, gps_errstr(errno));
} else {
/* Display data from the GPS receiver. */
if ((gps_data.status == STATUS_FIX) &&
(gps_data.fix.mode == MODE_2D || gps_data.fix.mode == MODE_3D) &&
!isnan(gps_data.fix.latitude) &&
!isnan(gps_data.fix.longitude)) {
//gettimeofday(&tv, NULL); EDIT: tv.tv_sec isn't actually the timestamp!
printf("latitude: %f, longitude: %f, speed: %f, timestamp: %lf\n", gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time); //EDIT: Replaced tv.tv_sec with gps_data.fix.time
} else {
printf("no GPS data available\n");
}
}
}
sleep(3);
}
/* When you are done... */
gps_stream(&gps_data, WATCH_DISABLE, NULL);
gps_close (&gps_data);
return EXIT_SUCCESS;
}
我通过运行gcc -o gps filename.c -lm -lgps
为了完整起见,我想提供以下 Nathan 程序的编辑版本,它演示了 共享内存接口 方法。我花了一个下午的时间寻找缺少的钥匙来让它工作。
编辑:我使用 errno 更正了正确处理来自 gps_open 和 gps_read 的错误的方法。
#include <gps.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <errno.h>
int main() {
int rc;
//struct timeval tv;
struct gps_data_t gps_data;
if ((gps_open(GPSD_SHARED_MEMORY, NULL, &gps_data)) == -1) {
printf("code: %d, reason: %s\n", errno, gps_errstr(errno));
return EXIT_FAILURE;
}
for(int i=0; i<10; i++) {
/* read data */
if ((gps_read(&gps_data,NULL,0)) == -1) {
printf("error occured reading gps data. code: %d, reason: %s\n", errno, gps_errstr(errno));
} else {
/* Display data from the GPS receiver. */
if ((gps_data.status == STATUS_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, speed: %f, timestamp: %lf\n", gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time);
} else {
printf("no GPS data available\n");
}
}
sleep(3);
}
/* When you are done... */
gps_close (&gps_data);
return EXIT_SUCCESS;
}