SFNote-iOS開發WiFi專案
wifi
,AP
,STA
,SSID
,BSSID
,Hotspot
概述
一個偶然的機會接觸到一個WiFi應用,主要是對接一個wifi攝像頭。攝像頭裝置開機建立一個無線網路(相當於熱點),手機/iPad 開啟App連線到裝置的wifi,通過App介面上的操作來控制攝像頭的拍照、錄製,同時也有些檔案的下載等功能。
一、WiFi的STA和AP模式是什麼?
1):AP
也就是無線接入點,是一個無線網路的建立者,是網路的中心節點。一般家庭或辦公室使用的無線路由器就一個AP。
2):STA站點
每一個連線到無線網路中的終端(如膝上型電腦、PDA及其它可以聯網的使用者裝置)都可稱為一個站點。
站點(STA,Station)在無線區域網(WLAN,WirelessLocalAreaNetworks)中一般為客戶端,可以是裝有無線網路卡的計算機,也可以是有WiFi模組的智慧手機,可以是移動的,也可以是固定的。在無線環境中STA接入的過程包括:認證STA有沒有許可權和接入點(AP,AccessPoint)建立鏈路;STA能不能接入WLAN;以及STA接入WLAN網路之後,認證STA能不能訪問網路的許可權。
在STA和AP建立鏈路的過程中,當STA通過信標(Beacon)幀或探測響應(Proberesponse)幀掃描到可接入的服務集識別符號(SSID,ServiceSetIdentifier)後,會根據已接收到的Beacon幀或Proberesponse幀的訊號強度指示(RSSI,ReceivedSignalStrengthIndication)來選擇合適的SSID進行接入。
AP(Access Point):
無線接入點,這個概念特別廣,在這裡,用大白話說,你可以把CC3200當做一個無線路由器,這個路由器的特點不能插入網線,沒有接入Internet,只能等待其他裝置的連結,並且智慧接入一個裝置。類似於點對點模式啦。
STA(Station):任何一個接入無線AP的裝置都可以稱為一個站點。大白話說也就是平時接入路由器的裝置
SSID(Service Set Identifier):
SSID,每個無線AP都應該有一個標示用於使用者識別,SSID就是這個用於使用者識別的的名字,也就是我們經常說到的wifi名。
BSSID:
每一個網路裝置都有其用於識別的實體地址,這個東西呢就叫MAC地址,這個東西一般情況下出廠會有一個預設值,可更改,也有其固定的命名格式,也是裝置識別的識別符號。這個BSSID呢是針對裝置說的,對於STA的裝置來說,拿到AP接入點的MAC地址就是這個BSSID。
ESSID:
是一個比較抽象的概念,它實際上就和ssid相同(本質也是一串字元),只是能如果有好幾個無線路由器都叫這個名字,那麼我們就相當於把這個ssid擴大了,所以這幾個無線路由器共同的這個名字就叫ESSID。(也就是如果在一臺路由器上釋放的wifi訊號叫某個名字如“China_CMCC”,這個名字“China_CMCC”就稱為SSID;如果在好幾個路由器上都釋放了這個wifi訊號,那麼大家都叫“China_CMCC”,這個時候大家都遵循的這個名字就是ESSID
舉個例子,一家公司面積比較大,安裝了若干臺無線接入點(AP或者無線路由器),公司員工只需要知道一個SSID就可以在公司範圍內任意地方接入無線網路。BSSID其實就是每個無線接入點的MAC地址。當員工在公司內部移動的時候,SSID是不變的。但BSSID隨著你切換到不同的無線接入點,是在不停變化的。
用戲稱來說,bssid就是具體的某個連鎖店編號(001)或地址,ssid就是連鎖店的名字或者照片,essid就是連鎖店的總公司或者招牌or品牌。一般ssid和essid都是相同的。
RSSI:
這個理解起來更簡單,就是通過STA掃描到AP站點的訊號強度。
二、iOS自動連線WiFi
通過Wi-Fi來控制裝置,iOS11前只能跳轉到系統設定介面手動連線Wi-Fi,iOS11之後蘋果提供 NEHotspotConfiguration ,NEHotspotConfigurationManager 類直連周邊Wi-Fi。
1)許可權配置
簡單的三步,便開啟了Hotspot許可權。
並且,在Build Phase -> link Binary With Libraries 中,也已經自動添加了NetworkExtension.framework。
2)加入WiFi
#import <NetworkExtension/NetworkExtension.h>
// 獲取加入過的wifi列表
- (void)getJoinedWifiList{
if (@available(iOS 11.0,*)) {
[[NEHotspotConfigurationManager sharedManager] getConfiguredSSIDsWithCompletionHandler:^(NSArray<NSString *> * array) {
if (array && array.count > 0) {
UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"連線裝置" message:@"請選擇要連線的裝置" preferredStyle:(UIAlertControllerStyleActionSheet)];
for (NSString * str in array) {
UIAlertAction *action = [UIAlertAction actionWithTitle:str style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
[self joinWifiWithSSID:str pwd:@"123456"];
}];
[alertC addAction:action];
}
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleDestructive) handler:^(UIAlertAction * _Nonnull action) {
}];
[alertC addAction:cancel];
[self presentViewController:alertC animated:YES completion:nil];
}
}];
} else {
// Fallback on earlier versions
}
}
// 加入WiFi
- (void)joinWifiWithSSID:(NSString *)ssid pwd:(NSString *)pwd {
if (@available(iOS 11.0,*)) {
NEHotspotConfiguration *hotspotConfig = [[NEHotspotConfiguration alloc] initWithSSID:ssid passphrase:pwd isWEP:NO];
hotspotConfig.joinOnce = YES; // 預設是NO,會保留配置過的wifi,YES即是不儲存
// 開始連線 (呼叫此方法後系統會自動彈窗確認)
[[NEHotspotConfigurationManager sharedManager] applyConfiguration:hotspotConfig completionHandler:^(NSError * _Nullable error) {
NSLog(@"%@",error);
if (error && error.code != 13 && error.code != 7) {
NSLog(@"連線失敗");
}else if(error.code ==7){//error code = 7 :使用者點選了彈框取消按鈕
NSLog(@"使用者點選了彈框取消按鈕");
}else{// error code = 13 :已連線
NSLog(@"已連線");
}
}];
} else {
// Fallback on earlier versions
}
}
複製程式碼