получить данные из gpsd без времени ожидания - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в использовании gpsd с C. Я реализовал свой первый клиент, который использует функцию gps_stream. Если я правильно понял, это похоже на функцию pub / sub, в которой вы можете читать данные gps, используя gps_read. Я хочу получить данные, как только они станут доступны. Единственный способ, который я нашел, - это уменьшить время на функцию gps_waiting. Интересно, есть ли способ не использовать функцию gps_waiting и получить как можно скорее. Здесь ниже мой код.

int runGpsStreamClient() {
    int rc;
    int count = 0;
    clock_t t;

    struct gps_data_t gps_data;
    t = clock();
    if ((rc = gps_open("localhost", "2947", &gps_data)) == -1) {
        printf("code: %d, reason: %s\n", rc, gps_errstr(rc));
        return EXIT_FAILURE;
    }
    get_metric(t, "gps_open");

    t = clock();
    gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);
    get_metric(t, "gps_stream");

    while (count < 60) {
        /* wait for 0.1 second to receive data */
        if (gps_waiting(&gps_data, 100000)) {

            t = clock();
            int rc = gps_read(&gps_data);
            get_metric(t, "gps_read");

            /* read data */
            if (rc == -1) {
                printf("error occurred reading gps data. code: %d, reason: %s\n", rc, gps_errstr(rc));
            } else {
                /* Display data from the GPS receiver. */
                double lat = gps_data.fix.latitude;
                double lon = gps_data.fix.longitude;
                double alt = gps_data.fix.altitude;
                double speed = gps_data.fix.speed;
                double climb = gps_data.fix.climb;
                time_t seconds = (time_t) gps_data.fix.time;
                int status = gps_data.status;
                int mode = gps_data.fix.mode;

                printf("status[%d], ", status);
                printf("mode[%d], ", mode);
                printf("latitude[%f], ", lat);
                printf("longitude[%f], ", lon);
                printf("altitude[%f], ", alt);
                printf("speed[%f], ", speed);
                printf("v speed[%f], ", climb);
                printf("Time[%s].", ctime(&seconds));

                if ((status == STATUS_FIX)
                        && (mode == MODE_2D || mode == MODE_3D)
                        && !isnan(lat) && !isnan(lon)) {
                    printf(" GPS data OK.\n");
                } else {
                    printf(" GPS data NOK.\n");
                }
            }
        } else {
            printf("counter[%d]. Timeout to retrieve data from gpsd. Maybe increase gps_waiting.\n", count);
        }
        count++;
    }
    /* When you are done... */
    gps_stream(&gps_data, WATCH_DISABLE, NULL);
    gps_close(&gps_data);

    return EXIT_SUCCESS;
}

Спасибо, Фелипе

1 Ответ

0 голосов
/ 27 августа 2018

Из gpsd документов (выделено мое)

gps_waiting() можно использовать для проверки наличия новых данных от демона. Второй аргумент - это максимальное время ожидания (в микросекундах) на входе перед возвратом. Возвращает истину, если есть ожидание ввода, ложь по таймауту (без ожидания данных) или состояние ошибки. При использовании экспорта сокетов эта функция является удобной оболочкой для вызова select (2) ...

gps_waiting(&gps_data, t) будет блокировать до t микросекунд, если нет новых данных. Как только новые данные будут получены от GPS, gps_waiting должен вернуться. Если новые данные не получены, функция отключится и вернется через t микросекунд.

Повышение скорости передачи данных будет зависеть от того, насколько быстро ваш GPS выводит данные. Простое уменьшение второго параметра gps_waiting создаст у вас иллюзию более высокой скорости передачи данных, но если вы проверите возвращаемое значение функции, вы увидите, что все, что вы сделали, это заставили функцию превышать время ожидания.

...