0

次のArduino関数を使用して、websocket通信でデータを送信しています:

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 websocket クライアント実装ライブラリに属しています。

Tyrus プロジェクトを使用した私の Java Websocket サーバー コードは次のとおりです。

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 アノテーション付きメソッドの単純な実装を表しています。

私の問題は、Arduino から 25 文字未満のメッセージを送信すると、サーバーで受信されますが、25 文字を超えるすべてのメッセージが受信されないことです。
Websocket サーバーは、Tyrus Java Websocket クライアント実装を使用して、任意のメッセージ サイズで動作します。ここで何が欠けていますか?

4

1 に答える 1

0

Arduino-Websocket のドキュメントによると、長さ 65535 文字 (16 ビット) をサポートしているため、Arduino-Websocket クライアント コードの問題ではなく、Tyrus サーバーと関係があります。

Web ソケットをサポートする Tomcat 8 で Web アプリケーションを作成し、Arduino を使用して接続してみてください。私はこれを行いましたが、問題はありませんでした。

于 2015-04-13T02:53:57.360 に答える