1. 配网业务包
1.1. 功能介绍
业务功能涵盖了目前涂鸦智能的 Wi-Fi 设备、ZigBee 设备、蓝牙设备、支持二维码扫码的设备(例如 GPRS & NB-IoT 设备)等不同类型的设备配网前置操作引导和具体入网激活实现
1.1.1. 1、Wi-Fi 设备配网
支持 Wi-Fi 智能设备入网连接云服务,Wi-Fi 设备配网主要有 EZ 模式和 AP 模式两种,其中 IPC 设备支持扫二维码方式配网
| 名词 | 说明 | 
|---|---|
| EZ 模式 | 又称快连模式,App 把配网数据包打包到802.11数据包的指定区域中,发送到周围环境;智能设备的 WiFi 模块处于混杂模式下,监听捕获网络中的所有报文,按照约定的协议数据格式解析出 App 发出配网信息包。 | 
| AP 模式 | 又称热点模式,手机作为 STA 连接智能设备的热点,双方建立一个 Socket 连接通过约定端口交互数据。 | 
| IPC 设备扫码配网 | 摄像头设备通过扫描 App 上的二维码获取配网数据信息 | 
1.1.2. 2、ZigBee 设备配网
支持 ZigBee 网关和子设备配网
| 名词 | 说明 | 
|---|---|
| ZigBee 网关 | 融合 ZigBee 网络中协调器和 Wi-Fi 功能的设备,负责 ZigBee 网络的组建及数据信息存储。 | 
| 子设备 | ZigBee 网络中的路由或者终端设备,负责数据转发或者终端控制响应。 | 
1.1.3. 3、蓝牙设备配网
涂鸦蓝牙有三条技术线路,主要包括 SingleBLE、SigMesh、TuyaMesh 以及双模设备
| 名词 | 说明 | 
|---|---|
| SingleBLE | 通过蓝牙与手机一对一相连的蓝牙单点设备 | 
| SigMesh | 采用蓝牙技术联盟发布的蓝牙拓扑通信 | 
| TuyaMesh | 采用涂鸦自研的蓝牙拓扑通信 | 
| 双模设备 | 支持多协议的设备,即同时具备 Wi-Fi 能力和 BLE 能力的设备 | 
1.1.4. 4、扫码配网设备
该类设备上电后即连接了涂鸦云服务,APP 通过扫描设备上的二维码(必须是涂鸦云服务支持的二维码规则,支持固件具体接入方式可咨询涂鸦科技相关商务及项目经理)使能设备去涂鸦云激活绑定
| 名词 | 说明 | 
|---|---|
| GPRS 设备 | 采用 GPRS 通信技术接入网络连接云服务的智能设备 | 
| NB-IOT 设备 | 采用窄带物联网( NarrowBand-Internet of Things )技术的智能设备 | 
1.1.5. 5、自动发现配网
融合涂鸦智能通用配网技术实现,为用户提供一套快捷配网的功能
1.2. 接入组件
在工程的 Podfile 文件中添加配网业务包组件,并执行 pod update 命令
source "https://github.com/TuyaInc/TuyaPublicSpecs.git"
source 'https://cdn.cocoapods.org/'
target 'your_target_name' do
  # 添加配网业务包
  pod 'TuyaSmartActivatorBizBundle'
end
注意
Wi-Fi  设备配网过程需要获取手机当前连接 Wi-Fi  名称,需要项目开启地位权限来获取 Wi-Fi  的名称,在 info.plist 中添加如下权限声明,创建 CLLocationManager 示例,并调用 requestWhenInUseAuthorization 方法。
NSLocationAlwaysAndWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
二维码扫码功能需要系统相机权限,需要在 info.plist 中添加以下声明
NSCameraUsageDescription
1.3. 自定义配置
1.3.1. 1、蓝牙配网功能
配网业务包支持 Wi-Fi  、蓝牙等类型的设备配网,其中蓝牙配网为可选项,如当前 App 不需要蓝牙配网功能 ,只需要将自定义 ty_custom_config.json 中的 needBle 属性设置为 false 即可
如果需要蓝牙配网功能,首先需要在项目的 info.Plist 文件中添加蓝牙权限的声明,设置 ty_custom_config.json 中的 needBle 属性设置为 true,然后需要在项目中添加以下依赖:
系统权限
NSBluetoothAlwaysUsageDescription
NSBluetoothPeripheralUsageDescription
配置项
{
    "config": {
        "appId": 123,    
        "tyAppKey": "xxxxxxxxxxxx", 
        "appScheme": "tuyaSmart",
        "hotspotPrefixs": ["SmartLife"], 
        "needBle": true //设置为 true 则表示支持蓝牙设备的配网
    },
   "colors":{
        "themeColor": "#FF5A28", 
    }
}
依赖
  pod 'TYBLEInterfaceImpl'
  pod 'TYBLEMeshInterfaceImpl'
  pod 'TuyaSmartBLEKit'
  pod 'TuyaSmartBLEMeshKit'
1.3.2. 2、设备热点名称设置
涂鸦设备热点前缀默认为 SmartLife , 若当前设备的热点前缀名称已修改,则需要在  ty_custom_config.json 文件中设置 hotspotPrefixs 属性,设置当前设备的热点前缀
{
    "config": {
        "appId": 123,    
        "tyAppKey": "xxxxxxxxxxxx", 
        "appScheme": "tuyaSmart",
        "hotspotPrefixs": ["SL"], // 修改支持的设备热点前缀为 SL
        "needBle": true
    },
   "colors":{
        "themeColor": "#FF5A28", 
    }
}
1.4. 服务协议
1.4.1. 提供服务
配网业务包实现 TYActivatorProtocol 协议以提供服务,在 TYModuleServices 组件中查看 TYActivatorProtocol.h 协议文件内容为:
#ifndef TYActivatorProtocol_h
#define TYActivatorProtocol_h
typedef NS_ENUM(NSUInteger, TYActivatorCompletionNode) {
    TYActivatorCompletionNodeNormal
};
@class TuyaSmartHome;
@protocol TYActivatorProtocol <NSObject>
/**
 * Start config
 * Goto device config list view 
 */
- (void)gotoCategoryViewController;
/**
 *  Obtain device information after each device connection
 *  @param node completion node, default TYActivatorCompletionNodeNormal
 *  @param custionJump default false, set true for process not need to jump to de device panel
 */
- (void)activatorCompletion:(TYActivatorCompletionNode)node customJump:(BOOL)customJump completionBlock:(void (^)(NSArray * _Nullable deviceList))callback;
@end
#endif /* TYActivatorProtocol_h */
若需要自定义配网品类/产品列表返回,需要实现 TYActivatorExternalExtensionProtocol 提供的协议方法
TYActivatorExternalExtensionProtocol
/**
 *  Back action form category View Controller
 *  Need to implement when additional operations are needed
 */
- (BOOL)categoryViewControllerCustomBackAction;
1.4.2. 依赖服务
配网业务包正常运行需要依赖  TYSmartHomeDataProtocol 这个协议提供的协议方法,调用业务包之前需要实现以下协议
TYSmartHomeDataProtocol
提供配网所需当前家庭信息
/**
 获取当前的家庭,当前没有家庭的时候,返回nil。
 @return TuyaSmartHome
 */
- (TuyaSmartHome *)getCurrentHome;
1.5. 使用指南
1.5.1. 注意事项
1、任何接口调用之前,务必确认用户已登录
2、调用配网业务包逻辑前,要先实现 TYSmartHomeDataProtocol 中的协议方法getCurrentHome
Objective-C 示例
#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYSmartHomeDataProtocol.h>
- (void)initCurrentHome {
    // 注册要实现的协议
    [[TuyaSmartBizCore sharedInstance] registerService:@protocol(TYSmartHomeDataProtocol) withInstance:self];
}
// 实现对应的协议方法
- (TuyaSmartHome *)getCurrentHome {
    TuyaSmartHome *home = [TuyaSmartHome homeWithHomeId:@"当前家庭id"];
    return home;
}
Swift 示例
import TuyaSmartDeviceKit
class TYActivatorTest: NSObject,TYSmartHomeDataProtocol{
    func test() {
        TuyaSmartBizCore.sharedInstance().registerService(TYSmartHomeDataProtocol.self, withInstance: self)
    }
    func getCurrentHome() -> TuyaSmartHome! {
        let home = TuyaSmartHome.init(homeId: 111)
        return home
    }
}
1.5.2. 进入配网
Objective-C 示例
#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYActivatorProtocol.h>
- (void)gotoDeviceConfig {
    id<TYActivatorProtocol> impl = [[TuyaSmartBizCore sharedInstance] serviceOfProtocol:@protocol(TYActivatorProtocol)];
    [impl gotoCategoryViewController];
    // 获取配网结果
    [impl activatorCompletion:TYActivatorCompletionNodeNormal customJump:NO completionBlock:^(NSArray * _Nullable deviceList) {
        NSLog(@"deviceList: %@",deviceList);
    }];
}
Swift 示例
let impl = TuyaSmartBizCore.sharedInstance().service(of: TYActivatorProtocol.self) as? TYActivatorProtocol
impl?.gotoCategoryViewController()
impl?.activatorCompletion(TYActivatorCompletionNodeNormal, customJump: false, completionBlock: { (evIdList:[Any]?) in
            print(devIdList ?? [])
        })
1.5.3. 自定义配网品类列表返回
Objective-C 示例
#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYActivatorExternalExtensionProtocol.h>
- (void)initCurrentHome {
    // 注册要实现的协议
    [[TuyaSmartBizCore sharedInstance] registerService:@protocol(TYActivatorExternalExtensionProtocol) withInstance:self];
}
// 实现对应的协议方法
- (BOOL)categoryViewControllerCustomBackAction {
    [self.navigationController popToRootViewControllerAnimated:YES];
    return YES;
}
Swift 示例
class TYActivatorTest: NSObject,TYActivatorExternalExtensionProtocol{
    func test() {
 TuyaSmartBizCore.sharedInstance().registerService(TYActivatorExternalExtensionProtocol.self, withInstance: self)
    }
    func categoryViewControllerCustomBackAction() -> Bool {
        self.navigationController?.popToRootViewController(animated: true)
        return true;
    }
}
1.6. 更新记录
- 2020.7.2 添加自定义配网品类/产品列表返回方法