繁体   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