Проблема с обменом сообщениями между клиентом веб-сокета Arduino и сервером веб-сокета Tyrus?

Я использую следующую функцию Arduino для отправки данных через веб-соединение:

void WebSocketClient::sendEncodedData(String& str, uint8_t opcode) {

uint8_t mask[4];
int size = str.length()+1;

// Opcode; final fragment
socket_client->write(opcode | WS_FIN);

// NOTE: no support for > 16-bit sized messages
if (size > 125) {
    socket_client->write(WS_SIZE16 | WS_MASK);
    socket_client->write((uint8_t)(size >> 8));
    socket_client->write((uint8_t)(size & 0xFF));
}
else {
    socket_client->write((uint8_t)size | WS_MASK);
}

mask[0] = random(0, 256);
mask[1] = random(0, 256);
mask[2] = random(0, 256);
mask[3] = random(0, 256);

socket_client->write(mask[0]);
socket_client->write(mask[1]);
socket_client->write(mask[2]);
socket_client->write(mask[3]);

for (int i = 0; i<size; ++i) {
    socket_client->write(str[i] ^ mask[i % 4]);
}
}  

Эта функция принадлежит этой библиотеке реализации клиента веб-сокета Arduino.

Мой код сервера java websocket с использованием проекта Tyrus выглядит следующим образом:

public static void runServer() {
    Server server = new Server("192.168.1.105", 8025, "/websockets", ArduinoEndPoint.class);
    try {
        server.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Please press a key to stop the server.");
        reader.readLine();
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        server.stop();
    }
}

Класс ArduinoEndPoint в приведенном выше коде представляет собой простую реализацию аннотированных методов @onMessage, @onOpen и @onClose.

Моя проблема в том, что когда я отправляю сообщение менее 25 символов из Arduino, оно будет получено на сервере, но все сообщения более 25 символов не принимаются.
Сервер Websocket работает с любым размером сообщения с использованием Tyrus реализация клиента java websocket. Что мне здесь не хватает?


person AWT    schedule 13.04.2015    source источник
comment
Какую версию Tyrus вы используете? (1.10 - последняя стабильная версия). Это похоже на проблему с сервером grizzly, поскольку Tyrus запускает метод @ On *, когда получает какое-либо сообщение ... В любом случае, у нас есть много тестов, которые отправляют сообщения одинакового размера, и все это проходит, так что это может быть связано с TCP параметр? Как буферизация по обе стороны от соединения ..   -  person Pavel Bucek    schedule 13.04.2015


Ответы (1)


Согласно документации Arduino-Websocket, он поддерживает длину 65535 символов (16 бит), поэтому это не проблема в коде клиента Arduino-Websocket, но что-то связано с сервером Tyrus.

Попробуйте создать веб-приложение в Tomcat 8, которое поддерживает веб-сокет, подключитесь к нему с помощью Arduino и посмотрите. Я сделал это и не столкнулся с какими-либо проблемами.

person shazin    schedule 13.04.2015
comment
Я тоже это сделал и работаю нормально. да, вы правы, что-то не так с сервером tyrus websocket, но я не могу найти, что это такое? - person AWT; 13.04.2015