Как связать сокет C # с ESP8266 (аппаратный TCP) - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь создать графический интерфейс для проекта ESP8266, который я уже разработал. На платах используется прошивка NodeMCU, и я загружаю программы через ESP8266 Arduino Core. Я использую C # для моей программы с графическим интерфейсом в Windows.

Вот мой код отладки для ESP8266 (в Arduino):

#include <ESP8266WiFi.h>
String ConnectedMAC[8];
IPAddress ConnectedIP[8];
WiFiClient clientforcom;
void setup() {
  WiFi.mode(WIFI_AP_STA);
  Serial.begin(9600);
  int f = WiFi.scanNetworks();
  Serial.println("Scanning Networks");
  delay(5000);
  for (int n = 0; n < f; n++) {
    Serial.println(WiFi.SSID(n));
  }
  WiFi.begin(ssid, passtring); //SSID and passtring are my home network credentials
  delay(2000);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }
  Serial.print("The IP of this node is: ");
  Serial.println(WiFi.localIP());
}


void loop() {

  MACManagement();
  WiFiServer serverforclient(WiFi.localIP(), 25565);
  while (!serverforclient.hasClient()) { //this does not work with Socket or delay is too long
    delay(50);
    Serial.println("Waiting for client");
  }
  clientforcom = serverforclient.available();
  while (clientforcom.available() <= 0) {
    delay(50);
    Serial.println("Waiting for response");
  }
  String response = clientforcom.readString();
  if (response.startsWith("GetController")) {
    Serial.println("Sending String");
    clientforcom.println("Returned String");
  }
}


void MACManagement() {

  unsigned char number_client;
  struct station_info *stat_info;

  struct ip_addr *IPaddress;
  IPAddress address;
  int i = 0;

  number_client = wifi_softap_get_station_num();
  stat_info = wifi_softap_get_station_info();

  Serial.print(" Total Connected Clients are = ");
  Serial.println(number_client);

  while (stat_info != NULL) {

    IPaddress = &stat_info->ip;
    address = IPaddress->addr;

    Serial.print("client= ");

    Serial.print(i);
    Serial.print(" IP adress is = ");
    Serial.print((address));
    ConnectedIP[i] = address;
    Serial.print(" with MAC adress is = ");

    Serial.print(stat_info->bssid[0], HEX); Serial.print(" ");
    Serial.print(stat_info->bssid[1], HEX); Serial.print(" ");
    Serial.print(stat_info->bssid[2], HEX); Serial.print(" ");
    Serial.print(stat_info->bssid[3], HEX); Serial.print(" ");
    Serial.print(stat_info->bssid[4], HEX); Serial.print(" ");
    Serial.print(stat_info->bssid[5], HEX); Serial.print(" ");
    ConnectedMAC[i] = String(stat_info->bssid[0], HEX) + ":" + String(stat_info->bssid[1], HEX) + ":" + String(stat_info->bssid[2], HEX) + ":" + String(stat_info->bssid[3], HEX) + ":" + String(stat_info->bssid[4], HEX) + ":" + String(stat_info->bssid[5], HEX);
    stat_info = STAILQ_NEXT(stat_info, next);
    i++;
    Serial.println();
  }
}

и вот мой код доступа к сети в C #:

void loadUI(){
            enterIPLabel.Visible=false;
            errorBox.Text="Connecting to Leader node";
            tcpcom=new TcpClient(leadernode.ToString(),25565);
            tcpcom.Connect(leadernode.ToString(),25565);
            while(!tcpcom.Connected);

            tcpcom.Client.Send(System.Text.Encoding.ASCII.GetBytes("GetController"));
            errorBox.Text="Awaiting Node Response";
            while(tcpcom.Available<=0); //hopefully this should stop this method from executing until the response is made
            //FILL IN CODE FOR RETURN STATEMENT
            tabController.Visible=true;
            NodeMap.Visible=true;
        }

Однако, когда я попадаю в раздел «Ожидание клиента» кода ESP8266 и запускаю программу C #, вводим IP-адрес в leadernode. Я получаю ошибку от .NET, в которой говорится:

System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it

Я понятия не имею, почему ESP8266 будет отказывать в соединении, я поставил задержки так, чтобы Software Watch Dog не запускался, поэтому я не понимаю, почему это сломало бы программу.

...