2017-05-12 60 views
2

我一直在尝试通过NodeMCU平台上的TCP模块安装自定义协议。但是,我尝试在TCP数据段中嵌入的协议是二进制的,而不是基于ASCII的(例如HTTP),所以有时它包含一个NULL字符(字节0x00),结束了TCP模块实现中的C字符串,导致包内的部分消息丢失。如何使用NodeMCU通过TCP发送/接收二进制数据?

-- server listens on 80, if data received, print data to console and send "hello world" back to caller 
-- 30s time out for a inactive client 
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 

*这是一个简单的例子,正如可以看到的,“接收器”的变量是从由听者检索到的TCP段打印数据的回调函数。

这怎么解决?有没有办法使用NodeMCU库来绕过这个问题?或者是否必须实现另一个TCP模块或修改当前实现以支持数组或表作为返回值而不是使用字符串?

任何建议表示赞赏。

+1

你检查,如果数据是_really_截断?我怀疑,只有print()方法会停止在0字节。尝试打印数据的长度以查看是否已在进入回调时截断数据。 – Ctx

+0

Lua本身对嵌入了NULL的字符串没有问题。 'print'应该可以处理它们。你可以用'print(#data)'检查'data'的长度。 –

回答

1

您在回调中收到的数据不应被截断。您可以通过改变代码如下检查自己这一点:

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

您会发现,认为,虽然数据确实只印到第一个零字节(由print() - 函数),整个数据存在于LUA字符串data中,您可以使用8位安全(和零区安全)方法正确处理它。

虽然应该很容易修改print()函数也是零字节安全的,但我不认为这是一个错误,因为打印函数是用于文本的。如果你想写二进制数据到串行,使用uart.write(),即

uart.write(0, data) 
+0

注意第二行应该是'print(“Len:”##data)' –

+0

@MatthewBurkeArgh,ty;) – Ctx

+0

确实它是print()函数,它不是零字节安全的,而不是别的。谢谢 – thePiGrepper

相关问题