乐鑫技术交流
直播中

bigbangboom

8年用户 1269经验值
擅长:电源/新能源
私信 关注
[问答]

ArduinoWebSockets + android应用程序无法让套接字工作怎么解决?

我正在创建一个 android 客户端应用程序来与连接到 Arduino 的 ESp8266 进行通信。我似乎无法让套接字将数据传递给 ESP。我正在使用 Android studio 编写客户端应用程序,在调试时它显示为正在连接的套接字但是当我将数据发送到套接字服务器(ESP8266-01)时我没有收到任何响应并且连接到的串行监视器上没有打印任何内容ESP。附件是我通过 arduino IDE 编程的 ESP 代码。
代码:全选#include

#include
#include
#include
#include
#include
#include





//ESP8266WiFiMulti WiFiMulti;

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(921600);
    Serial.begin(115200);

    //Serial.setDebugOutput(true);

    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");

    //while(WiFiMulti.run() != WL_CONNECTED) {
        //delay(100);
        //Serial.println("Delayed");
    //}
    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 代码中的异步任务:
代码:全选public class WriteToServer extends AsyncTask {


    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;
    }]

几天来我一直在为此苦思冥想,无法弄清楚为什么套接字不向 ESP8266 发送数据,反之亦然。附带说明一下,我将我的 PC 连接到 ESP 并输入 192.168.4.1:81/****,我得到了回复“这只是一个套接字服务器”。所以我知道套接字服务器已启动并正在运行。

               


                        

回帖(1)

其实znvm

2024-1-4 11:24:01
首先,请确保您的 Arduino 和 ESP8266 都可以正常工作,可以通过简单的示例代码验证。然后,您可以尝试以下步骤:

1. 检查 Android 应用程序中的网络权限是否正确,您可以在 AndroidManifest.xml 文件中进行查看和修改。

2. 确保您的 Android 应用程序连接到正确的 IP 地址和端口号,并且连接方式应与您的 ESP8266 服务器相同。

3. 检查您的 ESP8266 代码是否正确配置了 WebSocket 服务器,确保它可以接收和处理来自 Android 应用程序的数据。

4. 如果以上步骤都没有解决问题,请尝试使用其他网络库或现有的 WebSocket 库对 Android 应用程序进行调试。您可以使用 Chrome 浏览器的开发者工具来检查 WebSocket 连接的详细信息。

5. 在您的路由器中,确保 ESP8266 的 IP 地址是静态的,并且正确地开放了端口。

6. 最后,请确保您的 Arduino 代码能够正确解析来自 ESP8266 的 WebSocket 数据,并执行相应的操作。

希望这些步骤可以帮助您解决问题。如果没有解决,您可以提供更多详细信息,以便我们提供更好的解决方案。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分