Уже довольно давно я работаю над своим универсальным Intertechno-Remote на базе Raspberry Pi (см. Предыдущие посты 1 2 3 4 ):
Я пробовал разные подходы для запуска / управления моей службой дистанционного управления через пользовательский HTTPServer / -Handler и простую версию Vert.x. Поскольку MQTT v3.1.1 оказывается де-факто стандартными протоколами для IoT, я также реализовал клиент MQTT.
Этот клиент MQTT в основном следует двум шаблонам проектирования:
- Одна тема для каждого устройства
Для каждого устройства определена тема. Его состоянием можно управлять, опубликовав сообщение с полезной нагрузкой «ВКЛ» или «ВЫКЛ».
Pro:
- пользователь не должен знать о коде адреса устройства Intertechno
- изменения адреса не должны публиковаться
- сообщение просто «ВКЛ» или «ВЫКЛ» для управления устройством
Contra:
- пользователь должен знать тему для каждого устройства
- пользователь может управлять только настроенными устройствами
- Одна тема для сообщения JSON
Pro:
- очень гибкий для управления устройствами
Contra:
- пользователь должен знать о синтаксисе JSON и кодировании устройств
Решение:
Предоставьте оба варианта
Одна тема для каждого устройства
Моя конфигурация очень проста
При запуске Клиент ищет в домашнем каталоге пользователя файл sweethomehub-config.xml, который затем отправляется из JAXB.
Эта конфигурация содержит коды и тему для каждого устройства, а также параметры MQTT для соединения с брокером:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<configuration> <devices> <device> <houseCode>a</houseCode> <groupId>1</groupId> <deviceId>1</deviceId> <name>Light Front-Door</name> <mqttTopic>front/lights/door</mqttTopic> </device> <device> <houseCode>a</houseCode> <groupId>1</groupId> <deviceId>2</deviceId> <name>Light Terrace</name> <mqttTopic>garden/lights/terrace</mqttTopic> </device> <device> <houseCode>a</houseCode> <groupId>1</groupId> <deviceId>3</deviceId> <name>Fountain</name> <mqttTopic>garden/devices/fountain</mqttTopic> </device> <device> <houseCode>a</houseCode> <groupId>1</groupId> <deviceId>4</deviceId> <name>Light Garden</name> <mqttTopic>garden/lights/ambiente</mqttTopic> </device> <device> <houseCode>a</houseCode> <groupId>1</groupId> <deviceId>3</deviceId> <name>Light Living Room</name> <mqttTopic>livingroom/lights/ambiente</mqttTopic> </device> </devices> <mqttClientConfiguration> <mqttClientId>SweethoemMQTTClientId</mqttClientId> <mqttBrokerAddress>sweethome</mqttBrokerAddress> <mqttBrokerPort>1883</mqttBrokerPort> <mqttMessagesBaseTopic>sweethome</mqttMessagesBaseTopic> </mqttClientConfiguration></configuration> |
И еще одна тема ожидает команды JSON: sweethome/devices/jsoncommand
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
{ "devices":[ { "device":{ "name": "Light Front-Door", "houseCode": "a", "groupId": "1", "deviceId": "1" }, "command":"ON" }, { "device":{ "name": "Light Terrace", "houseCode": "a", "groupId": "1", "deviceId": "2" }, "command":"ON" }, { "device":{ "name": "Light Living Room", "houseCode": "a", "groupId": "1", "deviceId": "3" }, "command":"ON" } ]} |
Центральный метод для обработки поступивших сообщений:
JsonDeviceCommandProcessor:
И методы doSwitch :
Клиент MQTT, работающий на Raspberry Pi, ожидает сообщений:
… И получение командных сообщений:
Тестирование приемника с помощью MQTT.fx …
Полный код можно найти на BitBucket .
| Ссылка: | SweetHomeHub: домашний контроль с Raspberry Pi и MQTT — часть 1 от нашего партнера JCG Дженса Детерса в блоге JavaFX Delight . |








