wifi
,
AP
,
STA
,
SSID
,
BSSID
,
Hotspot
一個偶然的機會接觸到一個WiFi應用,主要是對接一個wifi攝像頭。攝像頭設備開機建立一個無線網絡(至關於熱點),手機/iPad 打開App鏈接到設備的wifi,經過App界面上的操做來控制攝像頭的拍照、錄製,同時也有些文件的下載等功能。
bash
1):AP
也就是無線接入點,是一個無線網絡的建立者,是網絡的中心節點。通常家庭或辦公室使用的無線路由器就一個AP。網絡
2):STA站點
每個鏈接到無線網絡中的終端(如筆記本電腦、PDA及其它能夠聯網的用戶設備)均可稱爲一個站點。app
站點(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進行接入。less
AP(Access Point):
無線接入點,這個概念特別廣,在這裏,用大白話說,你能夠把CC3200當作一個無線路由器,這個路由器的特色不能插入網線,沒有接入Internet,只能等待其餘設備的連接,而且智能接入一個設備。相似於點對點模式啦。 STA(Station):任何一個接入無線AP的設備均可以稱爲一個站點。大白話說也就是平時接入路由器的設備post
SSID(Service Set Identifier):
SSID,每一個無線AP都應該有一個標示用於用戶識別,SSID就是這個用於用戶識別的的名字,也就是咱們常常說到的wifi名。ui
BSSID:
每個網絡設備都有其用於識別的物理地址,這個東西呢就叫MAC地址,這個東西通常狀況下出廠會有一個默認值,可更改,也有其固定的命名格式,也是設備識別的標識符。這個BSSID呢是針對設備說的,對於STA的設備來講,拿到AP接入點的MAC地址就是這個BSSID。spa
ESSID:
是一個比較抽象的概念,它實際上就和ssid相同(本質也是一串字符),只是能若是有好幾個無線路由器都叫這個名字,那麼咱們就至關於把這個ssid擴大了,因此這幾個無線路由器共同的這個名字就叫ESSID。(也就是若是在一臺路由器上釋放的wifi信號叫某個名字如「China_CMCC」,這個名字「China_CMCC」就稱爲SSID;若是在好幾個路由器上都釋放了這個wifi信號,那麼你們都叫「China_CMCC」,這個時候你們都遵循的這個名字就是ESSID.net
舉個例子,一家公司面積比較大,安裝了若干臺無線接入點(AP或者無線路由器),公司員工只須要知道一個SSID就能夠在公司範圍內任意地方接入無線網絡。BSSID其實就是每一個無線接入點的MAC地址。當員工在公司內部移動的時候,SSID是不變的。但BSSID隨着你切換到不一樣的無線接入點,是在不停變化的。3d
用戲稱來講,bssid就是具體的某個連鎖店編號(001)或地址,ssid就是連鎖店的名字或者照片,essid就是連鎖店的總公司或者招牌or品牌。通常ssid和essid都是相同的。code
RSSI:
這個理解起來更簡單,就是經過STA掃描到AP站點的信號強度。
經過Wi-Fi來控制設備,iOS11前只能跳轉到系統設置界面手動鏈接Wi-Fi,iOS11以後蘋果提供 NEHotspotConfiguration ,NEHotspotConfigurationManager 類直連周邊Wi-Fi。
簡單的三步,便開啓了Hotspot權限。
而且,在Build Phase -> link Binary With Libraries 中,也已經自動添加了NetworkExtension.framework。
#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
}
}
複製代碼