Итак, в основном ваш вопрос заключается в том, как проанализировать / распаковать двоичные данные, поступающие с датчика, для получения значимой информации.Как обычно в Node-RED, есть два возможных пути: сделать это вручную или использовать какую-то существующую библиотеку, чтобы помочь вам.
Выполнение этого вручную потребует таких вещей, как: сохранить двоичные данные в буфере, используя узлы функций в Node-RED, чтобы разделить буфер на отдельные части (используя структуру протокола в качестве вашей карты), в конечном итоге экранируя символы(если этого требует протокол), подсчет контрольных сумм и т. д. Невозможно оказать вам дополнительную помощь, учитывая ограниченный объем информации, представленной в вашем сообщении.Однако вы, безусловно, найдете поддерживающее сообщество на форуме Node-RED , поэтому я призываю вас пойти туда за помощью.
Другой способ - воспользоваться существующимибиблиотеки.Это может замедлить вас, так как вам нужно исследовать библиотеки, выбрать одну и научиться ее использовать.Я могу попытаться помочь, предоставив некоторые ссылки для вашего чтения:
1- Узел Node-RED имеет узел для обработки двоичных данных (node-red-contrib-binary).Я никогда не использовал его, поэтому я не могу сказать вам, будет ли он предлагать все необходимые вам возможности.В общем, использование уже существующих узлов (из библиотеки Node-RED) - это более быстрый и безопасный способ работы.https://flows.nodered.org/node/node-red-contrib-binary
2- Дополнительные библиотеки, которые в конечном итоге можно было бы рассмотреть:
https://github.com/bigeasy/packet
https://github.com/substack/node-binary
https://github.com/jDataView/jBinary
https://www.npmjs.com/package/binary-parser-encoder
https://www.npmjs.com/package/protobufjs
Редактировать: Допустим, вы решили использовать двоичный кодер-анализатор модуля npm.Ядром вашего потока будет отдельный функциональный узел с этим кодом (проверено нормально со случайными данными):
var Packet = global.get('binary_parser');
var buf = msg.payload;
var typea = new Packet()
.endianess("little")
.uint16("magic")
.uint16("packet_type")
.uint32("packet_size")
.uint16("header_size")
.uint16("scan_number")
.uint16("packet_number")
.double("timestamp_raw")
.double("timestamp_syncw")
.uint32("status_flags")
.uint32("scan_frequencye")
.uint16("num_points_scan")
.uint16("num_points_packet")
.uint16("first_index")
.uint32("first_angle")
.uint32("angular_increment")
.uint32("iq_input")
.uint32("iq_overload")
.double("iq_timestamp_raw")
.double("iq_timestamp_sync")
.uint8("header_padding");
msg.payload = typea.parse(buf);
return msg;