我正在编写一个程序,以通过以下数据结构从2D扫描仪接收数据。 我已经在VBA中完成了相同的程序,但是现在我迁移到了Node Red,并且我不知道如何从Node Network的传感器数据头中获取每个数据。
下面是传感器手册数据标题的照片。
答案 0 :(得分:0)
因此,基本上,您的问题是如何解析/解压缩来自传感器的二进制数据以检索有意义的信息。在Node-RED中很正常,有两种可能的路径:手动完成或使用一些现有的库来帮助您。
手动执行操作将需要以下操作:将二进制数据存储到缓冲区中,使用Node-RED中的功能节点将缓冲区切成单独的片段(使用协议结构作为映射),最终转义字符(如果需要)根据协议),计算校验和等。鉴于您的帖子中提供的信息稀少,因此无法进一步帮助您。但是,您肯定会在Node-RED forum中找到一个支持社区,所以我鼓励您to go there寻求帮助。
另一种方法是利用现有库。这可能会减慢您的速度,因为您需要研究图书馆,选择一个图书馆并学习如何使用它。我可以尝试通过提供一些阅读链接来帮助您:
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模块binary-parser-encoder。您的流程的核心将是具有以下代码的单个功能节点(已通过随机数据测试正常):
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;