配网 SDK
更新时间:2019-01-03 16:12:26
概述
提供了把 WiFi 设备配置上家庭路由器以及局域网内已联网设备的发现能力,具体方案包括一键广播配网、手机热点配网、智能路由器配网以及设备间相互配网等。
依赖SDK | 概述 |
---|---|
日志 | 基础依赖SDK,提供客户端统一日志打印,日志等级控制,分模块日志隔离等能力 |
API 通道 | 提供API通道能力,和基础环境配置信息 |
初始化
配网SDK 的初始化依赖 API 通道的初始化,请参见:API 通道 - 初始化
使用说明
设备发现
提供获取局域网内已经配网的设备,包括 WiFi 设备以及以太网设备,以及局域网内已上电的待配设备(前提是当前局域网内内已经有一个已配好网的智能设备,且该设备支持未待配设备进行配网的能力)。
启动发现设备
发现本地的已配网设备,或者已配网设备、路由器发现的待配设备。发现的待配设备信息可以作为后续设备配网的入参信息。
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
// 本地发现入口
[[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
if (devices && [devices count] > 0) {
IMSLifeLogVerbose(@"发现本地设备: %@", devices);
// 将与用户没有绑定关系的设备显示在本地发现设备中
for (IMLCandDeviceModel *device in devices) {
if (![self checkBindWithLocalDevice:device]) {
[wSelf.localDeviceList addObject:device];
}
}
[wSelf.tableView reloadData];
} else if (err) {
IMSLifeLogError(@"本地发现设备出错: %@", err);
}
}];
获取所有已发现设备
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
NSArray *allLanDevicesArray = [kLKLocalDeviceMgr getLanDevices];
终止发现设备
停止发现本地已配和线上待配设备,调用该接口会清除已发现设备列表,确保和startDiscovery成对调用。
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
// 停止发现设备
[kLKLocalDeviceMgr stopDiscovery];
通用配网流程
设置待添加设备信息
待添加设备信息来源可以为上面本地发现的待配设备,也可以通过扫码等其他途径获取待配设备信息
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
// 选取本地发现的待配设备
IMLCandDeviceModel *model = self.localDeviceList[index];
[kLkAddDevBiz setDevice:model];
备注:其中(IMLCandDeviceModel *)model 为本地发现待配设备或者云端拉取产品列表组装的model
本地发现设备参见:本文下面 设备发现 章节内容
其中 IMLCandDeviceModel 属性说明:
属性 | 类型 | 是否必选 | 描述 | 备注 |
---|---|---|---|---|
productKey | NSString | 是 | 设备productKey | |
deviceName | NSString | 否 | 设备名称 | |
linkType | assign | 否 | 指定配网方式 |
设置配网模式
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
[kLkAddDevBiz setAliProvisionMode:ForceAliLinkTypeHotspot];
开始设备配网
上述设置好待添加设备信息,进入配网。调用 startAddDevice 接口进入配网流程,并实现监听的协议方法
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
[kLkAddDevBiz startAddDevice:self];
其中 self 为配网过程中 notifier 监听回调对象(代理)
- (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
{
NSLog(@"notifyPrecheck callback err : %@", err);
dispatch_async(dispatch_get_main_queue(), ^{
[self.addVC notifyProgress:LKAddStatePrechecking result:nil withError:err];
});
}
// 用户引导页(一键配网和热点配网会有相关回调,指引用户接入相关操作)
- (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
{
NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode);
if(guideCode == LKPGuideCodeOnlyInputPwd){
// TODO:一键广播配网相关引导
} else if(guideCode == LKPGuideCodeWithUserGuide){
// TODO:热点配网相关引导
}
}
-(void)notifyProvisioning
{
NSLog(@"notifyProvisioning callback(正在进行配网...) ");
}
- (void)notifyProvisionStatus:(LKProvisonStatus)provisionStatus boolSuccess:(BOOL)boolSuccess;
{
NSLog(@"notifyProvisionStatus callback provisionStatus:%d boolSuccess:%d", provisionStatus, boolSuccess);
if(provisionStatus == LKProvisonStatusSwitchAP){
// 设备回复 switch ap 请求,提示用户切换回之前的 wifi
NSLog(@"请立即切换回开启热点之前的 wifi 网络");
}
}
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
{
NSLog(@"配网成功:%@",candDeviceModel);
}
输入配网 wifi 名称以及密码信息
在收到 - (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode 回调引导完成相关操作(一键广播指引用户输入 ssid 和密码,热点配网指引用户开启热点,输入 ssid 和密码等)后,调用 - (void)toggleProvision:(NSString )ssid pwd:(NSString )pwd timeout:(int)timeout 方法,传入 WiFi 的 ssid 及 password 信息。 注:一键广播配网和热点配网才会有 notifyProvisionPrepare 回调。
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
- (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
{
NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode);
[self inputSsidAndPassword];
}
- (void)inputSsidAndPassword
{
NSSstring *ssid = @"example ssid";
NSString *password = @"1qaz@WSX";
NSInterger timeout = 60;(单位秒,s);
[kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
}
配网过程关键节点监听处理
针对热点配网必须监听该回调
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
- (void)notifyProvisionStatus:(LKProvisonStatus)provisionStatus boolSuccess:(BOOL)boolSuccess;
{
NSLog(@"notifyProvisionStatus callback provisionStatus:%d boolSuccess:%d", provisionStatus, boolSuccess);
if(provisionStatus == LKProvisonStatusSwitchAP){
// 设备回复 switch ap 请求,提示用户切换回之前的 wifi
NSLog(@"请立即切换回开启热点之前的 wifi 网络");
}
}
配网结果监听
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
{
if(candDeviceModel != nil){
NSLog(@"配网成功:%@",candDeviceModel);
} else{
NSLog(@"配网失败,错误信息:%@", provisionError);
}
}
停止配网
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
[kLkAddDevBiz stopAddDevice];
设备绑定
当完成设备配网之后,后续需要将设备与用户或者与家庭做一个关联绑定,在绑定的时候需要调用 SDK 的获取 token方法,取得设备token,然后进行设备绑定。获取token:
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
// 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失败(超时)");
}
}];
使用配网插件
配网插件基于Bone容器实现了完整的配网逻辑,因此在接入Bone容器的前提下,可以直接打开配网插件来完成配网逻辑,然后再自行处理配网之后的逻辑;
目前配网插件Id为:
插件Id 国内版:a123kfz2KdRdrfYc
插件Id 国际版:a223c2beCJQ2Xpk2
插件Id的具体使用方式,参考见Bone容器部分。也可以参考下面文档对应的调用平台提供的配网插件部分