schema.json
Какое функциональное назначение у schema.json?
Данный файл - это контракт между конкретным экземпляром Unit и Pepeunit:
- Unit гарантирует, что он подпишется на все стандартные топики, указанные в
input_base_topic, и все UnitNode, указанные вinput_topic - Unit гарантирует, что он будет публиковать данные в стандартные топики из
output_base_topic, и во все UnitNode, указанные вoutput_topic - Pepeunit гарантирует, что будет отправлять корректные форматы данных в
input_base_topic, и что подпишется на все топики вoutput_base_topic - Pepeunit гарантирует, что будет производить авторизацию для публикации и подписки на все без исключения топики, адресованные на инстанс EMQX, используемый Backend
- Pepeunit гарантирует, что будет подписан на все топики, соответствующие паттерну
unit.example.com/+/+/+/pepeunit - Pepeunit гарантирует, что подпишется на все топики с паттерном
unit.example.com/+/pepeunit, у которых включен механизм DataPipe
Структура
{
"input_base_topic": {
"update/pepeunit": [
"example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/update/pepeunit"
],
"env_update/pepeunit": [
"example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/env_update/pepeunit"
],
"schema_update/pepeunit": [
"example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/schema_update/pepeunit"
],
"log_sync/pepeunit": [
"example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/log_sync/pepeunit"
]
},
"output_base_topic": {
"state/pepeunit": [
"example.com/output_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/state/pepeunit"
],
"log/pepeunit": [
"example.com/output_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/log/pepeunit"
]
},
"input_topic": {
"set_fan_state/pepeunit": [
"example.com/2d98b4ba-c935-4379-8e1a-520e76018c17/pepeunit"
"example.com/c0b107a7-9ae0-44ed-bc76-db5ff2af8887"
]
},
"output_topic": {
"current_fan_speed_percentage/pepeunit": [
"example.com/d76b4234-3997-4a4a-a113-6d1c21d6b84a/pepeunit"
],
"current_temp/pepeunit": [
"example.com/7279d28d-53b6-4866-99da-0b81bc1cc025/pepeunit"
]
}
}Топики можно разделить на две категории: стандартные и топики Разработчика Unit:
input_base_topicиoutput_base_topic- стандартные топикиinput_topicиoutput_topic- топики Разработчика Unit
Стандарнтые топики
INFO
- Всегда состоят из
5основных элементов - Каждому наименованию топика в schema_example.json соответствует только один топик из EMQX:
Структура топиков в EMQX:
Доменное имя инстанса / тип топика / Unit.uuid / назначение / pepeunitПредназначены для корректной работы механизма стандартных MQTT команд и стандартных MQTT топиков состояния
Топики Разработчика
INFO
- Могут состоять из
2или3элементов (c и без постфикса/pepeunitна конце) - Для топиков без постфикса
/pepeunit(состоящих из2элементов) нельзя настроить DataPipe
Структура топиков в EMQX:
Доменное имя инстанса / UnitNode.uuid
Доменное имя инстанса / UnitNode.uuid / pepeunitКаждый топик с такой структурой соответствует одному UnitNode
Подробнее об output_topic:
- Предназначен, чтобы Unit мог отправлять данные в EMQX
- Каждому
output_topicиз schema_example.json соответствует только один топик из EMQX - Unit имеет эксклюзивное право на публикацию в данные топики, ни один другой Unit опубликовать данные в них не сможет
Подробнее об input_topic:
- Предназначен, чтобы Unit мог принимать сообщения сразу от нескольких Unit
- Каждому
input_topicиз schema_example.json может соответствовать несколько топиков из EMQX - Система связей
Output->Inputпозволяет Unit подписываться не только на свойInputUnitNode, а также получить значения изOutputUnitNode других Unit внутри одногоinput_topic
Схематический пример создания связи между двумя Unit
Почему существуют только связи Output->Input?
В парадигме протокола MQTT в топик информацию публикует издатель, а получить информацию из топика могут подписчики. Если перенести эту логику на Pepeunit, можно сделать следующие выводы:
Output- топик, в который Unit может отправить данные (Unit издатель для этого топика)Input- набор топиков, из которых Unit может получить данные (Unit подписчик для этих топиков)
Таким образом, когда создаётся связь Output->Input, мы говорим Unit, у которого есть Input, дополнительно подписаться этим Input на Output другого Unit. Т.е. Unit может получать в Input информацию от нескольких Output других Unit.
Если бы существовала возможность создавать связи Input->Output, то это означало бы, что Input одного Unit инициирует или влияет на Output другого Unit.