快连模式

更新时间:2023-06-05 02:50:00下载pdf

Wi-Fi 快连配网又称 快连模式(Easy-Connect)、SmartConfig 或 EZ 配网。用户将手机连接到路由器后,利用路由器广播报文与设备进行通信配对。对用户操作简单,但对手机和路由器有兼容性要求,成功率低于 热点配网

配网流程

AppSDKDeviceService连上路由器Wi-Fi 灯快闪查询 Token查询 Token返回 Token返回 Token开始配网 ssid、pwd、token通过广播、组播循环发送 ssid、pwd、token捕捉到 ssid、password、token去激活设备激活成功激活成功激活成功AppSDKDeviceServiceWi-Fi 快连模式配网

在 iOS 14.5 及以上版本中,推荐您使用 热点模式(即 AP 模式) 代替 Wi-Fi 快连模式(即 EZ 模式)。主要原因如下:

  • 相比快连模式,热点模式成功率高、可靠性好,对手机和路由器有兼容性要求小。热点模式配网成功率高于快连模式。
  • 当 Xcode 升级至 12.5 版本后,编译出来的 App 无法在大于等于 14.5 版本的 iOS 系统的设备上发出快连配网的数据包。此时,App 需要额外开启一个 com.apple.developer.networking.multicast 的权限。这个权限需要向苹果额外申请,等审批通过后才能够使用。目前临时的解决方案是降低 Xcode 版本,但仍推荐使用 热点模式。

查询 Token

开始配网之前,SDK 需要在联网状态下从涂鸦查询配网 Token,然后才可以开始快连模式配网。Token 的有效期为 10 分钟,且配置成功后就会失效。再次配网时,需要重新查询 Token。

接口说明

- (void)getTokenWithHomeId:(long long)homeId
                   success:(ThingSuccessString)success
                   failure:(ThingFailureError)failure;

参数说明

参数 说明
homeId 设备将要绑定到的家庭的 ID
success 成功回调,返回配网 Token
failure 失败回调,返回失败原因

示例代码

Objc:

- (void)getToken {
        ThingSmartActivator *ezActivator = [[ThingSmartActivator alloc] init];
    [ezActivator getTokenWithHomeId:homeId success:^(NSString *token) {
        NSLog(@"getToken success: %@", token);
        // TODO: startConfigWiFi
    } failure:^(NSError *error) {
        NSLog(@"getToken failure: %@", error.localizedDescription);
    }];
}

Swift:

func getToken() {
    let ezActivator = ThingSmartActivator()
    ezActivator.getTokenWithHomeId(homeId, success: { token in
        print("getToken success: \(token)")
        // TODO: startConfigWiFi
    }, failure: { error in
        print("getToken failure: \(error.localizedDescription)")
    })
}

配网代理回调

接口说明

- (void)activator:(ThingSmartActivator *)activator didReceiveDevice:(ThingSmartDeviceModel *)deviceModel error:(NSError *)error;

参数说明

参数 说明
activator 配网使用 ThingSmartActivator 对象实例
deviceModel 配网成功时,返回此次配网的设备模型,失败时返回 nil
error 配网失败时,标示错误信息,成功时为 nil

开始配网

接口说明

- (void)startConfigWiFi:(ThingActivatorMode)mode
                   ssid:(NSString *)ssid
               password:(NSString *)password
                  token:(NSString *)token
                timeout:(NSTimeInterval)timeout;

参数说明

参数 说明
mode 配网模式
ssid Wi-Fi 名称
password Wi-Fi 密码
token 配网 Token
timeout 超时时间,默认 100 秒

示例代码

Objc :

- (void)startConfigWiFi:(NSString *)ssid password:(NSString *)password token:(NSString *)token {
    // 设置 ThingSmartActivator 的 delegate,并实现 delegate 方法
    self.ezActivator.delegate = self;

    // 开始配网,快连模式对应 mode 为 ThingActivatorModeEZ
    [self.ezActivator startConfigWiFi:ThingActivatorModeEZ ssid:ssid password:password token:token timeout:100];
}

- (ThingSmartActivator *)ezActivator {
    if (!_ezActivator) {
        _ezActivator = [[ThingSmartActivator alloc] init];
    }
    return _ezActivator;
}

#pragma mark - ThingSmartActivatorDelegate
- (void)activator:(ThingSmartActivator *)activator didReceiveDevice:(ThingSmartDeviceModel *)deviceModel error:(NSError *)error {

    if (!error && deviceModel) {
        //配网成功
    }

    if (error) {
        //配网失败
    }
}

Swift :


func startConfigWiFi(ssid: String, password: String, token: String) {
    // 设置 ThingSmartActivator 的 delegate,并实现 delegate 方法
    ezActivator.delegate = self

    // 开始配网,快连模式对应 mode 为 ThingActivatorModeEZ
    ezActivator.startConfigWiFi(.ez, ssid: ssid, password: password, token: token, timeout: 100)
}

lazy var ezActivator: ThingSmartActivator = {
    let activator = ThingSmartActivator()
    return activator
}()

// 实现 ThingSmartActivatorDelegate 协议方法
func activator(_ activator: ThingSmartActivator, didReceiveDevice deviceModel: ThingSmartDeviceModel?, error: Error?) {
    if let error = error {
        // 配网失败
        print("Config WiFi failed: \(error.localizedDescription)")
    } else if let deviceModel = deviceModel {
        // 配网成功
        print("Config WiFi success: \(deviceModel)")
    }
}

停止配网

开始配网操作后,App 会持续广播配网信息,直到配网成功,或者超时。如果需要中途取消操作或配网完成,请调用 [ThingSmartActivator stopConfigWi-Fi] 方法。

接口说明

- (void)stopConfigWiFi;

示例代码

Objc:

- (void)stopConfigWifi {
    self.ezActivator.delegate = nil;
    [self.ezActivator stopConfigWiFi];
}

Swift:

func stopConfigWifi() {
    ezActivator.delegate = nil
    ezActivator.stopConfigWiFi()
}