簡體   English   中英

插座連接ESP8266和Socket.io

[英]Socket connection ESP8266 and Socket.io

我正在使用帶有 socket.io 的 React Native 使用 sockets 將數據發送到 Arduino。 我只是感到困惑,因為我的 arduino 將此字符串打印為 output (而不是“hello world”)

GET /socket.io/?EIO=3&transport=polling&t=N3MDU9z HTTP/1.1
accept: */*
Host: 192.168.1.109
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1

我在我的 ESP8266 上運行此代碼以接收和打印來自客戶端的字符串

#include "ESP8266WiFi.h"

const char* ssid = "SSID";
const char* password =  "PASSWORD";

WiFiServer wifiServer(80);

void setup() {

  Serial.begin(115200);

  delay(1000);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting..");
  }

  Serial.print("Connected to WiFi. IP:");
  Serial.println(WiFi.localIP());

  wifiServer.begin();
}

void loop() {

  WiFiClient client = wifiServer.available();

  if (client) {

    while (client.connected()) {

      while (client.available()>0) {
        char c = client.read();
        Serial.write(c);
      }

      delay(10);
    }

    client.stop();
    Serial.println("Client disconnected");

  }
}

這是客戶端(js)的代碼

import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import io from 'socket.io-client';


export default class App extends React.Component{

  constructor(props) {
    super(props);
  }
  componentDidMount() {
    const socket = io("http://192.168.1.109:80");
    socket.emit("message","hello world");
  }

  render(){
    return(
      <View style={styles.container}>
        <Text>Hello</Text>
      </View>
    )
  }
}

有人有建議嗎?

您的 React 代碼正在使用 HTTP 協議打開與 ESP8266 的連接。

ESP8266 WiFiClient類是原始 TCP 客戶端,而不是 HTTP 服務器。 因此,當您打印接收到的內容時,您正在打印 React 代碼發送的 HTTP 協議行。 這就是為什么你會看到你所看到的。

換句話說, socket.io使用建立在 HTTP 之上的協議,它建立在 TCP 之上。 你的代碼只是使用 TCP,所以它只是看到 HTTP。 它不會響應 HTTP 消息,並且永遠不會看到您嘗試發送的數據,因為您沒有使用協議。

如果您真的想使用socket.io (為什么?),那么您需要為 ESP8266 找到一個socket.io庫並使用它。 或者您需要自己實現socket.io協議。 這里有一個但我不確定它是否會滿足您的需求。

socket.io是一個不幸的命名軟件。 在其他計算領域,“套接字”通常指的是原始 TCP 連接; 他們選擇混淆地重用這個名稱,用於建立在 TCP 之上幾層的協議。 Linux下的TCP“套接字”與socket.io “套接字”不同。 Linux 下的 TCP“套接字”與 ESP8266 WiFiClient相同(不幸的是,它也被命名,因為它不是特定於 WiFi 的)。

componentDidMount() {
    const socket = io("http://192.168.1.109:80");
    socket.emit("message","hello world");
}

好吧,您正在嘗試使用 HTTP 打開 ws 連接

componentDidMount() {
    const socket = io("ws://192.168.1.109:80");
    socket.emit("message","hello world");
}

這應該工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM