Небольшая заметка о брокере MQTT с простой авторизацией (имя\пароль) на Raspberri Pi 2 и Windows IoT. Примера для этого нет ни на официальном сайте GnatMQ, ни в репозитории github, потому приведу, чтобы было. Может кому понадобится… ;)
Итак. Вы создали свой проект приложения, которое будет выполнятся в фоне (background app), далее разберем, как создать брокер для MQTT буквально в несколько шагов. Вначале заходим в NuGet Package Manager для нашего решения (solution):
Далее ищем в онлайн вкладке необходимую библиотеку — GnatMQ:
Справа выбираем, для какого конкретно проекта в решении нужно поставить эту библиотеку и выбираем последнюю стабильную версию библиотеки — v1.1.0:
Жмакаем Install. Внизу в Outputs будет лог установки, должно пройти всё без проблем, в противном случае читаем, что пошло не так, и исправляем…
Проверяем проект, в References должна появится ссылка библиотеку GnatMQ:
Вот и всё с подготовлениями! Теперь осталось написать немного кода…
Во-первых, для того чтобы наше приложение работало в фоне постоянно после инициализации брокера и не завершалось, необходимо создать экземпляр BackgroundTaskDeferral. Тогда после выполнения инициализирующей функции Run приложение не завершится и все асинхронные таски будут выполнятся. Более подробно это описано в мануале Developing Background Applications. В программе это будет выглядеть так:
using System; using Windows.ApplicationModel.Background; namespace MQTTBroker { public sealed class StartupTask : IBackgroundTask { private BackgroundTaskDeferral deferral; public void Run(IBackgroundTaskInstance taskInstance) { deferral = taskInstance.GetDeferral(); } } }
После запуска такого приложения оно ничего делать не будет (ведь в функции Run мы ничего и не написали то… :) ), но и не завершится после выполнения (запуска).
Во-вторых, нужно создать метод для делегата, отвечающего за задание параметров авторизации Имя\Пароль.
MqttUserAuthenticationDelegate userauth = new MqttUserAuthenticationDelegate(CheckAuthParams); static bool CheckAuthParams(string user, string pass) { return !(String.IsNullOrEmpty(user) & String.IsNullOrEmpty(pass)); }
В итоге Имя\Пароль для подключения к брокеру назначаются следующим образом:
const string mqtt_brokerUser = "user"; const string mqtt_brokerPass = "pass"; public void Run(IBackgroundTaskInstance taskInstance) { userauth(mqtt_brokerUser, mqtt_brokerPass); broker.UserAuth = userauth; }
Вот и всё! Собираем эти две части вместе и получаем простой брокер на C#, UWP с авторизацией Имя\Пароль. У вас должно получиться нечто подобное (весь код приложения):
using System; using Windows.ApplicationModel.Background; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Managers; namespace MQTTBroker { public sealed class StartupTask : IBackgroundTask { const string mqtt_brokerUser = "user"; const string mqtt_brokerPass = "pass"; private BackgroundTaskDeferral deferral; MqttBroker broker = new MqttBroker(); MqttUserAuthenticationDelegate userauth = new MqttUserAuthenticationDelegate(CheckAuthParams); static bool CheckAuthParams(string user, string pass) { return !(String.IsNullOrEmpty(user) & String.IsNullOrEmpty(pass)); } public void Run(IBackgroundTaskInstance taskInstance) { deferral = taskInstance.GetDeferral(); userauth(mqtt_brokerUser, mqtt_brokerPass); broker.UserAuth = userauth; broker.Start(); } } }
Удачного кодинга! ;)