gpt4 book ai didi

java - ESP8266 和 Android 套接字无法通信

转载 作者:行者123 更新时间:2023-11-30 00:11:17 25 4
gpt4 key购买 nike

我的 Android 设备和 ESP8266 使用套接字进行通信时遇到问题。这是 ESP8266 的代码:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <Hash.h>

ESP8266WebServer server = ESP8266WebServer(80);
WebSocketsServer webSocket = WebSocketsServer(81);

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED: {
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);

// send message to client
webSocket.sendTXT(num, "Connected");
}
break;
case WStype_TEXT:
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("$%s?\n", payload);
webSocket.sendTXT(num, payload, sizeof(payload), false);
break;
}
}

void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.println();
for (uint8_t t = 4; t > 0; t--) {
Serial.printf("[SETUP] BOOT WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
Serial.println("Starting AP");
WiFi.mode(WIFI_AP);
WiFi.softAP("Alpine_SIM_CNTRL", "12345678");
Serial.println("AP Started");

Serial.println("Starting Socket");
// start webSocket server
webSocket.begin();
webSocket.onEvent(webSocketEvent);
Serial.println("Socket Started");

if (MDNS.begin("simcontrol")) {
Serial.println("MDNS responder started");
}
Serial.println("Starting Server");
//handle index
server.on(
"/", []() {
server.send(200, "text/plain", "You are connected");
});

server.begin();
Serial.println("Server Started");

//Add service to MDNS
MDNS.addService("http", "tcp", 80);
MDNS.addService("ws", "tcp", 81);
}

void loop() {
webSocket.loop();
server.handleClient();
}

下面是 Android 套接字的 Java 代码:

public class WriteToServer extends AsyncTask<MyTaskParams, Void, String> {
Context context;
Socket socket;

public WriteToServer(MyTaskParams Params) {
}

@Override
protected String doInBackground(MyTaskParams... params) {
socket = null;
DataInputStream in = null;
DataOutputStream out = null;
context = params[0].context;
String command = params[0].cmd;
String response = null;
try {
socket = new Socket("192.168.4.1", 81);
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
out.writeUTF(command);
Log.i("Command", "Command sent: " + command);
while (in.available() > 0) {
response = in.readUTF();
}
} catch (IOException e) {
e.printStackTrace();
Log.e("Error", "There was an error writing to the socket. Thrown IO exception");
} finally {
if (socket != null) {
try {
Log.i("INFO", "closing the socket");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return response;
}
}

任何人都可以指出为什么我没有收到任何通讯吗?使用 Android Studio 中的调试器,我可以看到套接字已连接到正确的地址和端口,但是当我向 ESP 发送内容时,它不会打印出我发送的内容或回复。如果我用我的 PC 连接到 ESP 并输入 192.168.4.1:81/***,我会得到一个响应,指出“这只是一个 websocket 服务器”。所以我认为套接字服务器应该基于此启动并运行。任何帮助将不胜感激。

[编辑]感谢 Codo 的回复,我知道我在服务器和客户端上使用了两种不同的套接字技术。我现在正在使用 Java WebSockets。我现在可以在 ESP 上看到 Android 设备正在尝试连接,但 ESP 立即关闭了连接。下面是来自 ESP 设备的调试:

[WS-Server][0] new client from 192.168.4.2
[WS-Server][0][handleHeader] RX: GET / HTTP/1.1
[WS-Server][0][handleHeader] RX: Connection: Upgrade
[WS-Server][0][handleHeader] RX: Host: 192.168.4.1:81
[WS-Server][0][handleHeader] RX: Sec-WebSocket-Key: LmtO2xH7n9k+KKJNN/4+GA==
[WS-Server][0][handleHeader] RX: Sec-WebSocket-Version: 8
[WS-Server][0][handleHeader] RX: Upgrade: websocket
[WS-Server][0][handleHeader] Header read fin.
[WS-Server][0][handleHeader] - cURL: /
[WS-Server][0][handleHeader] - cIsUpgrade: 1
[WS-Server][0][handleHeader] - cIsWebsocket: 1
[WS-Server][0][handleHeader] - cKey: LmtO2xH7n9k+KKJNN/4+GA==
[WS-Server][0][handleHeader] - cProtocol:
[WS-Server][0][handleHeader] - cExtensions: <null>
[WS-Server][0][handleHeader] - cVersion: 8
[WS-Server][0][handleHeader] - base64Authorization:
[WS-Server][0][handleHeader] - cHttpHeadersValid: 1
[WS-Server][0][handleHeader] - cMandatoryHeadersCount: 0
[WS-Server][0][handleHeader] no Websocket connection close.
[WS-Server][0] client disconnected.

谁能帮我弄清楚 ESP 关闭连接的原因?

[更新和修复]我已经解决了这个问题。使用 org.java.websockets 在 Android 设备上创建套接字时,我使用的是:

mWebSocketClient = new WebSocketClient(uri)

我发现如果你在创建套接字时没有分配草稿版本,它默认为 websockets 版本 8,它不适用于 ESP8266(至少不适用于 arduinowebsockets 库。我必须使用创建套接字以下内容:

mWebSocketClient = new WebSocketClient(uri, new Draft_17())

在此之后,websocket 被创建为现在可用的版本 13。

问题现已解决!

最佳答案

您混合了两个不同的概念:在 Java 中,您使用相当低级的 Unix 套接字,而在 ESP 上,您使用与 HTTP 密切相关的 WebSocket。为 Java 获取合适的 WebSocket 客户端库。 – Codo 1 月 4 日 17:33

关于java - ESP8266 和 Android 套接字无法通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48084562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com