2020年5月19日 星期二

六、2 存取點(AP)模式建立與連線測試


接下來我們就以一個範例程式來說明如何在ESP8266上建立一個WiFi無線網路的AP存取點,在這個範例程式中我們將建立和產生一個名稱(SSID)為"ESPsoftAP_01",密碼(Password)為"12345678"的AP存取點,而且每隔3秒會檢查一次有多少個無線WiFi裝置已經連上了這個AP存取點,並將這些訊息顯示在電腦上的Arduino IDE序列監控視窗中。

要將ESP8266設定在WiFi無線網路的AP存取點模式,必須使用


WiFi.mode(mode)


這個函式指令,其中的參數“mode”共有四種選擇,分別是:「WIFI_AP」、「WIFI_STA」、「WIFI_AP_STA」及「OFF」;而其中的「WIFI_AP」和「WIFI_AP_STA」兩種選擇都可讓ESP8266工作在AP存取點模式,只是後者同時具備了站點(Station)的功能。如果在程式中使用者沒有使用到這個函式,那麼系統會預設為「WIFI_AP_STA」模式,也就是同時開啟了AP存取點與站點兩種功能模式。在後面的範例程式中會示範這個特性。

在宣告完之後如果要在ESP8266上建立一個WiFi無線網路的AP存取點我們必須使用下面的函式指令


WiFi.softAP(SSID,Password,channel,hidden,max_connection)


其中的第一個參數「SSID」是我們要設定的AP存取點名稱,它的最大長度為31個字元;而「Password」則是其他站點(Station)無線WiFi裝置連接這個AP存取點時使用的密碼,同樣的也有長度的限制,最少要有8個字元,最長不能超過63個字元。接著的「channel」這個參數代表這個AP存取點使用的無線WiFi通訊頻道,其號碼從1~13,預設頻道值為1。「hidden」代表這個AP存取點是否可被一般的無線WiFi裝置掃描到,如果設定值為”true”,代表AP存取點被隱藏起來無法看見。至於最後的「max_connection」參數,則是指同時間最多可以有幾個站點無線WiFi裝置可以連接到這個AP存取點,其範圍由0~8,而預設值為4。

上面括弧中的參數除了第一個「SSID」是必須要使用之外,其他的都是屬於可選用的,甚至連密碼「Password」都可以不用!在後面的範例程式中,為了方便測試,所以實際上只設定了「SSID」這個參數而已。『WiFi.softAP()』這個函式是一個布林(Boolean)型式的函式,如果設定成功的話,會傳回”true”的結果,反之則傳回”false”。


六、2-1 以預設伺服器IP位址建立軟體存取點(AP)

下面的範例程式將會建立一個WiFi無線網路的AP存取點,而且每隔3秒將連線到此AP存取點的無線WiFi裝置數目顯示在電腦上的Arduino IDE序列監控視窗中

範例程式功能與動作說明

1、以ESP8266建立一無線WiFi存取點,SSID名稱為『ESP_softAP01』不使用密碼。

2、此AP存取點內建伺服器的IP位址為:[ 192.168.4.1 ]。

3、此AP存取點每隔3秒檢查一次目前已連線的WiFi裝置數目,並顯示在電腦上的Arduino IDE序列監控視窗中。


程式說明與列表

程式的第3行在引入<ESP8266WiFi.h>函式庫。接著5~7行設定AP存取點的SSID名稱與密碼其中程式的第6行定義了一個字串變數


String softSsidChip = "ESP"+String(ESP.getChipId());


其中的「String(ESP.getChipId()」部分,是以『ESP.getChipId()』這個內建函式去取得這顆ESP8266晶片的32位元晶片ID號碼,並在轉換成字串後,與"ESP"字串組合成一個唯一且不會重複的AP存取點名稱。所以會這樣做,是因為當我們在某一特定小範圍的場域必須同時使用到許多顆ESP8266時,如果我們以人工的方去分別名命它們,一則因為要分別的修改程式內容所以很不方便,再者也還是很容易用到重複的名稱,假如以這種方式就不會有這種AP存取點名稱重複的問題了

在程式的第16行我們用下列的方式建立了這個AP存取點:


boolean result=WiFi.softAP(softSsid);


其中的softSsid 」即為這個AP存取點的名稱內容為 "ESP_softAP01"在本範例中為了方便測試所以並未使用前面提到的”softSsidChip”這個字串當AP點的SSID名稱使用者可依需要自行選擇採用那一個。如果我們想加上密碼以提高安全性只要改寫成下面的形式便可


boolean result=WiFi.softAP(softSsid,softPassword);


其中的第二個引數softPassword」便是上面範例程式第7行所定義的常數變數:


const char* softPassword = "12345678";


使用者可依自己的需要去改變它,不過要記的密碼的長度至少要8個字元以上,而且最長不能超過63個字元


下面是這個範例程式的完整列表




// soft AP 範例一:將ESP8266設定為AP存取點功能,並顯示已連接站點(STA)裝置的數目

 

#include  <ESP8266WiFi.h> // 引入ESP8266的WiFi函式庫

 

String softSsid = "ESP_softAP01"; // 設定主要的SSID名稱

String softSsidChip = "ESP"+String(ESP.getChipId());// 設定使用ESP8266晶片序號的SSID名稱

const char* softPassword = "12345678"; // 設定AP存取點的密碼

 

void setup() {

  // 

  Serial.begin(115200); // 初始化序列監控視窗的傳輸速率

  Serial.println();

  Serial.print("Current WiFi mode is : ");

  Serial.println(WiFi.getMode()); //顯示目前ESP8266的WiFi工作模式

  Serial.println("Setting soft-AP ... ");

  boolean result=WiFi.softAP(softSsid); // 初始化設定AP存取點功能

  if(result==true) // 測試是否成功

  { // 初始化設定AP存取點成功

    Serial.println("soft-AP ready!");

    Serial.print("softAP = ");

    Serial.println(softSsid); // 

    Serial.print("softIP = ");

    Serial.println(WiFi.softAPIP()); // 顯示本地伺服器的預設IP位址

  }  

  else

    Serial.println("soft-AP failed");

}

 

void loop() {

  // 每隔3秒讀取一次已連線上的無線WiFi裝置數目,並顯示在Arduino IDE序列監控視窗中

  Serial.printf("Stations connectet = %d\n",WiFi.softAPgetStationNum());

  delay(3000);

}

程式名稱:softAP0_connectCount.ino


◎執行結果:

在編輯完上列的程式後,點擊Arduino IDE左上方驗證』(Verify)按鈕符號Arduino vef,執行編譯(Compiling)的動作看程式是否正確無誤?如果沒有問題,再點擊另一個上傳』(Upload) 按鈕符號Arduino upl,按下它便會連續執行編譯載入(即燒錄) 兩個動作。如果對這些過程還是不太熟悉,可以回到前面《三、3 Arduino IDE與ESP8266模組板連接測試》的章節再去了解一下。

如果程式燒錄成功,我們便可在電腦上的Arduino IDE串列監控視窗中看到類似【圖六、1】的內容,其中標記2便是們在ESP8266上所建立的AP存取點[SSID],名稱為「ESP_softAP01」;而標記3則是系統預設的本地伺服器(Server)之IP位址:[ 192.168.4.1 ];至於標記4則是系統在每隔3秒之後,所偵測到已經連線到這個AP存取點的無線WiFi裝置數目值。前面說過如果我們如果在程式中程式沒有使用到『WiFi.mode()』這個函式,那麼系統會預設為同時開啟了AP存取點與站點兩種功能模式,所以在程式的第14行呼叫『WiFi.getMode()』這個函式時,會傳回'3'這個結果,代表目前ESP8266式工作在「WIFI_AP_STA」模式,這也就是【圖六、一】中標記1內容的意義。

圖六1 softAP初始化成功後串列埠監控視窗內容


當程式上傳成功之後,啟動手機或平板電腦的WiFi功能,便可以看到【圖六、2】這個掃描與連線畫面,使用者只要直接點選「ESP_softAP01」這個WiFi熱點去連線,就可看到【圖六、一】中標記4裡面的無線WiFi裝置數目值隨之增加,當然在切斷連線之後數目值也會跟著減少;如果沒有特地去設定可連線裝置的數目值的話(最多可以到8個),只能有4個裝置可以同時連上這個ESP8266的AP存取點。

圖六2 手機/平板/筆電WiFi掃描與連線畫面


六、2-2 以固定伺服器IP位址建立軟體存取點(AP)

在前面的範例中我們是以系統預設的網路IP位址(192.168.4.1)作為AP存取點內定伺服器的本地IP位址如果我們想提高隱密性與安全性可以用下面這個函式去更改預設伺服器的本地IP位址


WiFi.softAPConfig(local_IP,gateway,subnet);


這個函數會使用到三個引數,其意義如下:

1﹒local_IP:新的本地伺服器IP位址,一般必須以「192.168.XXX.XXX」開始。

2﹒gateway:新的本地伺服器閘道位址

3﹒subnet:新的本地伺服器遮罩位址一般都是用「255.255.255.0」


範例程式功能與動作說明:

1、以ESP8266建立一無線WiFi存取點,SSID名稱為”ESP”+「XXXXXX」,其中的「XXXXXX」為ESP8266內部的6位數晶片內碼,不使用密碼。

2、本地伺服器(Server)的IP位址設定為:[ 192.168.0.100 ]。

3、此AP存取點每隔3秒檢查一次目前已連線的無線WiFi裝置數目,並顯示在電腦上的Arduino IDE序列監控視窗中。


程式說明與列表

本範例和上一個上差不多主要差異是我們將此AP存取點的[SSID]名稱改成「ESP」加上這顆ESP8266的內建晶片ID號碼(第7行)


7. String softSsid = "ESP"+String(ESP.getChipId());


此外也將這個AP存取點內定伺服器的本地IP位址11~13這幾行程式設定了「WiFi.softAPConfig(t)」這個函式所需要的三種參數,最主要的就是新的本地IP位址:[ 192.168.0.100 ],然後在第20行呼叫這個函式完成設定的動作


20.   WiFi.softAPConfig(local_IP,gateway,subnet); // 設定新的本地IP位址


在接著的21程式在呼叫WiFi.softAP()這個函式時將使用的SSID引數內容改成了softSsidChip」這個字串變數:


21.  boolean result=WiFi.softAP(softSsidChip);   // 


程式主迴圈(loop())部分的功能和上一個範例相同,也就是會在每隔3秒之後檢查一次目前已連線的無線WiFi裝置數目並將結果顯示在電腦上的Arduino IDE序列監控視窗中。。


以下是這個範例程式的全文:

 

//   soft AP 範例二:將ESP8266設定為AP存取點功能,並顯示已連接站點(STA)裝置的數目;

//   此外將SSID名稱設定為"ESP"+晶片的內建編號,並設定新的本地IP(192.168.0.100)

 

#include  <ESP8266WiFi.h> // 引入ESP8266專用的WiFi函式庫

 

String softSsid = "ESP_softAP01";

String softSsid = "ESP"+String(ESP.getChipId()); // 設定本機AP存取點的SSIS名稱為

// “ESP”加上晶片的ID號碼

const char* softPassword = "12345678"; // 設定本機AP存取點的密碼為:”12345678”

 

IPAddress local_IP(192,168,0,100); // 設定新的伺服器IP位址

IPAddress gateway(192,168,0,1); // 設定新的伺服器閘道位址

IPAddress subnet(255,255,255,0); // 設定新的伺服器網路遮罩位址

 

void setup() {

  // 

  Serial.begin(115200);

  Serial.println();

  Serial.print("Setting soft-AP ... ");

  WiFi.softAPConfig(local_IP,gateway,subnet); // 設定新的本地IP位址

  boolean result=WiFi.softAP(softSsidChip);   // 以"ESP_"+晶片內建編號為SSID的名稱

  if(result==true)

  {  // 初始化設定AP存取點成功

    Serial.println("soft-AP ready!");

    Serial.print("softAP = "); // 在Arduino IDE串列監控視窗中顯示目前

    Serial.println(softSsidChip);       // 設定的SSID名稱

    Serial.print("softIP = "); // 在Arduino IDE串列監控視窗中顯示目前使用的

    Serial.println(WiFi.softAPIP()); // 本地IP位址在此為[ 192.168.0.100 ]

  }  

  else

    Serial.println("soft-AP failed");

}

 

void loop() {

  // 每隔3秒讀取一次已連線上的無線WiFi裝置數目,並顯示在Arduino IDE序列監控視窗中

  Serial.printf("Stations connectet = %d\n",WiFi.softAPgetStationNum());

  delay(3000);

}



程式名稱:softAP0_connectCount2_FixIP.ino


◎ 執行結果:

在程式上傳燒錄成功後,我們可在Arduino IDE串列監控視窗中看到類似【圖六、3】的內容,其中標記1便是們在ESP8266上所建立的AP存取點的[SSID]名稱,這時名稱已經變成「ESP1417809」,其中在「ESP」後面的數字「1417809」便是這顆ESP8266的內建晶片ID號碼;而標記2則是新的系統本地伺服器(Server)的IP位址:[ 192.168.0.100 ];至於標記3則是系統在每隔3秒之後,ESP8266偵測到已經連線到這個AP存取點的無線WiFi裝置數目值。整個範例程式的功能與上一個差不多,只更改了[SSID]的名稱,和設定了新的伺服器(Server)的本地IP位址而已。


圖六、3  以晶片ID編號及固定伺服器IP初始化成功後串列埠監控視窗內容




沒有留言:

張貼留言