【问题标题】:Socket connection ESP8266 and Socket.ioSocket 连接 ESP8266 和 Socket.io
【发布时间】:2020-03-13 23:28:53
【问题描述】:

我正在使用带有 socket.io 的 React Native 使用套接字将数据发送到 Arduino。 我只是感到困惑,因为我的 arduino 将此字符串打印为输出(而不是“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>
    )
  }
}

有人有什么建议吗?

【问题讨论】:

    标签: javascript react-native socket.io arduino esp8266


    【解决方案1】:

    您的 React 代码正在使用 HTTP 协议打开与 ESP8266 的连接。

    ESP8266 WiFiClient 类是原始 TCP 客户端,而不是 HTTP 服务器。因此,当您打印它收到的内容时,您正在打印您的 React 代码发送的 HTTP 协议行。这就是为什么你看到你所看到的。

    换句话说,socket.io 使用建立在 HTTP 之上的协议,该协议建立在 TCP 之上。您的代码只是使用 TCP,所以它只是看到 HTTP。它不响应 HTTP 消息,并且永远不会看到您尝试发送的数据,因为您没有使用协议。

    如果您真的想使用 socket.io(为什么?),那么您需要为 ESP8266 找到一个 socket.io 库并使用它。或者您需要自己实现socket.io 协议。有一个here,但我不确定它是否能满足您的需求。

    socket.io 是一个不幸命名的软件。在其他计算领域,“套接字”通常指的是原始 TCP 连接。他们选择混淆地重用在 TCP 之上构建的协议的名称。 Linux 下的 TCP“套接字”与socket.io“套接字”不同。 Linux 下的 TCP “套接字”与 ESP8266 WiFiClient 相同(不幸的是,它也被命名,因为它不是特定于 WiFi 的)。

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 2023-04-01
      • 2014-01-21
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多