当前位置: 首页 > news >正文

仿京东网站后台seo是什么职业

仿京东网站后台,seo是什么职业,免费域名网站搭建,唐山市网站建设最近做了一个物联网项目,涉及到了设备绑定配网这块,需要了解一下iOS BLE与设备绑定的相关知识点,第一次接触蓝牙相关的项目,所以开始熟悉蓝牙的相关信息。没有去深入研究BabyTooth库,只是感觉CoreBluetooth已经让我更好的理解整个流程这个物联网项目的设备绑定流程是…

最近做了一个物联网项目,涉及到了设备绑定配网这块,需要了解一下iOS BLE与设备绑定的相关知识点,第一次接触蓝牙相关的项目,所以开始熟悉蓝牙的相关信息。没有去深入研究BabyTooth库,只是感觉CoreBluetooth已经让我更好的理解整个流程

这个物联网项目的设备绑定流程是需要APP端把WIFI的信息传给硬件设备,不过硬件存在一些瑕疵

  1. 硬件设备不会告诉APP端WIFI密码是否未填/错误

  1. 硬件设备不会告诉APP端设备是通过2.4G网络还是5G网络

  1. 设备属于同一个型号,但是设备支持的功能却不同,设备很混乱,例如一种配网功能有些需要2分钟内,有些不需要

  1. 子设备配网需要主设备在线,并且配网成功有WIFI信息才能正常使用

  1. 子设备的生产并没有合理化的展开,有些子设备的MAC是错误的,有些子设备有蓝牙名称有些没有

所以只能通过跑定时器60s来拟定设备绑定错误,且通过一个大量的文案提示来告诉用户错误的可能性,让用户自行判断是设备问题导致的无法配网还是因为WIFI频段的问题还是WIFI密码错误的问题等

参考了部分APP绑定硬件设备流程,标准流程都有,但是部分在配网页面是120s且不存在综合错误统计页面,最后的配网准备流程等待过长时间且没有过多的文案提示,对用户来说并不是很友好

项目中实用到的错误综合参考页面

故障拓展的因素种类过多,需要考虑的极限异常种类也很多,比如使用WIFI配网时网络突然中断,配网成功后网络出现波动等

总之,一个萝卜一个坑,为了保证用户在购买硬件产品后,不需要使用说明书就能实现APP操作硬件

用户体验,我辈义不容辞! ! !

目前的硬件设备想要配置网络使用的2.4G网络,也可以是2.4G和5G二合一的网络

关于WIFI 2.4G和5G状态的判断
尝试过使用WIFI信号的频道强度来获取当前连接的WIFI是2.4G和5G,并不适用
简单的通过WIFI的名称,通过获取到的字符串来识别是否包含2.4G和5G,需要判断逻辑考虑不全且没什么意义
  • 如果有好的方式,请私信联系我

一些注意事项

  1. 开启蓝牙模块,需要系统和APP的蓝牙全部开启

  1. 需要获取WIFI信息

  1. 地址定位权限需要开启,为什么呢?

在 iOS 13 当中,苹果增加了无线网络和蓝牙位置隐私保护,API 方面有所变化,并新增了控制选项,有助于在用户使用无线网络和蓝牙时,防止应用未经你同意而获取你的位置信息。
  • APP权限检测流程

#import <CoreBluetooth/CoreBluetooth.h>

外围设备和中央设备在CoreBluetooth中使用CBPeripheralManager和CBCentralManager表示。

CBPeripheralManager:外围设备通常用于发布服务、生成数据、保存数据。外围设备发布并广播服务,告诉周围的中央设备它的可用服务和特征。

CBCentralManager:中央设备使用外围设备的数据.中央设备扫描到外围设备后会就会试图建立连接,一旦连接成功就可以使用这些服务和特征。

外围设备和中央设备之间交互的桥梁是服务(CBService)和特征(CBCharacteristic)
获取当前手机的WIFI信息
-(void)makeWifiIsCanUes
{id info = nil;NSString *str ;NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();for (NSString *ifnam in ifs) {info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);str = info[@"SSID"];_BBIDdStr = info[@"BSSID"];NSLog(@"%@----",info);}if (str.length == 0) {NSLog(@" 您的手机还未连接WiFi网络");}else{self.ssidStr = [BZAirKissShareTools fetchSSIDInfo][@"SSID"];self.wifiName.text = [BZAirKissShareTools fetchSSIDInfo][@"SSID"];}
}

主设备是根据有指定的SN号可以配对的,所以在扫描周围设备方法的回调中对返回的peripheral.name

wifiNamePwd WIFI密码可以为空,但是WIFI名称是一定需要的
[self.centerManager scanDeviceWithTimeInterval:NSIntegerMax services:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey: @YES }  callBack:^(EasyPeripheral *peripheral, searchFlagType searchType) {NSLog(@"peripheral : %@ ",peripheral);NSLog(@"peripheral.name : %@ ",peripheral.name);NSLog(@"peripheral.identifier.UUIDString : %@ ",peripheral.identifier.UUIDString);NSData *data = [peripheral.advertisementData objectForKey:@"kCBAdvDataManufacturerData"];NSString *aStr= [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];const char *valueString = [[data description] cStringUsingEncoding: NSUTF8StringEncoding];NSString *mac = [self convertToNSStringWithNSData:data];aStr = [aStr stringByReplacingOccurrencesOfString:@" " withString:@""];NSLog(@"aStr : %@",aStr);NSLog(@"advertisementData : %@",peripheral.advertisementData);NSLog(@"======================================================");NSLog(@"MAC : %@",mac);NSLog(@"======================================================");if ([peripheral.name containsString:self.sn.uppercaseString]) {[self.centerManager stopScanDevice];NSData *data =[self.wifiNamePwd dataUsingEncoding:NSUTF8StringEncoding];WEAKSELF;[self.characteristic writeValueWithData:data callback:^(EasyCharacteristic *characteristic, NSData *data, NSError *error) {NSLog(@"成功");if (error) {[weakSelf connectionBackWithType:1];}else{[weakSelf connectionBackWithType:0];}}];}}];self.centerManager.stateChangeCallback = ^(EasyCenterManager *manager, CBManagerState state) {NSLog(@"%ld",(long)state);};}

需要注意的是蓝牙模块的生态

1.蓝牙搜索

开始蓝牙搜索 - 蓝牙搜索中 - 蓝牙搜索成功

2.蓝牙连接

开始蓝牙连接 - 蓝牙连接中 - 蓝牙连接成功

3.WIFI连接

开始WIFI连接 - WIFI连接中 - WIFI连接成功

4.设备联网

设备联网中 - 设备联网成功

不使用蓝牙时需要取消关闭[self.peripheral disconnectDevice];[self.centerManager stopScanDevice];[self.centerManager disConnectAllDevice];[self.centerManager removeAllScanFoundDevice];
连上蓝牙配网
- (void)deviceConnect:(EasyPeripheral *)peripheral error:(NSError *)errorself.peripheral = peripheral;WEAKSELF;[self.peripheral discoverAllDeviceServiceWithCallback:^(EasyPeripheral *peripheral, NSArray<EasyService *> *serviceArray, NSError *error) {for (EasyService *tempS in serviceArray) {[tempS discoverCharacteristicWithCallback:^(NSArray<EasyCharacteristic *> *characteristics, NSError *error) {for (EasyCharacteristic *tempC in characteristics) {[tempC discoverDescriptorWithCallback:^(NSArray<EasyDescriptor *> *descriptorArray, NSError *error) {for (EasyDescriptor *desc in descriptorArray) {[desc readValueWithCallback:^(EasyDescriptor *descriptor, NSError *error) {}];}
queueMainStartEasyService *tempS = weakSelf.peripheral.serviceArray[0] ;EasyCharacteristic *tempC = tempS.characteristicArray[0];weakSelf.characteristic = tempC;NSLog(@"连上蓝 获取成功服务");
queueEnd}];}}];}}];
}

注意项:

写了一个NSMutableDictionary *foundDeviceDict如果不在扫描设备、已连接设备的集合中就加入其中,并通知外部调用者

之前通过NSArray来遍历数据,会存在偶现的闪退,定位后在这报错,直接遍历字典,因为key有时候返回的为nil
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
//字典直接enumerateKeysAndObjectsUsingBlock遍历数据[self.foundDeviceDict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {if ([key isEqualToString:peripheral.identifier.UUIDString]) {EasyPeripheral *tempP = self.foundDeviceDict[key];tempP.deviceScanCount++ ;existedIndex = tempP.deviceScanCount ;*stop = YES;    }}];//发现一个设备的回调//去掉重复搜索到的设备}

绑定子设备的时候,已有不少麻烦的问题

  1. iOS的MAC地址和安卓的MAC的地址是不同的,倒叙的

  1. 部分子设备MAC地址需要自己手动截取一遍

由于系统限制,Android 上获取到的 deviceId 为设备 MAC 地址,iOS 上则为设备 uuid。因此 deviceId 不能硬编码到代码中。
[mac substringFromIndex:4]
NSString *macString = [NSString stringWithFormat:@"%@%@%@%@%@%@",[mac substringWithRange:NSMakeRange(10, 2)],[mac substringWithRange:NSMakeRange(8, 2)],[mac substringWithRange:NSMakeRange(6, 2)],[mac substringWithRange:NSMakeRange(4, 2)],[mac substringWithRange:NSMakeRange(2, 2)],[mac substringWithRange:NSMakeRange(0, 2)]];
mac = [mac substringWithRange:NSMakeRange(mac.length - 12, 12)];NSString *macString = [NSString stringWithFormat:@"%@%@%@%@%@%@",[mac substringWithRange:NSMakeRange(10, 2)],[mac substringWithRange:NSMakeRange(8, 2)],[mac substringWithRange:NSMakeRange(6, 2)],[mac substringWithRange:NSMakeRange(4, 2)],[mac substringWithRange:NSMakeRange(2, 2)],[mac substringWithRange:NSMakeRange(0, 2)]];

蓝牙产品在广播包中会以某个字节标识自己的类型,扫描到设备以后代理方法中会以字典的形式提供给我们。

iOS 8及以前kCBAdvDataManufacturerData这个数据提供的是scan response (SCAN_RSP),但是iOS 9及以后会把advertising packet (ADV_IND)scan response (SCAN_RSP)两部分合并在一起提供给了我们。所以不同版本的情况下我们获取kCBAdvDataManufacturerData会出现不同。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI
{id data = advertisementData[@"kCBAdvDataManufacturerData"];
}

官方的问答https://www.jianshu.com/p/e9f647f59eb6

http://www.hkea.cn/news/521266/

相关文章:

  • 网站建设如何提案万网域名注册信息查询
  • 创意二维码制作网站企业网络营销推广案例
  • 论坛型网站怎么做百度高级检索入口
  • 做百度移动网站排搜素引擎优化
  • 公司创建一个网站需要多少钱想做百度推广找谁
  • 做文献ppt模板下载网站有哪些常德政府网站
  • 青岛网站建设公司排行外链工具在线
  • 网站怎么做显得简洁美观seo数据是什么意思
  • 阿里巴巴开通诚信通后网站怎么做网络优化网站
  • 东莞手机网站价格便宜个人免费建站软件
  • 电子商务网站建设的步骤一般为百度100%秒收录
  • 做企业网站怎么样免费的推广软件下载
  • 拓普网站建设美国搜索引擎
  • 网站开发者工资冯耀宗seo视频教程
  • 软件开发各阶段工作量比例搜索引擎优化的基础是什么
  • 网站怎么做才能将名声打响云搜索app
  • 南阳做网站优化哪家好一级域名生成二级域名
  • 3322动态域名官网郑州seo联系搜点网络效果好
  • 网络营销渠道的类型河北seo基础教程
  • 做微信网站多少钱seo内部优化包括哪些内容
  • 中国城乡建设网站网络优化公司排名
  • 个人网站做淘宝客教程torrentkitty磁力搜索引擎
  • 广州北京网站建设seo培训讲师招聘
  • 手机上免费自己做网站网络营销案例分享
  • 长沙大型网站建设谷歌账号
  • 大兴德艺网站建设发布悬赏任务的推广平台
  • html5制作网站模板百度产品大全首页
  • 贵阳网站建设贵阳百度推广怎么推广
  • 瓮安建设局网站google play三件套
  • 大型门户网站模板营销神器