蓝牙辅助配网可以让手机App将WiFi热点信息通过蓝牙传递给设备,配网错误信息也可以通过蓝牙通道反馈给手机用户来定位问题。若您希望通过iOS系统对您的设备使用蓝牙进行配网,请根据本文档进行功能的开发。

前提条件

已完成控制台上产品开发工作,以及蓝牙辅助配网的设备端开发,请参见设备端开发

操作步骤

  1. 创建一个自有App,详细操作请参见创建自有App
  2. 选择下面任一方式获取SDK。
    • 从控制台下载并集成SDK(需勾选配网套餐包),请参见下载并集成SDK
    • 在App工程中更新如下代码。
      # SDK最低支持版本为iOS 9.0 
      platform :ios, '9.0' 
      
      # github官方pod源
      source 'https://github.com/CocoaPods/Specs.git' 
      
      # 阿里云pod源
      source 'https://github.com/aliyun/aliyun-specs.git' 
      
      # 需要替换下述"IMSDemoApp"为开发者App的target名称 
      target "IMSDemoApp" do 
      
        ...
      
        # 配网SDK依赖
        pod 'IMSDeviceCenter', '1.11.5'
      
        # 蓝牙SDK依赖
        pod 'IMSBreezeSDK', '1.6.9'
      
        ...
      
      end
  3. 初始化SDK。
    蓝牙辅助配网依赖和云端的交互,在调用配网SDK之前需要先完成SDK初始化,可参见SDK初始化(API网关接口使用示例请参见API通道SDK)。
  4. (可选)开发设备发现。
    设备发现接口提供发现附近的蓝牙辅助配网、零配、设备热点配网的待配设备和局域网已配设备的能力。这里介绍蓝牙辅助配网,示例代码会只选发现蓝牙辅助配网待配设备。
    说明 WiFi&BLE Combo蓝牙模块广播的subType必须设置为2(表示蓝牙WiFi双模设备),才能保障设备被蓝牙辅助配网方式发现。
    // 引入头文件
    #import <IMLDeviceCenter/IMLDeviceCenter.h>
    
    // 本地发现入口
    [[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
            //devices 为 IMLCandDeviceModel 对象array,
            // 可根据 IMLCandDeviceModel 中的 devType 区分待配网设备联网类型:
            // devType 为@"ble_subtype_2" 代表蓝牙辅助配网设备*/
        }];
  5. 开发设备配网。
    // 引入头文件
    #import <IMLDeviceCenter/IMLDeviceCenter.h>
    
    
    /**
     * 第一步 设置待添加设备信息
     * 包含设备的productKey、productId信息
     * 配网的信息可以通过上面的发现接口来获取,也可以直接通过扫码的方式拿到配网所需要的信息开始配网。
     * 不是通过发现接口进行蓝牙辅助配网的需要确保当前确实有进入配网状态的combo设备,并能被发现。
    */
    
    // 自行创建待配设备信息
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    // 商家后台注册的 productKey,不可为空
    model.productKey = @"xxxx"; 
    // 产品 ID, 蓝牙辅助配网必须
    model.productId = @"xxx";
    // 设置为蓝牙辅助配网模式
    model.linkType = ForceAliLinkTypeBLE;
    //设置待添加设备的基本信息
    [kLkAddDevBiz setDevice:model];
    
    
    /**
     * 第二步 开始配网
     * 设置配网信息回调
    */
    //其中 self 为配网过程中 notifier 监听回调对象(代理)
    [kLkAddDevBiz startAddDevice:self];
    
    - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
    {
        NSLog(@"notifyPrecheck callback err : %@", err);
    }
    
    // 用户引导页(一键配网和热点配网会有相关回调,指引用户接入相关操作)
    
    - (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
    {
        NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode);
        if(guideCode == LKPGuideCodeOnlyInputPwd){
            // 输入WiFi及密码相关引导,执行第三步
            /**
             * 第三步 设置 Wi-Fi 信息
             * 设置需要设备连接的 Wi-Fi 的ssid、password、配网超时时间信息
            */
            // 需要设备连接的 Wi-Fi ssid,一般为当前 Wi-Fi
            NSSstring *ssid = @"example ssid";
            // 需要设备连接的 Wi-Fi password,一般为当前 Wi-Fi
            NSString *password = @"1qaz@WSX";
            NSInterger timeout = 60;(单位秒,s);//单位秒 目前最短只能设置60S
    
            [kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
        }
    }
    
    -(void)notifyProvisioning 
    {
        NSLog(@"notifyProvisioning callback(正在进行配网...) ");
    }
    
    /**
     通知上层UI:配网完成结果回调
    
     @param candDeviceModel 配网结果设备信息返回:配网失败时为 nil
     @param provisionError 错误信息
     */
    
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配网结果:%@",candDeviceModel);
        /**
         * 第四步 接收配网结果
        */
        if(candDeviceModel != nil){
            NSLog(@"配网成功:%@",candDeviceModel);
        } else{
            NSLog(@"配网失败,错误信息:%@", provisionError);
        }
    
        // 配网结果 如果配网成功之后包含token,请使用配网成功带的token做绑定
    }
  6. 获取设备绑定Token。

    获取设备绑定Token需要productKey、deviceName、超时时间、轮询间隔。该接口提供从设备端获取绑定token的功能。配网SDK不包含绑定的逻辑,实现绑定逻辑可参见配网服务中的“基于token方式绑定设备”。

    // self.productKey 和 self.deviceName 是配网成功后返回的设备模型中的 productKey 和 deviceName
    [[IMLLocalDeviceMgr sharedMgr] getDeviceToken:self.productKey deviceName:self.deviceName timeout:20 resultBlock:^(NSString *token, BOOL boolSuccess) {
        NSLog(@"主动获取设备token:%@,boolSuccess:%d", token, boolSuccess);
        if(token){
        // 调用绑定接口进行设备绑定
        } else{
            NSLog(@"获取token失败(超时)");
        }
    }];