设备入网

更新时间:2024-06-11 07:53:27下载pdf

添加蓝牙门锁设备

接口说明

- (void)activeBLELock:(ThingBLEAdvModel *)deviceInfo
               siteId:(long long)siteId
              success:(nullable void(^)(ThingSmartDeviceModel *deviceModel))success
              failure:(nullable ThingFailureHandler)failure;

参数说明

参数 说明
deviceInfo 搜索到的设备数据模型
siteId 站点 ID
success 成功回调
failure 失败回调

发现设备

设置代理,并且开始搜索设备。

    [ThingSmartBLEManager sharedInstance].delegate = self;
    [ThingSmartBLEManager.sharedInstance startListening:YES];

在回调中获取设备信息,并展示。

- (void)didDiscoveryDeviceWithDeviceInfo:(ThingBLEAdvModel *)deviceInfo {
    NSUInteger index = [self.dataArray indexOfObjectPassingTest:^BOOL(ThingBLEAdvModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        return [obj.uuid isEqualToString:deviceInfo.uuid];
    }];
    if (index != NSNotFound) {
        [self.dataArray replaceObjectAtIndex:index withObject:deviceInfo];
    } else {
        [self.dataArray addObject:deviceInfo];
    }
    [self.tableView reloadData];
}

开始配网

对搜索到的设备进行配网。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    ThingBLEAdvModel *deviceInfo = self.dataArray[indexPath.row];
    long long siteId = SiteManager.shared.siteId;
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    [ThingBLELockActivator.shared activeBLELock:deviceInfo
                                         siteId:siteId
                                        success:^(ThingSmartDeviceModel * _Nonnull deviceModel) {

    } failure:^{

    }];
}

停止配网

    [ThingSmartBLEManager sharedInstance].delegate = nil;
    [ThingSmartBLEManager.sharedInstance stopListening:YES];

添加蓝牙网关

蓝牙网关设备在设备激活过程中,用户需输入路由器的名称和密码。

接口说明

- (void)startConfigBLEWifiDeviceWithUUID:(NSString *)UUID
                                  homeId:(long long)homeId
                               productId:(NSString *)productId
                                    ssid:(NSString *)ssid
                                password:(NSString *)password
                                 timeout:(NSTimeInterval)timeout
                                 success:(ThingSuccessHandler)success
                                 failure:(ThingFailureHandler)failure;

参数说明

参数 说明
UUID 搜索到的设备的唯一识别 ID
homeId 站点 ID
productId 搜索到的设备的产品 ID
ssid Wi-Fi 的名称
password Wi-Fi 的密码
timeout 超时时间,单位是秒
success 成功回调
failure 失败回调

发现设备

开始搜索设备。

- (IBAction)searchClicked:(id)sender {
    ThingSmartBLEManager.sharedInstance.delegate = self;
    [ThingSmartBLEManager.sharedInstance startListening:YES];
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
}

在回调中处理数据,并展示搜索到的设备。

#pragma mark - ThingSmartBLEManagerDelegate

- (void)didDiscoveryDeviceWithDeviceInfo:(ThingBLEAdvModel *)deviceInfo {
    [MBProgressHUD hideHUDForView:self.view animated:YES];
    // 成功扫描到未激活的设备
    NSUInteger index = [self.dataArray indexOfObjectPassingTest:^BOOL(ThingBLEAdvModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        return [obj.uuid isEqualToString:deviceInfo.uuid];
    }];
    if (index != NSNotFound) {
        [self.dataArray replaceObjectAtIndex:index withObject:deviceInfo];
    } else {
        [self.dataArray addObject:deviceInfo];
    }
    [self.tableView reloadData];
}

开始配网

判断设备类型是否是蓝牙网关,提示用户输入 Wi-Fi 的名称和密码。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    ThingBLEAdvModel *deviceInfo = self.dataArray[indexPath.row];
    
    if (deviceInfo.bleType == ThingSmartBLETypeUnknow ||
        deviceInfo.bleType == ThingSmartBLETypeBLE ||
        deviceInfo.bleType == ThingSmartBLETypeBLEPlus ||
        deviceInfo.bleType == ThingSmartBLETypeBLESecurity ||
        deviceInfo.bleType == ThingSmartBLETypeBLEZigbee ||
        deviceInfo.bleType == ThingSmartBLETypeBLEBeacon) {
        [Alert showBasicAlertOnVC:self withTitle:@"Please use BLE Mode to pair" message:deviceInfo.uuid];
        return;
    }
    
    
    NSString *title = NSLocalizedString(@"", nil);
    
    UIAlertController *alertC = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
                                                           style:UIAlertActionStyleCancel
                                                         handler:NULL];
    
    [alertC addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.placeholder = @"ssid";
    }];
    [alertC addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.placeholder = @"password";
    }];
    
    UIAlertAction *confirmAction =[UIAlertAction actionWithTitle:NSLocalizedString(@"Confirm", nil)
                                                           style:UIAlertActionStyleDefault
                                                         handler:^(UIAlertAction * _Nonnull action) {
        NSString *ssid = alertC.textFields.firstObject.text;
        NSString *password = alertC.textFields.lastObject.text;
        [self startDualModeWithDevinfo:deviceInfo ssid:ssid password:password];
    }];
    
    [alertC addAction:cancelAction];
    [alertC addAction:confirmAction];
    [self presentViewController:alertC animated:YES completion:nil];
}

进行配网。

- (void)startDualModeWithDevinfo:(ThingBLEAdvModel *)deviceInfo ssid:(NSString *)ssid password:(NSString *)password {
    long long homeId = SiteManager.shared.siteId;
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    ThingSmartBLEWifiActivator.sharedInstance.bleWifiDelegate = self;
    [ThingSmartBLEWifiActivator.sharedInstance startConfigBLEWifiDeviceWithUUID:deviceInfo.uuid
                                                                         homeId:homeId
                                                                      productId:deviceInfo.productId
                                                                           ssid:ssid
                                                                       password:password
                                                                        timeout:100
                                                                        success:^{

    } failure:^{

    }];
}

配网是否成功回调。

#pragma mark - ThingSmartBLEWifiActivatorDelegate

- (void)bleWifiActivator:(ThingSmartBLEWifiActivator *)activator didReceiveBLEWifiConfigDevice:(ThingSmartDeviceModel *)deviceModel error:(NSError *)error {
    if (error) {
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        NSLog(@"%@", error);
        return;
    }
    
    NSString *name = deviceModel.name ?: NSLocalizedString(@"Unknown Name", @"Unknown name device.");
    NSLog(@"%@", name);
    [MBProgressHUD hideHUDForView:self.view animated:YES];
    [self.navigationController popViewControllerAnimated:YES];
    [NSNotificationCenter.defaultCenter postNotificationName:@"UpateDeviceList" object:nil];
}

停止配网

- (void)stopScan{

    ThingSmartBLEManager.sharedInstance.delegate = nil;
    [ThingSmartBLEManager.sharedInstance stopListening:YES];

    ThingSmartBLEWifiActivator.sharedInstance.bleWifiDelegate = nil;
    [ThingSmartBLEWifiActivator.sharedInstance stopDiscover];
}

在进行蓝牙网关设备配网时,需确保连接的 Wi-Fi 能够正常访问,且 Wi-Fi 需为 2.4 GHz 频段。

添加 Zigbee 有线网关

有线设备已通过网线连接着网络,设备激活过程中,用户无需输入路由器的名称和密码。

  1. 准备阶段
    引导用户,将设备重置到配网状态。

  2. 获取配网 Token
    App 通过调用 SDK 提供的接口,获取配网 Token。

  3. 获取设备信息
    App 通过调用 SDK 提供的 API,获取设备信息。

  4. 开始配网
    App 通过调用 SDK 提供的配网接口,设置配网参数,开始为设备配网。

  5. 完成配网
    配网完成后,App 会收到 SDK 的完成回调,结束配网流程。

发现设备

SDK 提供发现待配网有线设备的功能,获取设备前,手机需与设备接入同一网络。然后注册获取有线设备的通知,待 SDK 收到有线设备的广播即会通过通知转发设备信息。或者通过实现 ThingSmartActivator 的代理方法,获得设备信息。

转发通知

// 收到有线配网设备的广播后,会发送此通知。objec 为 dictionary,@{@"productId":productId, @"gwId":gwId}
extern NSString *const ThingSmartActivatorNotificationFindGatewayDevice;

发现设备代理回调接口说明

- (void)activator:(ThingSmartActivator *)activator didFindGatewayWithDeviceId:(nullable NSString *)deviceId productId:(nullable NSString *)productId;

发现设备代理回调参数说明

参数 说明
activator 配网使用 ThingSmartActivator 对象实例
deviceId 设备 ID
productId 产品 ID

获取 Token

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

接口说明

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

参数说明

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

示例代码

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

开始配网

接口说明

- (void)startConfigWiFiWithToken:(NSString *)token timeout:(NSTimeInterval)timeout

参数说明

参数 说明
token 配网 Token
timeout 超时时间

示例代码

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

    // 开始配网
    [self.wiredActivator startConfigWiFiWithToken:token timeout:100];
}

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

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

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

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

}

停止配网

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

接口说明

- (void)stopConfigWiFi;

示例代码

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

添加 Zigbee 门锁

子设备配网是指智能设备依赖于网关连接到涂鸦,例如 Zigbee 网关、蓝牙网关等。因此,子设备配网的过程必须具体到某个网关,由网关完成设备激活和消息通知。

接口说明

- (void)activeSubDeviceWithGwId:(NSString *)gwId timeout:(NSTimeInterval)timeout

参数说明

参数 说明
gwId 网关 ID
timeout 超时时间,单位秒

示例代码

开始配网

- (void)activeSubDevice {
    ThingSmartActivator.sharedInstance.delegate = self;
    [ThingSmartActivator.sharedInstance activeSubDeviceWithGwId:self.gwId timeout:100];
}

设备配网成功回调。

#pragma mark - ThingSmartActivatorDelegate
- (void)activator:(ThingSmartActivator *)activator didReceiveDevice:(ThingSmartDeviceModel *)deviceModel error:(NSError *)error {
    if (error || deviceModel == nil) {
        NSLog(@"%@", error);
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        return;
    }
    [ThingLockDevice activeCallbackWithSiteId:SiteManager.shared.siteId
                                       devIds:@[deviceModel.devId]
                                      success:^(id result) {
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        [self.navigationController popViewControllerAnimated:YES];
        [NSNotificationCenter.defaultCenter postNotificationName:@"UpateDeviceList" object:nil];
    } failure:^(NSError *error) {
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    }];
}

设备在配网成功后,还需要调用以下方法进行激活操作。

+ (void)activeCallbackWithSiteId:(long long)siteId
                          devIds:(NSArray<NSString *> *)devIds
                         success:(ThingSuccessID)success
                         failure:(ThingFailureError)failure;

停止激活子设备

接口说明

- (void)stopActiveSubDeviceWithGwId:(NSString *)gwId

参数说明

参数 说明
gwId 网关 ID

示例代码

- (void)stopActiveSubDevice {
    ThingSmartActivator.sharedInstance.delegate = nil;
    [ThingSmartActivator.sharedInstance stopActiveSubDeviceWithGwId:self.gwId];
}