项目背景:
蓝牙或WiFi的项目,通常会按照订制好的协议交互数据。比如从BLE接收到数据:0x01
,按照协议解析数据0x01
的意思是设备已打开,我们需要在客户端需要做相应的业务逻辑处理。
上面一段项目背景中我们可以提取一下开发关键词:
- 蓝牙(WiFi)交互数据:在客户端可以从相应的代理或者Block拿到发送过来的NSData
-
协议:定义客户端与硬件端交互数据所代表的意义,如
0x01
:开灯。如果协议较为复杂,可以尝试将协议转模型。
其中:根据解析结果派发数据,常规做法为: 未命名文件-3.png
通过走代理、通知、blcok的方式将结果传输到各个界面,完成相应的业务逻辑。
但是在AOP中,我们并不需要大量的使用通知、代理、blcok,只需要在需要使用数据的地方对解析结果进行拦截,从而获取我们需要的数据,流程如下:
未命名文件-5.png
数据拦截库的实现:基于Appects框架封装回调方法,可实现勾取对应解析结果具体可看:Aspects
代码片段:
接收数据
+ (void)receiveData:(NSData *)data{
NSString *dataString = [NSString convertDataToHexStr:[data subdataWithRange:NSMakeRange(0, 1)]];
int backCode = [[NSString hexStringToDecima:dataString] intValue];
switch (backCode) {
case 0x1:
{
}
break;
case 0x2:
{
}
case 0x0F:
{
}
default:
break;
}
}
数据解析
数据转模型可以写一个runtime工具类去处理。
+ (HNGetDeviceInfoCode *)getDeviceInfoModel:(NSData *)data{
HNGetDeviceInfoCode *code = [HNGetDeviceInfoCode AnalysisDataToModel:data BytesArray:@[@1,@1,@1,@1,@6,@1,@1]];
DLog(@"%@",code);
return code;
}
数据拦截库
+(void)getDeviceUpdateStatus:(void (^)(BOOL isSuccess))handlerBlock{
[object_getClass([HNBLEDataManager class]) aspect_hookSelector:@selector(getDeviceUpdataStatus:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo,NSData *data){
BOOL isSuccess;
[aspectInfo.originalInvocation getReturnValue:&isSuccess];
if (handlerBlock) {
handlerBlock(isSuccess);
}
} error:NULL];
}
网友评论