1. 程式人生 > Android開發 >SFNote-iOS開發WiFi專案

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
    }
}
複製程式碼
相關參考
  1. WiFi的STA和AP模式指什麼?
  2. iOS App無需跳轉系統設定自動連線Wi-Fi