Куда я попал? Что это такое?
Это главная страница сайта, посвященного расширению заводского функционала маршрутизаторов ZyXEL Keenetic, ZyXEL Keenetic Giga и ZyXEL Keenetic второй серии (II, GigaII и Ultra). Для «черных» кинетиков потребуется установка неофициальной прошивки V1. Прошивки V1 для «черных» кинетиков собираются официальными разработчиками прошивок, эти прошивки не поддерживаются службой поддержки на http://sd.zyxel.ru . Статьи сайта написаны владельцами этих маршрутизаторов. Если Вы увидели тут ошибку или неточность — Вы сами можете ее исправить. Вы можете добавить свою статью на этот сайт, поделиться своими находками и знаниями. Прочтите раздел «Как здесь писать», если Вам есть, что добавить к содержимому этого сайта.
ВНИМАНИЕ. Использование материалов этого сайта подразумевает базовые знания операционной системы Linux на уровне «продвинутого чайника». Нужно знать, что такое права и атрибуты файла, уметь копировать, перемещать, удалалять файлы в режиме командной строки. В интернете можно найти много учебников и инструкций по Linux. Некоторые приемы работы есть и на этом сайте.
Немного о маршрутизаторах Keenetic
На маршрутизаторах ZyXEL Keentic, ZyXEL Keentic Giga, ZyXEL Keentic II, ZyXEL Keentic Omni, ZyXEL Keentic Giga II и ZyXEL Keentic Ultra можно запускать дополнительные приложения с внешнего USB носителя. Эта возможность заложена в заводских прошивках серии v1. Установка программ на внешний usb диск (или usb флешку) никак не модифицирует прошивку кинетика. Вы в любой момент можете отключить диск и вернуться к заводскому функционалу! Существует возможность установить ограниченное число небольших программ во встроенную память маршрутизаторов. В этом случае для возврата к заводскому функционала потребуется сбросить настройки кнопкой reset.
Никаких модифицированных прошивок на этом сайте нет и быть не может. Запуск дополнительных, собранных любителями приложений предусмотрен функционалом кинетиков.
Установка системы opkg
Подключаемый носитель должен иметь первичный раздел с файловой системой, поддерживающей символические ссылки. Рекомендуемая файловая система ext2. Все будет работать и с ext3, и с ntfs. При создании раздела на диске важно, чтобы раздел был главным (или первичным). Дополнительный раздел (или вторичный) не подходят. Подключите отформатированный носитель к кинетику, если носитель определился как DISK_A1, то все нормально, если как DISK_A5, то вы по ошибке создали дополнительный (вторичный) раздел, он не подходит. Если название раздела — последовательность букв и цифр, то Вы используете прошивку серии V2, прошивки этой серии не поддерживаются.
Устанавливаем putty на компьютер (пользователям Windows)
Для установки и настройки программ на кинетик Вам потребуется на компьютере специальная программа, т.н. ssh-клиент. Стандартом для ssh-клиента де-факто среди пользователей Windows является программа putty. Скачаем с оф. сайта программы архив putty.zip и распакуем в любую папку. Запустим putty и настроим. После запуска в разделе ‘Connection | Data | Auto-login username’ введем root (чтобы не вводить имя пользователя каждый раз). В разделе ‘Window | Translation’ выберем в качестве character set кодировку UTF-8. Это нужно для правильного отображения русских букв и символов псевдографики. В Разделе Session введем в качестве ip адрес нашего кинетика и сохраним данные (сессию) под произвольным именем. В дальнейшем для соединения с кинетиком нужно будет сделать ‘double click’ мышкой по введенному имени сессии.
Устанавливаем систему opkg
(1)
Перед установкой убедитесь, что маршрутизатор подключен к сети интернет, в процессе установке он должен скачать обновленный список пакетов. Для установки системы opkg носитель, который удовлетворяет условиям предыдущего раздела, скачиваем любой из архивов ext_init.sh-r2.tar.gz или ext_init.sh-r2.zip для маршрутизаторов keenetic или keenetic giga или любой из архивов ext_init.sh-ii.tar.gz или ext_init.sh-ii.zip для маршрутизаторов новой серии keenetic II, keenetic giga II или keenetic ultra.
Будьте внимательны при выборе архива.
Распаковываем содержимое архива в папку system/bin на носителе. Указанные архивы содержат один файл ext_init.sh, являющийся самораспаковывающимся архивом Linux. Файл ext_init.sh должен иметь атрибут исполнения. Для установки этого атрибута можно использовать дистрибутив Linux. Если дистрибутива Linux под рукой нет, то проще всего копировать этот файл через сетевое окружение Windows прямо на носитель, подключенный к ZyXEL Keenetic — атрибут исполнения в этом случае будет установлен автоматически. Файл следует копировать в папку DISK_A1/system/bin (папку следует создать).
(2)
Перемонтируем носитель (если был подключен к кинетику) или просто подключаем к usb кинетика и ждем минуту-другую, пока в логе (журнале) кинетика не появятся строки приблизительно такого вида:
26 ноя 10:14:30 root Starting opkg/linux install 26 ноя 10:14:30 root All errors are logged in a file /media/DISK_A1/tmpinstall/err.log 26 ноя 10:14:30 root Extracting busybox 26 ноя 10:14:30 root Unpacking busybox 26 ноя 10:14:30 root Extracting system 26 ноя 10:14:36 root Unpacking system 26 ноя 10:14:37 root Generating rsa/dss keys for dropbear 26 ноя 10:14:54 root Starting dropbear 26 ноя 10:14:54 dropbear[508] Running in background 26 ноя 10:14:54 root Connect to keenetic using ssh and run finish_install.sh to finish installation
(3)
Подключаемся к кинетику по ssh. Логин root , пароль zyxel . Выполняем к консоли finish_install.sh и ждем пока все завершится (создастся swap файл):
Creating swap file. Please wait. 128+0 records in 128+0 records out Setting up swapspace version 1, size = 134213633 bytes Loading current packages list Downloading http://zyxel-keenetic-packages.googlecode.com/svn/binary-packages-r2/Packages.gz. Inflating http://zyxel-keenetic-packages.googlecode.com/svn/binary-packages-r2/Packages.gz. Updated list of available packages in /media/DISK_A1/system/var/opkg-lists/packages.
(4)
Меняем пароль с помощью команды passwd. Пароль для соединения по ssh никак не связан с паролем для web конфигуратора.
Все в порядке, но.
Этот текст мало кто будет читать и мы можем написать здесь все, что угодно, например.
Вы живете в неведении. Роботы уже вторглись в нашу жизнь и быстро захватывают мир, но мы встали на светлый путь и боремся за выживание человечества. А если серьезно, то.
В целях обеспечения безопасности сайта от кибератак нам необходимо убедиться, что вы человек. Если данная страница выводится вам часто, есть вероятность, что ваш компьютер заражен или вы используете для доступа IP адрес зараженных компьютеров.
Если это ваш частный компьютер и вы пытаетесь зайти на сайт, например, из дома — мы рекомендуем вам проверить ваш компьютер на наличие вирусов.
Если вы пытаетесь зайти на сайт, например, с работы или открытых сетей — вам необходимо обратиться с системному администратору и сообщить, что о возможном заражении компьютеров в вашей сети.
- © 2005-2023, «4PDA». 4PDA® — зарегистрированный товарный знак.
Умное WI-FI присутствие с помощью роутера Keenetic и Node-Red
Понимание того, кто конкретно в квартире помогает подумать о безопасности и о персональных сценариях работы. Долго не будем задерживаться на этом — на выходе у вас будет сенсор, показывающий подключен ли кто-то из близких к WI-FI или нет.
Что нужно для того, чтобы все получилось?
- Роутер Keenetic с возможностью установки OPKG пакетов
- NodeRed
Инструкция по установке:
Первым делом нам нужно получить возможность установки OPGK пакетов на ваш роутер, для этого воспользуемся данной инструкцией:
Вы можете использовать внутреннюю память роутера для установки.
Затем вам необходимо подключиться к вашему роутеру по SSH и установить mosquitto-client на ваш роутер.
Копировать
opkg install mosquitto-client-nossl jq
Не разрываем SSH подключение и закидываем исполняемый скрипт 010-neighbour.sh в папку /storage/etc/ndm/neighbour.d, если такого каталога нет — создать с правами на выполнение.
Скрипт предварительно редактируем под себя, изменяя несколько харрактеристик :
Копировать
#!/bin/sh DEV1="e8:78:65:d7:61:bf" #тут мы вписываем мак адрес первого устройства DEV2="74:42:8b:1b:bd:73" #тут мы вписываем мак адрес второго устройства replacement() < case "$1" in *$DEV1* ) echo "Name dev1";; # тут вы можете изменить имя первого девайса *$DEV2* ) echo "Name dev2";; # тут вы можете изменить имя второго девайса esac >if [[ "$address" = "ipv4" && "$update" = "none" ]]; then #получаем mac устройства по ID - информация сугубо информационная mac=$(wget -qO - http://127.0.0.1:79/rci/show/ip/neighbour | jq --arg num "$id" '.[$num].mac') #проверяем mac на принадлежность нужному нам хосту - информация сугубо информационная who=$(replacement "$mac") [ -z "$who" ] && exit 0 #публикуем mqtt сообщение типа "Device 1 new" и "Device 1 del" в топик zyxel - информация сугубо информационная mosquitto_pub -d -t zyxel -m "$who $action" -h 10.10.10.112 -p 1883 -u login -P password > /dev/null # вот на этой строчке я заменить брокер на броке малины с NR fi
Теперь незабываем сделать скрипт исполняемым, снова возвращаемся к SSH и вписываем:
Копировать
chmod +x 010-neighbour.sh
Теперь вы можете зайти на брокер и проверить со своим устройством публикуемый топик zyxel
Скрипт исполнения для Node Red
Упростил свой скрипт до базовой логики и очистил от своих допов для вас. В целом тут все очень просто — кто-то подключился к WI-FI, было ли действие с входной дверью в квартиру? Кто-то отключился от WI-FI — закрывали ли вы дверь? И так далее. Все завязывается на входной двери, которая как раз и помогает улучшить алгоритм присутствия в квартире. В случае, если вы находитесь к квартире и отключитесь от WI-FI — дом будет думать, что вы дома, ведь вы не выходили на улицу и не взаимодействовали с входной дверью.
Не забудьте установить node-red-contrib-controltimer
Копировать
[ < "id": "681003fedcd65918", "type": "tab", "label": "Тест", "disabled": false, "info": "", "env": [] >, < "id": "86ad78107440c330", "type": "spruthub-in", "z": "681003fedcd65918", "name": "Входная дверь", "server": "6caeb7a3.0661a8", "friendly_name": "Входная дверь NEW (Спальня) : Состояние датчика касания", "uid": [ "17_10" ], "cid": "12", "ctype": "ContactSensorState", "showHidden": false, "enableMultiple": false, "outputAtStartup": false, "x": 340, "y": 600, "wires": [ [ "b76836241d69fe51" ] ] >, < "id": "b76836241d69fe51", "type": "switch", "z": "681003fedcd65918", "name": "", "property": "payload", "propertyType": "msg", "rules": [ < "t": "cont", "v": "1", "vt": "str" >, < "t": "cont", "v": "0", "vt": "str" >], "checkall": "true", "repair": false, "outputs": 2, "x": 455, "y": 600, "wires": [ [ "51ebab837f3544eb" ], [ "78e9c94c91a1a926", "0a94843d3af37ba3" ] ], "l": false >, < "id": "78e9c94c91a1a926", "type": "change", "z": "681003fedcd65918", "name": "Запоминаем на 3 минуты закрытие двери", "rules": [ < "t": "set", "p": "doorcheckclosed", "pt": "global", "to": "true", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 990, "y": 640, "wires": [ [ "bf1942c171f26fcb" ] ] >, < "id": "410148b7bc5b5cf9", "type": "change", "z": "681003fedcd65918", "name": "Возвращаем на место", "rules": [ < "t": "set", "p": "doorcheckclosed", "pt": "global", "to": "false", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 990, "y": 680, "wires": [ [] ] >, < "id": "bf1942c171f26fcb", "type": "trigger", "z": "681003fedcd65918", "name": "", "op1": "", "op2": "test", "op1type": "nul", "op2type": "str", "duration": "3", "extend": true, "overrideDelay": false, "units": "min", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 835, "y": 680, "wires": [ [ "410148b7bc5b5cf9" ] ], "l": false >, < "id": "51ebab837f3544eb", "type": "change", "z": "681003fedcd65918", "name": "Запоминаем на три минуты открытие двери", "rules": [ < "t": "set", "p": "doorcheckopen", "pt": "global", "to": "true", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1000, "y": 560, "wires": [ [ "38a23d229a6722d8" ] ] >, < "id": "38a23d229a6722d8", "type": "trigger", "z": "681003fedcd65918", "name": "", "op1": "", "op2": "test", "op1type": "nul", "op2type": "str", "duration": "3", "extend": true, "overrideDelay": false, "units": "min", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 845, "y": 520, "wires": [ [ "aa63519fe4edcfe0" ] ], "l": false >, < "id": "aa63519fe4edcfe0", "type": "change", "z": "681003fedcd65918", "name": "Возвращаем на место", "rules": [ < "t": "set", "p": "doorcheckopen", "pt": "global", "to": "false", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 990, "y": 520, "wires": [ [] ] >, < "id": "210c12c1d77775bf", "type": "mqtt in", "z": "681003fedcd65918", "name": "", "topic": "zyxel", "qos": "2", "datatype": "auto", "broker": "ba753d3ede0325ae", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 270, "y": 280, "wires": [ [ "cf8db90eca5beae3", "95f9831b18db0cf2" ] ] >, < "id": "bdbd7a9664ee5bd3", "type": "switch", "z": "681003fedcd65918", "name": "", "property": "payload", "propertyType": "msg", "rules": [ < "t": "cont", "v": "Nikita del", "vt": "str" >, < "t": "cont", "v": "Mari del", "vt": "str" >], "checkall": "true", "repair": false, "outputs": 2, "x": 725, "y": 300, "wires": [ [ "78c880393a46688e" ], [ "908405dba26c8e38" ] ], "l": false >, < "id": "345f82920d9c0ed5", "type": "spruthub-out", "z": "681003fedcd65918", "name": "Маша", "server": "6caeb7a3.0661a8", "friendly_name": "Маша (Вспомогательные) : Обнаружено присутствие", "uid": [ "155_19" ], "cid": "21", "showHidden": false, "enableMultiple": false, "payload": "payload", "payloadType": "msg", "rbe": true, "x": 970, "y": 380, "wires": [] >, < "id": "7c7cfb8a0d11fc21", "type": "change", "z": "681003fedcd65918", "name": "1", "rules": [ < "t": "set", "p": "payload", "pt": "msg", "to": "1", "tot": "num" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 795, "y": 420, "wires": [ [ "345f82920d9c0ed5" ] ], "l": false >, < "id": "908405dba26c8e38", "type": "change", "z": "681003fedcd65918", "name": "0", "rules": [ < "t": "set", "p": "payload", "pt": "msg", "to": "0", "tot": "num" >, < "t": "set", "p": "mariwifi", "pt": "global", "to": "false", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 795, "y": 320, "wires": [ [ "345f82920d9c0ed5" ] ], "l": false >, < "id": "db53559fc473c5b4", "type": "change", "z": "681003fedcd65918", "name": "1", "rules": [ < "t": "set", "p": "payload", "pt": "msg", "to": "1", "tot": "num" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 795, "y": 380, "wires": [ [ "ab3751299733538a" ] ], "l": false >, < "id": "78c880393a46688e", "type": "change", "z": "681003fedcd65918", "name": "0", "rules": [ < "t": "set", "p": "payload", "pt": "msg", "to": "0", "tot": "num" >, < "t": "set", "p": "nikitawifi", "pt": "global", "to": "false", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 795, "y": 280, "wires": [ [ "ab3751299733538a" ] ], "l": false >, < "id": "ab3751299733538a", "type": "spruthub-out", "z": "681003fedcd65918", "name": "Никита", "server": "6caeb7a3.0661a8", "friendly_name": "Никита (Вспомогательные) : Обнаружено присутствие", "uid": [ "155_15" ], "cid": "17", "showHidden": false, "enableMultiple": false, "payload": "payload", "payloadType": "msg", "rbe": true, "x": 980, "y": 320, "wires": [] >, < "id": "cf8db90eca5beae3", "type": "switch", "z": "681003fedcd65918", "name": "", "property": "doorcheckclosed", "propertyType": "global", "rules": [ < "t": "true" >], "checkall": "true", "repair": false, "outputs": 1, "x": 495, "y": 260, "wires": [ [ "bdbd7a9664ee5bd3" ] ], "l": false >, < "id": "95f9831b18db0cf2", "type": "switch", "z": "681003fedcd65918", "name": "", "property": "payload", "propertyType": "msg", "rules": [ < "t": "cont", "v": "Nikita new", "vt": "str" >, < "t": "cont", "v": "Mari new", "vt": "str" >], "checkall": "true", "repair": false, "outputs": 2, "x": 365, "y": 420, "wires": [ [ "d0e6592679582701" ], [ "bb169d458486ccad" ] ], "l": false >, < "id": "d0e6592679582701", "type": "change", "z": "681003fedcd65918", "name": "Start", "rules": [ < "t": "set", "p": "payload", "pt": "msg", "to": "START", "tot": "str" >, < "t": "set", "p": "nikitawifi", "pt": "global", "to": "true", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 505, "y": 360, "wires": [ [ "dc24bafce89d6a3a" ] ], "l": false >, < "id": "dc24bafce89d6a3a", "type": "controltimer", "z": "681003fedcd65918", "name": "", "timerType": "delay", "timerDurationUnit": "minute", "timerDurationType": "num", "timerDuration": 1, "timerLoopTimeoutUnit": "second", "timerLoopTimeoutType": "num", "timerLoopTimeout": 0, "loopTimeoutMessageType": "str", "loopTimeoutMessage": "LOOP_TIMEOUT", "timerMaxLoopIterationsType": "num", "timerMaxLoopIterations": 0, "loopMaxIterationsMessageType": "str", "loopMaxIterationsMessage": "MAX_LOOP_ITERATIONS", "isConsecutiveStartActionTimerResetAllowed": false, "isRunningTimerProgressVisible": true, "outputReceivedMessageOnTimerTrigger": true, "outputReceivedMessageOnTimerHalt": true, "startTimerOnReceivalOfUnknownMessage": false, "resetTimerOnReceivalOfUnknownMessage": false, "isDebugModeEnabled": false, "timerTriggeredMessageType": "str", "timerTriggeredMessage": "TIMER_TRIGGERED", "timerHaltedMessageType": "str", "timerHaltedMessage": "TIMER_HALTED", "isStartActionEnabled": true, "isStopActionEnabled": true, "isResetActionEnabled": true, "isPauseActionEnabled": true, "isContinueActionEnabled": true, "actionPropertyNameType": "str", "actionPropertyName": "payload", "startActionNameType": "str", "startActionName": "START", "stopActionNameType": "str", "stopActionName": "STOP", "resetActionNameType": "str", "resetActionName": "RESET", "pauseActionNameType": "str", "pauseActionName": "PAUSE", "continueActionNameType": "str", "continueActionName": "CONTINUE", "x": 665, "y": 360, "wires": [ [ "69fcab2491cbef8f" ], [ "69fcab2491cbef8f" ] ], "l": false >, < "id": "69fcab2491cbef8f", "type": "switch", "z": "681003fedcd65918", "name": "", "property": "nikitawifi", "propertyType": "global", "rules": [ < "t": "true" >], "checkall": "true", "repair": false, "outputs": 1, "x": 735, "y": 380, "wires": [ [ "db53559fc473c5b4" ] ], "l": false >, < "id": "bb169d458486ccad", "type": "change", "z": "681003fedcd65918", "name": "Start", "rules": [ < "t": "set", "p": "payload", "pt": "msg", "to": "START", "tot": "str" >, < "t": "set", "p": "mariwifi", "pt": "global", "to": "true", "tot": "bool" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 505, "y": 440, "wires": [ [ "f52b5651afc33c5f" ] ], "l": false >, < "id": "0a94843d3af37ba3", "type": "change", "z": "681003fedcd65918", "name": "Stop", "rules": [ < "t": "set", "p": "payload", "pt": "msg", "to": "STOP", "tot": "str" >], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 585, "y": 400, "wires": [ [ "f52b5651afc33c5f", "dc24bafce89d6a3a" ] ], "l": false >, < "id": "f52b5651afc33c5f", "type": "controltimer", "z": "681003fedcd65918", "name": "", "timerType": "delay", "timerDurationUnit": "minute", "timerDurationType": "num", "timerDuration": 1, "timerLoopTimeoutUnit": "second", "timerLoopTimeoutType": "num", "timerLoopTimeout": 0, "loopTimeoutMessageType": "str", "loopTimeoutMessage": "LOOP_TIMEOUT", "timerMaxLoopIterationsType": "num", "timerMaxLoopIterations": 0, "loopMaxIterationsMessageType": "str", "loopMaxIterationsMessage": "MAX_LOOP_ITERATIONS", "isConsecutiveStartActionTimerResetAllowed": false, "isRunningTimerProgressVisible": true, "outputReceivedMessageOnTimerTrigger": true, "outputReceivedMessageOnTimerHalt": true, "startTimerOnReceivalOfUnknownMessage": false, "resetTimerOnReceivalOfUnknownMessage": false, "isDebugModeEnabled": false, "timerTriggeredMessageType": "str", "timerTriggeredMessage": "TIMER_TRIGGERED", "timerHaltedMessageType": "str", "timerHaltedMessage": "TIMER_HALTED", "isStartActionEnabled": true, "isStopActionEnabled": true, "isResetActionEnabled": true, "isPauseActionEnabled": true, "isContinueActionEnabled": true, "actionPropertyNameType": "str", "actionPropertyName": "payload", "startActionNameType": "str", "startActionName": "START", "stopActionNameType": "str", "stopActionName": "STOP", "resetActionNameType": "str", "resetActionName": "RESET", "pauseActionNameType": "str", "pauseActionName": "PAUSE", "continueActionNameType": "str", "continueActionName": "CONTINUE", "x": 665, "y": 440, "wires": [ [ "37758122dd96c4bf" ], [ "37758122dd96c4bf" ] ], "l": false >, < "id": "37758122dd96c4bf", "type": "switch", "z": "681003fedcd65918", "name": "", "property": "mariwifi", "propertyType": "global", "rules": [ < "t": "true" >], "checkall": "true", "repair": false, "outputs": 1, "x": 735, "y": 420, "wires": [ [ "7c7cfb8a0d11fc21" ] ], "l": false >, < "id": "383f892d07f27238", "type": "comment", "z": "681003fedcd65918", "name": "Убираем присутствие из дома только если за последние 3 минуты была закрыта дверь", "info": "", "x": 540, "y": 220, "wires": [] >, < "id": "63ef86619be27df4", "type": "comment", "z": "681003fedcd65918", "name": "", "info": "Тут при подключениии срабатывает минутный таймер ожидающий закрытия двери. Если таймер истечет , дом еще раз проверит подключены ли вы к WIFI и если да оставит ваше присутствие дома.\n\nМне это нужно было, чтобы Алиса четко после закрытия двери запускала приветствие и все рабочие вещи по подсветке и тд, а не когда я еще на подходе к квартире.", "x": 592.8571243286133, "y": 325.7142696380615, "wires": [] >, < "id": "6caeb7a3.0661a8", "type": "spruthub-server", "name": "Мой Спрутхабушка", "host": "10.10.10.41", "api_port": "80" >, < "id": "ba753d3ede0325ae", "type": "mqtt-broker", "name": "", "broker": "localhost", "port": "1883", "clientid": "", "autoConnect": true, "usetls": false, "protocolVersion": "4", "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "birthMsg": <>, "closeTopic": "", "closeQos": "0", "closePayload": "", "closeMsg": <>, "willTopic": "", "willQos": "0", "willPayload": "", "willMsg": <>, "sessionExpiry": "" > ]