Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB

Qt Cloud Messaging API доступен для встраиваемых систем

Cloud, Messaging, QML

Проблемы с облачными сообщениями для встраиваемых устройств вдохновили команды Kaltiot & SnowGrains на создание кросс-платформенного Qt API, который позволяет легко отправлять сообщения с встраиваемых устройств. API называется Qt Cloud Messaging API , и он построен с гибкостью и расширяемостью.

Мы также решили нацелиться на другие области Qt и сделать API легко расширяемым для любого поставщика услуг, а не только для встраиваемых. Это позволяет разработчикам использовать тот же API для разработки мобильных и настольных приложений.

В настоящее время существует огромное количество поставщиков push-сообщений для мобильных и веб разработок. Тем не менее, в таких отраслях, как автоматизация, автомобилестроение, робототехника и в других встраиваемых устройствах, на самом деле нет поставщиков услуг такого типа. Потребность растет быстрыми темпами, поскольку встраиваемые и IoT устройства все больше и больше отправляют сообщения с устройств владельцев, поставщиков автосервисов, телеметрии, облака и многих других.

API-интерфейс Qt Cloud Messaging прост в усвоении и использовании.

Давайте взглянем на то, как использовать API для встраиваемых систем и мобильных платформ Android. Мы интегрировали SDK Kaltiot Smart IoT и Firebase C++ SDK в бэкэнд, а с помощью Qt Cloud Messaging API мы можем легко создать, например, приложение чата поверх него.

Как использовать Qt Cloud Messaging API для встраиваемых устройств:

Во-первых, клонируйте репозиторий qtcloudmessaging: git clone https://codereview.qt-project.org/qt/qtcloudmessaging


Поставщик услуг

Предварительные требования:

  • Получить SDK Kaltiot для вашего встраиваемого устройства (например, Linux или Raspberry Pi SDK) по https://console.torqhub.io
  • Получить ключ API для отправки каналов и/или создания серверной реализации
  • Добавить следующую строку в .pro файл приложения: QT + = cloudmessagingembeddedkaltiot
  • Определить путь KALTIOT_SDK к вашему application.pro
  • Добавить следующие включения в main.cpp
#include <QtCloudMessaging>
 
#include <QtCloudMessagingEmbeddedKaltiot>
  • Добавить следующие конфигурации QtCloudMessaging в main.cpp
// Создайте экземпляр CloudMessaging библиотеки
QCloudMessaging *pushServices = new QCloudMessaging();

// Добавить поставщика для встраиваемых систем Kaltiot
QCloudMessagingEmbeddedKaltiotProvider *kaltiotPushService = new QCloudMessagingEmbeddedKaltiotProvider()

// Параметры инициализации, основанные на поставщике, предоставляются с помощью QVariantMap
QVariantMap provider_params;
provider_params[“API_KEY”] = “Your API key from the Kaltiot console for server communication”;
// Создание имени поставщика, которое может быть использовано через ваше приложение.
pushServices->registerProvider(“KaltiotService”, kaltiotPushService, provider_params);

QVariantMap client_params;
client_params[“address”] = “IOTSensor1”;
client_params[“version”] = “1.0”;
client_params[“customer_id”] = “Kaltiot”;

// Создание каналов по умолчанию для прослушивания
QVariantList channels;
channels.append(“weather_broadcast_channel”);
client_params[“channels”] = channels;

// Подключение клиента IoT-датчика к системе
pushServices->connectClient(“KaltiotService”, “IOTSensor1”, client_params);

//! Автоматически подписаться на прослушивание еще одного канала, например, WindInfo.
pushServices->subsribeToChannel(“WindInfo”, ” KaltiotService “, ” IOTSensor1″);
  • Обеспечить контекст обмена облачными сообщениями с QML в main.cpp
//! Предоставление контекста QML 
engine.rootContext()->setContextProperty(“pushServices”, pushServices);


QML часть:

в main.qml поймать сообщения, поступающие от сервиса Kaltiot.

Чтобы получить сообщение в QML:

  • Получение сообщений
Connections{
target : pushServices
onMessageReceived:{

      //! Message is received as string and needs parsing to JSON

console.log(message)
}
}
  • Отправление сообщений
//! Отправка широковещательного сообщения, например, от метеостанции:
//! Структура сообщения для встраиваемых устройств проста:
//! определить полезную нагрузку json:
//! {
//!   “payload_type”:”STRING”,
//!   “payload”: encodeURI(JSON.stringify(payload))
//! }
//! Полезная нагрузка - это ваше приложение. Например:
var payload =
{
  msgType:”NEW_WEATHER_INFO”,
  city: “Oulu”,
  forecast: “full sunlight for whole next week”
}

//! Капсулируйте полезную нагрузку для сообщения и отправляйте ее через API QtCloudMessaging:
var payload_array = [{“payload_type”:”STRING”,”payload”: encodeURI(JSON.stringify(payload))}]

pushServices.sendMessage(JSON.stringify(data), ”KaltiotService”, ”IOTSensor1”, ””, ”weather_broadcast_channel”);


Использование Qt Cloud Messaging API для мобильной разработки Android/iOS с поставщиком услуг Firebase от Google

Предварительные требования:

  • Создать новый проект в консоли Google Firebase: https://firebase.google.com/
  • Загрузить SDK Google Firebase C++ и добавить конфигурационный файл Firebase для Android Gradle:
    DISTFILES += \android/google-services.json
  • Добавить следующую строку в .pro файл приложения: QT + = cloudmessagingfirebase
    Определить путь Firebase Google в файле application.pro с помощью GOOGLE_FIREBASE_SDK
  • Добавить следующие включения в свой файл main.cpp
#include <QtCloudMessaging>

#include <QtCloudMessagingFirebase>
  • Добавить следующую настройку QtCloudMessaging в main.cpp:
// Создайте экземпляр CloudMessaging библиотеки

QCloudMessaging *pushServices = new QCloudMessaging();

QCloudMessagingFirebaseProvider *firebaseService = new QCloudMessagingFirebaseProvider();

QVariantMap provider_params;

// Ключ API сервера не рекомендуется хранить внутри кода приложения из соображений безопасности.
// Но если вы это делаете или если вы выполняете реализацию сервера с помощью C++ и Qt, убедитесь, что он находится внутри скомпилированного файла C.
// SERVER_API_KEY необходимо иметь возможность отправлять сообщения темы с клиента без сервера приложений Firebase.

provider_params[“SERVER_API_KEY”] = “Get your SERVER API KEY from the google firebase console”;

// Регистрация компонента службы firebase Google.
pushServices->registerProvider(“GoogleFireBase”, firebaseService, provider_params);

/*! Для мобильного устройства необходим подключенный клиент.
\param Service name “GoogleFireBase”
\param Client identifier name to be used inside the application
\param Parameters for the client. No params for firebase client.
*/

pushServices->connectClient(“GoogleFireBase”, “MobileClient”, QVariantMap());

//! Автоматически подписаться на прослушивание одной темы
pushServices->subsribeToChannel(“ChatRoom”, “GoogleFireBase”, “MobileClient”);
  • Обеспечить контекст обмена облачными сообщениями с QML в main.cpp
//! Предоставление контекста QML
engine.rootContext()->setContextProperty(“pushServices”, pushServices);

QML часть:

в main.qml поймать сообщения, поступающие с google firebase

  • Получение сообщений:
Connections{
target : pushServices
onMessageReceived:{
//! Сообщение принимается как строка и требует синтаксического анализа для JSON

console.log(message)
}
}
  • Отправление сообщений:
//! Для firebase структура сообщения должна иметь данные как целое сообщение.
//! Уведомления отображаются в центре уведомлений Android/iOS.
function sendMessage(notification_titile, notification_msg, msg){
var data = { “data”:{
“message”: {“text”:msg } },
“notification” : {
“body” : notification_msg,
“title” : notification_titile
}
}

//! Дайте идентификатор поставщика данных и поставщика услуг, а также имя клиента, определенное в коде C++.

pushServices.sendMessage(JSON.stringify(data),”GoogleFireBase”,”MobileClient”,””,”ChatRoom”);
}

Вы можете поиграться с Firebase Qt Cloud Messaging API + из образца https://github.com/snowgrains/qtcloudmessaging-examples

API-интерфейс Qt Cloud Messaging предоставляет кросс-платформенный API, который позволяет нам включать новых поставщиков и поддерживать API разработки таким же.

API Qt Cloud Messaging разработан так, чтобы быть легко доступным для любого поставщика услуг. Взгляните на него на https://codereview.qt-project.org/qt/qtcloudmessaging и внесите свой собственный вклад в бэкэнд в сообществе.

Kaltiot разрабатывает и обслуживает облачные сервисы IoT с 2008 года. Ей доверяет Microsoft. Через Kaltiot проходит 10М сообщений каждый час.

SnowGrains предоставляет полные программные решения.

Статья написана: Ari Salmi | Вторник, Январь 2, 2018г.

Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
ИИ

https://blog.qt.io/blog/2018/01/02/qt-cloud-messaging-api-available-embedded-systems/ Пытался по этому мануалу все сделать, ошибка возникла на 2 шаге, QT += cloudmessagingfirebase Project ERROR: Unknown module(s) in QT: cloudmessagingfirebase Как лечить это?

Comments

Only authorized users can post comments.
Please, Log in or Sign up
МБ
April 21, 2019, 9:40 a.m.
Моисей Бушуев

Qt - Test 001. Signals and slots

  • Result:0points,
  • Rating points-10
AA
April 17, 2019, 7:40 p.m.
Anton Ablin

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
E
April 17, 2019, 6:16 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:100points,
  • Rating points10
Last comments
April 21, 2019, 4:22 p.m.
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
April 21, 2019, 3:48 p.m.
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Now discuss on the forum
April 24, 2019, 11:22 a.m.
Ruslan Polupan

Согласен. но ситуация не поменялась. Такое чуство что данные не записываются в модель.
April 24, 2019, 6:20 a.m.
Ruslan Polupan

я так понимаю надо инфорация об устройствах.Я бы пробовал так rust@suse:~> lsblk -PNAME="sda" MAJ:MIN="8:0" RM="0" SIZE="111,8G" RO="0" TYPE="disk" MOUNTPOINT=""NAME="sda1" MAJ:MIN="8...
April 21, 2019, 4:16 p.m.
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
Join us in social networks

For registered users on the site there is a minimum amount of advertising