Устройства взаимодействуют с локальным сервером по специальному протоколу (связь точка-точка и устройства на общей шине). Для разработки устройств была разработана специальная библиотека на языке С++, исходно предназначенная для Arduino IDE, но легко переносимая и на другие контроллеры(отсутствуют зависимости от специфичных библиотекк Arduino). Библиотека предназначена для микроконтроллеров с сильно ограниченными ресурсами, таких как AVR или STM. Функциональность библиотеки можно условно поделить на две части: инструменты для разработки единичного устройства, напрямую подключающегося к серверу (например, по COM поверх USB или по TCP/IP) и инструменты, предназначенные для разработки сети устройств, объединенных по принципу общей шины (например, хаб, подключающийся к серверу по USB, и устройства, объединенные в шину по RS-485).
Для разработки единичного устройства предназначен класс ARpcDevice. Этот класс реализует устройство с именем и уникальным идентификатором, обладающее набором датчиков и выполняющее определенный набор команд. Непосредственно прием и отправка данных вынесены из библиотеки и реализуются разработчиком устройства для конкретного используемого контроллера, как показано на рисунке ниже
Объект класса ARpcDevice самостоятельно обрабатывает часть сообщений, таких как запрос на идентификацию, сообщения синхронизации и т.д. Так же он обрабатывает служебные команды, такие как запрос списка датчиков или описания интерфейса управления. Для обработки остальных команд нужно разработать класс, реализующий интерфейс ARpcIDevEventsCallback, библиотека будет вызывать его метод processCommand каждый раз, когда будет приходить неслужебная команда.
Обработка сообщений производится объектом класса ARpcRealDeviceMessageDispatch, доступным с помощью метода ARpcDevice::disp(). Так же этот объект позволяет формировать различные сообщения.
Список датчиков и описание интерфейса управления - строки языка С (const char*), содержащие соответствующие описания в xml или json формате, как описано в протоколе взаимодействия между устройствами. Эти строки должны быть глобальными переменными, так как библиотека их не копирует.
При обработке команды нужно обязательно вернуть сообщение ok или err, вызвав соответствующий метод ARpcRealDeviceMessageDispatch::writeOk() или ARpcRealDeviceMessageDispatch::writeErr(). Если выполнение команды занимает значительное время, необходимо регулярно отправлять сообщение синхронизации с помощью метода ARpcRealDeviceMessageDispatch::writeCmdSync().
Измерения передаются с помощью методов ARpcRealDeviceMessageDispatch::writeMeasurement и ARpcRealDeviceMessageDispatch::writeMeasurementB. Первый метод передает данные в текстовом виде, для его использования необходимо преобразовывать числа в строки. Второй метод предназначен для передачи данных в бинарном виде.
Метод ARpcDevice::state() возвращает объект класса ARpcState, представляющий состояние устройства. Состояние устройства подразделяется на две группы: состояние интерфейса управления и дополнительное состояние. Состояние интерфейса управления указывает, в каких позициях должны находиться элементы в интерфейсе управления, чтобы соответствовать текущим параметрам работы устройства.
Перед использованием состояние устройства нужно инициализировать. Для инициализации состояния интерфейса управления нужно воспользоваться методом ARpcState::prepareCommands(count), затем методом ARpcState::prepareCommand(index,name,parametersCount) для каждой команды. Для инициальзации дополнительного состояния нужно вызвать метод ARpcState::prepareAdditionalParameters(count), затем метод ARpcState::prepareAdditionalParameter(index,name) для каждого доп. параметра.
При изменении состояния устройства нужно вызвать метод ARpcState::setCommandParamState или ARpcState::setAdditionalParamState. Библиотека сохранит измененное состояние и сгенерирует соответствующее нотификационное сообщение.
Для обработки широковещательных уведомлений от локального сервера предназначен класс ARpcSrvReady. На данный момент объект этого класса можно использовать для обработки широковещательных UDP уведомлений в локальной IP сети. Сервер рассылает регулярные оповещения на UDP порт 4081, данные передаются в объект класса ARpcSrvReady с помощью метода ARpcSrvReady::putByte(), обработка обнаруженных и успешно разобранных сообщений происходит через интерфейс ARpcISrvReadyCallback. Если на устройстве есть энергонезависимая память, можно настроить его так, например, чтобы оно подключалось только к конкретному локальному серверу.
Для описания списка датчиков и интерфейса управления используется строка в xml или json формате. Для разработки описаний можно использовать утилиту ARpcUiGen или же сформировать список вручную согласно описанию из документации.
Пример:
есть команда set_speed, устанавливающая скорость вращения вентилятора в диапазоне от 0 до 100. Этой команде соответствует элемент управления типа слайдер в интерфейсе управления. Тогда если соответствующее состояние задано, у пользователя при открытии интерфейса управления слайдер будет находиться в позиции, соответствующей текущей установленной скорости вращения на устройстве.