接下來我們就以一個範例程式來說明如何在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)按鈕符號『』,執行『編譯』(Compiling)的動作,看程式是否正確無誤?如果沒有問題,再點擊另一個『上傳』(Upload) 按鈕符號『』,按下它便會連續執行『編譯』與『載入』(即燒錄) 兩個動作。如果對這些過程還是不太熟悉,可以回到前面《三、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初始化成功後串列埠監控視窗內容
沒有留言:
張貼留言