Привет, Хабр! Меня зовут Михаил, я backend-разработчик в SimbirSoft. Хочу поделиться с вами опытом получения различной информации в ОС Linux для использования в своих целях.
Представьте, что нам нужно написать приложение «Погода», которое берёт из сети температуру, влажность и прочие параметры и отображает для пользователя. Было бы неплохо, чтобы оно само определяло, где мы находимся. Но как это сделать? Легко!

На одном из проектов нам предстояло разработать десктопное приложение для портативного устройства и графический интерфейс к нему. При этом, кроме основной функциональности, предстояло выводить дополнительную информацию для пользователя:
- навигационные данные (долготу, широту, высоту);
- сведения о сетевом соединении (название, тип, уровень сигнала Wi-Fi);
- заряд батареи;
- информацию о хранилище (сколько занято/сколько всего).
Стек используемых технологий – C++ в связке с библиотекой Qt (5.12). Задача казалась довольно простой. Но первое впечатление очень часто обманчиво. Особенно в тех случаях, когда вам не приходилось решать подобные задачи. Но обо всём по порядку. Рассмотрим вывод разных видов информации.
Получаем навигационные данные
Почитав документацию к Qt (раз, два) или просто погуглив, вы наверняка найдете решение наподобие тому, что представлено ниже. Небольшой класс, получающий данные о навигации:
class Navigation : public QObject
{
Q_OBJECT
public:
explicit Navigation(QObject *parent = Q_NULLPTR);
};
Navigation::Navigation(QObject *parent):
QObject(parent)
{
auto source = QGeoPositionInfoSource::createDefaultSource(this);
source->setUpdateInterval(1000);
qDebug() << source->sourceName();
connect(source, &QGeoPositionInfoSource::positionUpdated,this,[]( const QGeoPositionInfo & posInfo)
{
auto coords = posInfo.coordinate();
qDebug() << QString("Latitude %1").arg(coords.latitude())
+ QString(" Longitude %1 ").arg(coords.longitude())
+ QString("Altitude %1").arg(coords.altitude());
});
source->startUpdates();
}Не забываем про необходимый заголовочник:
#include <QtPositioning>И про модуль в .pro файле:
QT += positioningЕсли вдруг он не определяется – ставим нужные либы:
sudo apt install -y libqt5location5 libqt5positioning5 qtlocation5-dev qtpositioning5-devВроде всё собралось, запустилось. Даже что-то в консоль напечаталось. Ура! Задача решена?
А давайте посмотрим на результат. У меня на виртуальной Ubunte 20 вывод был таким:

Видим точность «плюс-минус километр», высоты вообще нет (параметр altitude). Как-то не очень… А если нужно дальше с высотой работать? Придумывать самому? Мне лень – да и неправильно это. Кажется, мы столкнулись с первой проблемой.
От Geoclue к gpsd
Настало время слегка поразмыслить. Что нам нужно от приложения? Получить навигационные данные – широту, долготу и высоту. Но простите – я написал код, собрал его в приложение и запустил на своём компьютере, получив долготу и широту (кстати, это примерное расположение нашего офиса в Самаре
