1. 程式人生 > >ESP8266作為TCPServer與其他裝置建立一個tcp網路進行區域網通訊

ESP8266作為TCPServer與其他裝置建立一個tcp網路進行區域網通訊

1.把一個8266作為服務端,其他的多個8266或者其他裝置(手機、PC等)作為客戶端,建立一個TCP網路

2.用8266建立熱點讓其他裝置進行連線

                           

3.具體操作實現:
        a. 建立8266wifi(熱點)並設定wifi密碼

        b. 設定埠號並獲取AP模式下的IP

        c. 其他的多個8266或者其他裝置(手機、PC等)作為客戶端,找到服務端8266發出的WIFI後,通過密碼進行連線

                         

        d. PC機通過TCP網路助手連線到8266服務端,即可傳送指令到8266服務端,通過串列埠等資訊,可知server與client兩端已經建成通訊

#include <ESP8266WiFi.h>
#define MAX_SRV_CLIENTS 3               //最大同時連線數,即可接入的裝置數量的最大值,
                                        //8266 tcpserver只能接入5個(此資料不確定,網上是這麼說的)

WiFiServer server(8266);                //埠號,範圍  0-65535
WiFiClient serverClients[MAX_SRV_CLIENTS];

const char WiFiAPPSW[] = "12345678";    //設定AP模式下模組所發出的WIFI的密碼
char data[1500];
int ind = 0;

void setupWiFi()
{
  WiFi.mode(WIFI_AP);
  uint8_t mac[WL_MAC_ADDR_LENGTH];
  WiFi.softAPmacAddress(mac);
  
  String macID = String(mac[WL_MAC_ADDR_LENGTH - 3], HEX) +
                 String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
                 String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
  macID.toUpperCase();

 //設定AP模式下的WIFI名稱:12345678_ + MAC地址後六位  
  String AP_NameString = "12345678" + macID;
   
  char AP_NameChar[AP_NameString.length() + 1];
  memset(AP_NameChar, AP_NameString.length() + 1, 0);
   
  for (int i=0; i<AP_NameString.length(); i++)
    AP_NameChar[i] = AP_NameString.charAt(i);
   
  WiFi.softAP(AP_NameChar, WiFiAPPSW);
 
  Serial.println();
  Serial.print ( "IP address: " );
  Serial.println ( WiFi.softAPIP() );

  server.begin();
    
}
void setup() 
{
  Serial.begin(115200);
  Serial.println ("\nBegin now!!!");
  setupWiFi();
}
 
void loop() 
{
    uint8_t i;
    //檢測伺服器端是否有活動的客戶端連線
    if (server.hasClient())
    {       
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        //查詢空閒或者斷開連線的客戶端,並置為可用
        {
            if (!serverClients[i] || !serverClients[i].connected())
            {
                if (serverClients[i]) serverClients[i].stop();  //未連線,就釋放
                serverClients[i] = server.available();          //分配新的
              //  Serial.print("New client: "); Serial.println(i);
                continue;
            } 
        }
         //若沒有可用客戶端,則停止連線
        WiFiClient serverClient = server.available();
        serverClient.stop();
    }
    //檢查客戶端的資料
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
        if (serverClients[i] && serverClients[i].connected())
        {
            if (serverClients[i].available())
            {
                Serial.println("Connected to client !!! ");
                 //從Telnet客戶端獲取資料
                while (serverClients[i].available()) {
                    data[ind] = serverClients[i].read(); //讀取client端傳送的字元
                    ind++;
                         
                }
            for(int j=0;j < ind; j++)
            {
              Serial.print(data[j]);
            }
            Serial.println();
            ind = 0;
            serverClients[i].print("OK! Got your request.");        //在client端回覆       
            }     
        }
    }
}