如何使用 NodeMCU 发送/接收二进制数据?

我一直在尝试在 NodeMCU 平台上的 TCP 模块上挂载一种自定义协议。然而,我尝试嵌入到 TCP 数据段中的协议是二进制的,而不是基于 ASCII 的(例如 HTTP),因此有时它包含一个 NULL 字符(字节 0x00),导致 TCP 模块实现中的 C 字符串的那部分消息在数据包中丢失。

-- 服务器在 80 上监听,如果接收到数据,将数据打印到控制台并返回“hello world”到调用方
-- 30 秒无活动客户端超时
sv = net.createServer(net.TCP, 30)

function receiver(sck, data)
  print(data)
  sck:close()
end

if sv then
  sv:listen(80, function(conn)
    conn:on("receive", receiver)
    conn:send("hello world")
  end)
end

* 这是一个简单的例子,您可以看到,“receiver”变量是一个回调函数,它打印从监听器检索的 TCP 段的数据。

如何修复这个问题? 有没有一种使用 NodeMCU 库来绕过此问题的方法? 还是我必须实现另一个 TCP 模块或修改当前模块的实现,以支持数组或表作为返回值,而不是使用字符串?

欢迎提出任何建议。

点赞
用户5636775
用户5636775

回调函数收到的数据不应该被截断。你可以通过修改以下代码来验证:

function receiver(sck, data)
   print("Len: " .. #data)
   print(data)
   sck:close()
 end

你会发现,虽然数据只被打印到第一个零字节(通过print()函数),但是整个数据确实存在于LUA字符串data中,你可以使用8位安全(和零字节安全)的方法正确处理它。

虽然修改print()函数也可以实现零字节安全,但我不认为这是一个错误,因为print函数是用于文本的。如果你想向串口写入二进制数据,请使用uart.write(),即:

uart.write(0, data)
2017-05-12 14:51:25