Как извлечь данные из Linux с помощью C++ и Qt. На примере приложения с прогнозом погоды

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет, Хабр! Меня зовут Михаил, я 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

Настало время слегка поразмыслить. Что нам нужно от приложения? Получить навигационные данные – широту, долготу и высоту. Но простите – я написал код, собрал его в приложение и запустил на своём компьютере, получив долготу и широту (кстати, это примерное расположение нашего офиса в Самаре

Источник: https://habr.com/ru/companies/simbirsoft/articles/839126/


Интересные статьи

Интересные статьи

Всем привет! Меня зовут Михаил, я разработчик в команде, которая создает ОС Astra Linux.Тема логирования в дистрибутивах Linux всегда живо обсуждается как среди наших клиентов и партнёров, так и внутр...
Привет, Хабр! Меня зовут Руслан Рахимкулов, я руководитель направления технической поддержки клиентов в VK Tech и ведущий преподаватель онлайн-курса «Специалист технической поддержки». После того, как...
В жизни каждого инженера может произойти ситуация, когда процесс его приложения «завис» и не выполняет ту работу, которую должен. Причины могут быть разные и чтобы узнать их, нужно заглянуть во внутре...
They f***u! They f***u! They f***u! Leo Getz. Lethal Weapon 2.Эта статья появилась после общения с товарищами из группы 1С франчайзи. Не так давно они меня п...
3 марта 2021 года разработчики Google представили Flutter 2. Что появилось в новой версии языка Dart? Как теперь быть с разработкой и поддержкой приложений, созданных с и...