• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Приём\передача бинарных данных

igorv.sh

New member
Доброго времени суток!

Есть задача реализации сервера бинарного протокола поверх tcp. Сам протокол прост и особых сложностей в его реализации пока не вижу.
Наступил же на неожиданные грабли. При отправки данных в сокет они преобразуются в строку. Требуется передать один байт - 0x01 Однако при отправке это значение интерпретируется как символ и передаётся его код. Т.е. получателю вместо 0x01 доставляется 0x31, что соотв. ASCII коду символа "1".
Существует ли способ передачи бинарных данных или правильного их преобразования?
 

igorv.sh

New member
Спасибо.
Да только это не то. Ибо протокол надо соблюдать. Ответная часть ожидает бинарные данные, но не транскодированные в текст.
Правильно ли понял, что передать произвольный поток байт не получится?
Вероятно придётся отказаться от lua
 

pvvx

Активный участник сообщества
Lua то причем? Отказываться придется от HTTP...
WebSocket. Там запросто бинарные данные идут прямо в javascript...
Вроде это единственный метод передать бинарные данные на любое устройство без дополнительной пред-установки специального ПО.
 

igorv.sh

New member
Да мне то и не нужен http. Наверное не верно понял суть tcp server. Читая вместо tcp http server, всё встаёт на места.
Про websocket почитаю.
 

pvvx

Активный участник сообщества
Да мне то и не нужен http. Наверное не верно понял суть tcp server. Читая вместо tcp http server, всё встаёт на места.
Про websocket почитаю.
" tcp server" и есть голый TCP. По другому это обычно называют tcp socket... Но им никуда кроме как аналогично открытому tcp socket-у (но клиенту) не передать бинарные данные...
 

igorv.sh

New member
Судя по доке в nodemcu реализация websocket имеет лишь клиент. Не подходит.
" tcp server" и есть голый TCP.
Тогда не понимаю как отправить не текст. Вот пример:
Код:
srv=net.createServer(net.TCP)
srv:listen(2425,function(conn)
  conn:on("receive",function(conn,payload)
    print (payload)
    conn:send(1)
  end)
end)
Клиент отправляет 0x01 0x28
Сервер должен ответить 0x01 Однако отвечает 0x31
Код:
ethlcd: Invalid device response (want 0x01, got 0x31). Exiting
Не верный ответ подтверждается дампом трафика.
В доке упоминается:
sck:send(data, fnA) is functionally equivalent to sck:send(data) sck:eek:n("sent", fnA).

Parameters
  • string data in string which will be sent to server
  • function(sent) callback function for sending string
Могу предположить, отправка бинарных данных не предусмотрена. Только текст для http.
 

igorv.sh

New member
Разобрался.
Если отправить не 0x01, а string.char(0x01) в сеть уходит 0x01
 
Сверху Снизу