2017-05-12 4 views
2

NodeMCU 플랫폼의 TCP 모듈을 통해 사용자 지정 프로토콜을 탑재하려고했습니다. 그러나 TCP 데이터 세그먼트 내부에 포함하려고하는 프로토콜은 ASCII 기반이 아닌 (예를 들어 HTTP와 같이) ASCII 기반이 아닌 바이너리이기 때문에 TCP 모듈 구현 내에서 C 문자열을 끝내는 NULL char (바이트 0x00)을 포함하기도합니다. 패킷 내부의 메시지 일부가 손실됩니다.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

데이터가 잘 렸는지 확인 했습니까? 나는 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-String data에 있으며 8 비트 안전 (및 제로 세이프 안전) 방법으로 올바르게 처리 할 수 ​​있습니다.

print() -function도 제로 세이프하도록 수정해야하지만 인쇄 기능은 텍스트 용이므로 버그로 간주하지 않습니다. 바이너리 데이터를 직렬로 쓰려면

uart.write(0, data) 
+0

참고 두 번째 줄은'print ("Len :".. #data)' –

+0

@MatthewBurke Argh, ty;를 읽어야합니다. – Ctx

+0

실제로 그것은 제로 세이프가 아닌 print() 함수입니다. 감사 – thePiGrepper