美文网首页iOS、Swift
SFNote-iOS开发WiFi项目

SFNote-iOS开发WiFi项目

作者: Jack1105 | 来源:发表于2020-06-23 16:46 被阅读0次
    image
    关键词:wifi,AP,STA,SSID,BSSID,Hotspot

    概述

    一个偶然的机会接触到一个WiFi应用,主要是对接一个wifi摄像头。摄像头设备开机创建一个无线网络(相当于热点),手机/iPad 打开App连接到设备的wifi,通过App界面上的操作来控制摄像头的拍照、录制,同时也有些文件的下载等功能。

    一、WiFi的STA和AP模式是什么?

    1):AP

    也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就一个AP。

    image

    2):STA站点

    每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。

    image

    站点(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)权限配置

    image
    image
    image
    image

    简单的三步,便开启了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

    相关文章

      网友评论

        本文标题:SFNote-iOS开发WiFi项目

        本文链接:https://www.haomeiwen.com/subject/memhfktx.html