SFNote-iOS开发WiFi项目

3,440 阅读5分钟

关键词: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