生活物联网平台已提供了一套完整的配网页面,如果您希望自己使用Native开发自己的定制化配网页面,可以阅读本文,使用配网SDK进行开发。
背景信息
配网SDK提供了把Wi-Fi设备配置上家庭路由器以及局域网内已联网设备的发现能力,具体方案包括一键广播配网(P2P)、手机热点配网、智能路由器配网和设备间相互配网(以下简称零配)等。各配网方式介绍参见Wi-Fi设备配网方案介绍和配网SDK。
设备热点配网
- 设置待配网设备信息。
- 选择配网方式。
设备热点支持指定产品型号productKey进行配网,也支持不指定型号直接开始配网(详细参见下方代码)。
获取产品型号productKey的方式如下。
- 通过直接调用云端接口获取产品列表(非配网SDK提供接口)或App直接展示产品列表,用户选择后确定待配设备productKey。
- 通过扫描产品二维码,获得设备ProductKey。
- 调用SDK setDevice设置待配信息。
- 开始配网。
指定配网方式linkType为ForceAliLinkTypeSoftap,并调用SDK startAddDevice接口开始配网。
- 配网中,处理回调信息。
配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssid和password。
- 监听配网结果。
/**
* 第一步:设置待配网设备信息
*/
//方式一:指定productKey方式
IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
model.productKey = @"xxxx";
model.linkType = ForceAliLinkTypeSoftap;
[kLkAddDevBiz setDevice:model];
//方式二:不指定型号
IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
model.protocolVersion = @"2.0";
model.linkType = ForceAliLinkTypeSoftap;
[kLkAddDevBiz setDevice:model];
//若希望自定义设备热点前缀,例如前缀为"demo_"
model.softApSsidPrefix = @"demo_";
/**
* 第二步:开始配网
*/
[kLkAddDevBiz startAddDevice:self];
#pragma mark - 回调方法
- (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
{
NSLog(@"notifyPrecheck callback err : %@", err);
}
/*
设备热点状态回调,根据不同状态进行提醒。
status 状态码
1=提示应该切换到设备热点;
2=已经切换到设备热点
3=已发送数据(dic里面会有"token")
4=应该切换回路由器
5=已经切换回路由器
*/
- (void)notifyProvisioningNoticeForSoftAp:(int)status withInfo:(NSDictionary *)dic
{
NSLog(@"notifyProvisioningNoticeForSoftAp,%d,%@",status,dic);
}
- (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
{
NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode);
if(guideCode == LKPGuideCodeWithUserGuideForSoftAp){
/**
* 第三步:提醒用户输入切换到设备热点,切换完成后调用toggleProvision,参考inputSsidAndPassword
*/
}
}
- (void)inputSsidAndPassword
{
NSSstring *ssid = @"example ssid";
NSString *password = @"1qaz@WSX";
NSInterger timeout = 60;(单位秒,s);
[kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
}
-(void)notifyProvisioning
{
NSLog(@"notifyProvisioning callback(正在进行配网...) ");
}
/**
* 第四步:监听结果回调
*/
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
{
NSLog(@"配网结果:%@",candDeviceModel);
}
蓝牙辅助配网
- 配网SDK版本。
确认Podfile依赖的配网SDK版本在 1.11.5及以上,并接入了蓝牙SDK。
# 配网SDK依赖
pod 'IMSDeviceCenter', '1.11.5'
# 蓝牙SDK依赖
pod 'IMSBreezeSDK', '1.6.9'
- 设置待配网设备信息。
- 获取并设置待配设备的型号ProductKey和productID信息。
获取方式如下。
- 通过SDK本地发现接口IMLLocalDeviceMgr搜索周边蓝牙辅助配网设备,取得设备信息。
- 通过直接调用云端接口获取产品列表(非配网SDK提供接口)或App直接展示产品列表,用户选择后确定待配设备productKey及 productID。
- 通过扫描二维码获得待配设备信息,包含ProductKey及productID。
- 调用SDK setDevice设置待配信息。
- 开始配网。
指定配网方式linkType为ForceAliLinkTypeBLE,并调用SDK startAddDevice接口开始配网。
- 配网中,处理回调信息。
配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssid和password。
- 监听配网结果。
示例代码如下。
/**
* 第一步:设置待配网设备信息
*/
//方式一:通过本地发现获取
[[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
//devices 为 IMLCandDeviceModel 对象array,
// 可根据 IMLCandDeviceModel 中的 devType 区分待配网设备联网类型:
// devType 为@"ble_subtype_2" 代表蓝牙辅助配网设备*/
//过滤获取出需要的蓝牙辅助设备数据 productId,通过prductId可通过 thing/productInfo/queryProductKey 接口查询到productKey
IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
model.productKey = @"xxxx";
model.productId = @"xxxx";
model.linkType = ForceAliLinkTypeBLE;
[kLkAddDevBiz setDevice:model];
}];
//方式二:其他获取方式设置
IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
model.productKey = @"xxxx";
model.productId = @"xxxx";
model.linkType = ForceAliLinkTypeBLE;
[kLkAddDevBiz setDevice:model];
/**
* 第二步:开始配网
*/
[kLkAddDevBiz startAddDevice:self];
#pragma mark - 回调方法
- (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){
/**
* 第三步:配网中传入Wi-Fi信息
*/
NSSstring *ssid = @"example ssid";
NSString *password = @"example pwd";
NSInterger timeout = 60;(单位秒,s);
[kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
}
}
-(void)notifyProvisioning
{
NSLog(@"notifyProvisioning callback(正在进行配网...) ");
}
/**
* 第四步:监听结果回调
*/
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
{
NSLog(@"配网结果:%@",candDeviceModel);
}
一键配网
- 设置待配网设备信息。
- 获取并设置待配设备的型号ProductKey信息。
获取方式如下。
- 通过直接调用云端接口获取产品列表(非配网SDK提供接口)或App直接展示产品列表,用户选择后确定待配设备productKey及 productID。
- 通过扫描二维码获得设备ProductKey。
- 调用SDK setDevice设置待配信息。
- 开始配网。
指定配网方式linkType为ForceAliLinkTypeBroadcast,并调用SDK startAddDevice接口开始配网。
- 配网中,处理回调信息。
配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssid和password。
- 监听配网结果。
示例代码如下。
/**
* 第一步:设置待配网设备信息
*/
IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
model.productKey = @"xxx";
model.linkType = ForceAliLinkTypeBroadcast;
[kLkAddDevBiz setDevice:model];
/**
* 第二步:开始配网
* 设置待配信息,开始配网
*/
[kLkAddDevBiz startAddDevice:self];
#pragma mark - 回调方法
- (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){
/**
* 第三步:配网中传入Wi-Fi信息
*/
NSSstring *ssid = @"example ssid";
NSString *password = @"example pwd";
NSInterger timeout = 60;(单位秒,s);
[kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
}
}
-(void)notifyProvisioning
{
NSLog(@"notifyProvisioning callback(正在进行配网...) ");
}
/**
* 第四步:监听结果回调
*/
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
{
NSLog(@"配网结果:%@",candDeviceModel);
}
零配配网
- 设置待配网设备信息。
- 获取并设置待配设备的信息。
获取方式为通过SDK本地发现接口 IMLLocalDeviceMgr 搜索周边待配零配设备,取得设备信息。
- 调用SDK setDevice设置待配信息。
- 开始配网。
调用SDK startAddDevice接口开始配网。
- 配网中,处理回调信息。
配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssid和password。
- 监听配网结果。
示例代码如下。
/**
* 第一步:设置待配网设备信息
*/
[[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
//devices 为 IMLCandDeviceModel 对象array,
// 可根据 IMLCandDeviceModel 中的 addDeviceFrom 为"ZERO_DEVICE" 过滤出零配待配设备信息 model
[kLkAddDevBiz setDevice:model];
}];
/**
* 第二步:开始配网
* 设置待配信息,开始配网
*/
[kLkAddDevBiz startAddDevice:self];
#pragma mark - 回调方法
- (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
{
NSLog(@"notifyPrecheck callback err : %@", err);
}
-(void)notifyProvisioning
{
NSLog(@"notifyProvisioning callback(正在进行配网...) ");
}
/**
* 第四步:监听结果回调
*/
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
{
NSLog(@"配网结果:%@",candDeviceModel);
}
设备绑定
本SDK提供的获取绑定token的接口。绑定接口非本SDK提供。
获取绑定token。可通过以下方式获取绑定使用的token。
- 调用本地发现接口,返回的已配设备列表设备信息中包含token。
该方式请参照零配的本地发现接口调用示例。
- 主动调用SDK接口获取token。
绑定token。使用设备的 ProductKey、DeviceName、Token 调用绑定接口进行绑定。样例代码如下。
/**
* 第一步:获取绑定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){
// 拿到绑定需要的token
/**
* 第二步:调用绑定接口
*/
//TODO 用户根据具体业务场景调用
} else{
NSLog(@"获取token失败(超时)");
}
}];
- 使用本地发现的设备信息进行绑定的时候,如果出现超时(如获取token之后过了很久才去绑定),可以主动调用getDeviceToken接口更新绑定token后,重新调用绑定接口。
- 绑定token有一定的有效时限,失败的时候可以主动重试。