
Инструмент для прослушивания шины KNX через TPUART и набор Calimero Project, а также для дампа данных из пакетов в шестнадцатеричный дамп файла, совместимого с Wireshark.
KNX — это популярный протокол автоматизации зданий, используемый для объединения датчиков, исполнительных механизмов и других компонентов «умного» здания. Наш инструмент KNX Bus Dump использует библиотеку Calimero на Java, в которую мы внесли вклад ради этого инструмента, для записи телеграмм, передаваемых по шине KNX. В частности, наш инструмент подключается к шине KNX через соединение TPUART, но может быть изменён для использования других сред передачи. Телеграммы сохраняются в шестнадцатеричный дамп-файл, совместимый с Wireshark. Метки времени предоставляются и нормализуются по UTC с точностью до наносекунд для анализа данных и построения временной шкалы телеграмм. Файл шестнадцатеричного дампа можно импортировать в Wireshark, который можно настроить на разбор KNX-телеграмм с помощью диссектора cEMI из Wireshark.
Наш инструмент можно использовать для анализа протокола датчиков KNX, исполнительных механизмов и других устройств KNX. Например, мы использовали этот инструмент для понимания наших устройств KNX и обнаружили нештатные KNX-телеграммы. Инструмент также идеально подходит для анализа безопасности устройств KNX, поскольку раскрывает все детали используемого протокола и данные, передаваемые по шине KNX.
Tcpdump и Wireshark нельзя использовать для дампа телеграмм, передаваемых по шине KNX, поскольку мы имеем дело с «родными» KNX-телеграммами, а не с TCP/IP-пакетами. Wireshark и tcpdump могут дампить пакеты KNXnet/IP, которые являются TCP/IP-пакетами. KNXnet/IP — это протокол для отправки команд и данных на шину KNX через TCP/IP-сеть.
Этот инструмент предназначен для работы с библиотекой Calimero на Java и совместим с Raspberry Pi 3 или 4, а также с HAT-платой Raspberry Pi для соединения TPUART.
Вот несколько руководств по настройке окружения:
Примечание: В следующих шагах предполагается, что вы настроили своё окружение в соответствии с этими руководствами.
Поместите файл KNXBusDump.java в папку introduction/src/main/java/ набора проектов Calimero.
Перейдите в папку introduction.
Для запуска программы просто выполните:
./gradlew run -Pcalimero.serial.tpuart.maxInterByteDelay=60000 -DmainClass=KNXBusDump
Обратитесь к разделу устранение неполадок ниже для решения распространённых ошибок.
Теперь подождите, пока по шине будут переданы некоторые сообщения; сброшенные телеграммы окажутся в файле KNXBusDump-Telegrams.txt.
Остановите инструмент с помощью Ctrl-C, и файл будет готов к импорту в Wireshark для анализа.
В Wireshark есть возможность импортировать пакеты из шестнадцатеричного дампа и указать диссектор для анализа пакета.
После запуска Wireshark дождитесь завершения начальной загрузки. Затем нажмите File -> Import From Hex Dump...
Чтобы правильно разобрать данные, нам нужно задать регулярное выражение (regex) с некоторыми тегами.
^\s*(?<time>\d{4}-\d\d\-\d\dT(\d\d\:){2}\d\d.(\d){6}[Z])\s(?<seqno>\d{6})\s+(?<data>[0-9a-fA-F]*)$
Выберите файл шестнадцатеричного дампа в качестве источника.
В новом диалоге перейдите на вкладку Regular Expression и вставьте regex в поле.
Убедитесь, что кодировка данных — Plain hex.
В текстовом поле Timestamp format необходимо указать шаблон, генерируемый инструментом.
%Y-%m-%dT%H:%M:%S.%fZ
ПРИМЕЧАНИЕ: Формат метки времени ДОЛЖЕН БЫТЬ ТОЧНО ТАКИМ ЖЕ, как указано. В противном случае метка времени не будет распознана.
В разделе Encapsulation измените Encapsulation Type на Wireshark Upper PDU Export.
Отметьте ExportPDU, чтобы указать диссектор cemi.
Теперь вы можете импортировать файл и анализировать телеграмму.
Метка времени Wireshark:
Соответствующий файл шестнадцатеричного дампа
Примечание: Выделенное время — это НОРМАЛИЗОВАННОЕ ВРЕМЯ UTC. Независимо от того, какой часовой пояс указан рядом со временем, это ВСЕГДА будет правильное время в UTC.
Соображения:
Ниже приведены некоторые распространённые ошибки, которые могут возникнуть при запуске этой программы в соответствии с данным руководством по настройке. Я предоставил решения в надежде, что это исправит ошибку.
Убедитесь, что вы вводите все команды точно так, как указано. Выполнение команды с "Dmainclass" приведёт к тому, что программа по умолчанию запустит программу Discover KNX Servers. Убедитесь, что используется "DmainClass".
Убедитесь, что KNXD (если он у вас установлен в соответствии с этими руководствами) не запущен. Если следовать этому руководству, то KNXD будет использовать тот же порт, а только один процесс может одновременно использовать последовательный порт.
Если вы скопировали и вставили содержимое файлов шестнадцатеричного дампа из приведённых выше, возможно, не хватает дополнительного символа новой строки. Например, в "SampleData1.txt" представление на github показывает 4 строки данных, хотя на самом деле это 4 строки данных плюс символ новой строки. Таким образом, один из возможных вариантов — просто нажать "Enter" после последнего байта данных в импортируемом файле.
В этом репозитории я предоставил данные примера файла в Sample-KNXBusDump-Telegrams.txt, который использовался для создания скриншотов. Не стесняйтесь импортировать его в Wireshark, чтобы проверить самостоятельно.
Инструмент был протестирован на этом локальном KNX-тестовом стенде.
