Разъем ESP8266 и Socket.io - PullRequest
       21

Разъем ESP8266 и Socket.io

0 голосов
/ 14 марта 2020

Я использую React Native с socket.io для отправки данных в 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>
    )
  }
}

У кого-нибудь есть совет?

1 Ответ

1 голос
/ 14 марта 2020

Ваш код React использует протокол HTTP для открытия соединения с ESP8266.

Класс ESP8266 WiFiClient является необработанным TCP-клиентом, а не HTTP-сервером. Поэтому, когда вы печатаете то, что он получает, вы печатаете строки протокола HTTP, отправленные вашим кодом React. Вот почему вы видите то, что видите.

Другими словами, socket.io использует протокол, построенный поверх HTTP, который построен поверх TCP. Ваш код использует только TCP, поэтому он просто видит HTTP. Он не отвечает на сообщения HTTP и никогда не увидит данные, которые вы пытаетесь отправить, потому что вы не говорите по протоколу.

Если вы действительно хотите использовать socket.io (почему?), Тогда вы ' Вам нужно будет найти библиотеку socket.io для ESP8266 и использовать ее. Или вам нужно реализовать протокол socket.io самостоятельно. Здесь есть один , но я не уверен, что он будет делать то, что вам нужно.

socket.io - это, к сожалению, названная часть программного обеспечения. В других областях вычислений «сокет» чаще всего ссылается на необработанное TCP-соединение; они решили использовать название для протокола, созданного несколькими уровнями выше TCP. «Сокет» TCP под Linux - это не то же самое, что «сокет» socket.io. TCP-сокет под Linux - это то же самое, что ESP8266 WiFiClient (который также, к сожалению, назван, так как он не указан c для WiFi).

...