ios 蓝牙中心大厦管理者ios能创建多少个

蓝牙bug可以解决了,我找到了一个办法!【ios10吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:156,478贴子:
蓝牙bug可以解决了,我找到了一个办法!收藏
轻松管理你的苹果手机,通讯录,铃声,壁纸,音乐,照片,视频等导出导入;无需越狱,无需ID,免费下载安装海量正版应用.
那就是不开蓝牙
找一台手机和自己的iPhone配对一下蓝牙,然后你的蓝牙救活了,我就是这样修好的,大家试试吧
居然真的可以
这么好的帖子,顶起来啊
顶楼主 方法管用
你们小白点会不会卡死啊?生了10.2以后就会卡死,不管是beta还是正式版都会有!
蓝牙有什么bug啊?
我连手环经常掉
楼主是不是用安卓手机连接iPhone蓝牙啊
iPhone和iPhone连不上啊
我连不上……(;?_?)用你的方法我也连不上
你的是什么系统
太牛了,居然可以了此贴必须顶,顶起来
我的蓝牙根本打不开。就一直这么转着,重启还是转~~控制台点击蓝牙没反应。
牛B啊 楼主 贴吧出人才
登录百度帐号推荐应用1446人阅读
蓝牙开发(1)
iOS 蓝牙4.0(BLE)后台或者锁屏也可以接收数据的方法
其实就是配置一下工程的info.plist文件
建一个名字为 &Required background modes数组&, 加入两个字符串。
App shares data using CoreBluetooth&&和&&App communicates using CoreBluetooth
然后.....没有然后了....OK了
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25097次
排名:千里之外
原创:20篇
转载:32篇
(1)(3)(3)(2)(1)(3)(4)(6)(29)ios蓝牙开发项目实战 -(附小米手环实例)
最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文章实在太多了,成吨成吨的文章出现,但是很遗憾都只是一些皮毛,或者只是简单的介绍一下基本概念而已,对于一些小白可能还有很多很多疑惑,所以萌生了写一篇文章,并附上实际例子的demo,供即将项目中准备开发的伙伴参考。
我们得明确一下很重要的几个概念1.当前ios中开发蓝牙所运用的系统库是&CoreBluetooth/CoreBluetooth.h&。2.蓝牙外设必须为4.0及以上,否则无法开发,蓝牙4.0设备因为低耗电,所以也叫做BLE。3.CoreBluetooth框架的核心其实是两个东西,peripheral和central, 可以理解成外设和中心,就是你的苹果手机就是中心,外部蓝牙称为外设。4.服务和特征(service
characteristic):简而言之,外部蓝牙中它有若干个服务service(服务你可以理解为蓝牙所拥有的能力),而每个服务service下拥有若干个特征characteristic(特征你可以理解为解释这个服务的属性)。5.Descriptor(描述)用来描述characteristic变量的属性。例如,一个descriptor可以规定一个可读的描述,或者一个characteristic变量可接受的范围,或者一个characteristic变量特定的单位。6.跟硬件亲测,Ios蓝牙每次最多接收155字节的数据,安卓5.0以下最大接收20字节,5.0以上可以更改最大接收量,能达到500多字节。
通过以上关键信息的解释,然后看一下蓝牙的开发流程:
建立中心管理者
扫描外设(discover)
连接外设(connect)
扫描外设中的服务和特征(discover)
4.1 获取外设的services
4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值
与外设做数据交互(explore and interact)
断开连接(disconnect)
1.创建一个中心管理者
当发现蓝牙状态是开启状态,你就可以利用中央设备进行扫描外设,如果为关闭状态,系统会自动弹出让用户去设置蓝牙,这个不需要我们开发者关心。
2.利用中心去扫描外设
2.1当扫描到外设,触发以下代理方法
在这里需要说明的是,一.当扫描到外设,我们可以读到相应外设广播信息,RSSI信号强度(可以利用RSSI计算中心和外设的距离)。二.我们可以根据一定的规则进行连接,一般是默认名字或者名字和信号强度的规则来连接。三.像我现在做的无钥匙启动车辆锁定车辆,就需要加密通讯,不能谁来连接都可以操作车辆,需要和外设进行加密通讯,但是一切的通过算法的校验都是在和外设连接上的基础上进行,例如连接上了,你发送一种和硬件约定好的算法数据,硬件接收到校验通过了就正常操作,无法通过则由硬件(外设)主动断开。
3.当连接到外设,会调用以下代理方法
这里需要说明的是当成功连接到外设,需要设置外设的代理,为了扫描服务调用相应代理方法
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
NSLog(@"连接外设成功!%@",peripheral.name);
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
4.扫描外设中的服务和特征
5.与外设做数据交互
需要说明的是苹果官方提供发送数据的方法很简单,只需要调用下面的方法
- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type
我们只需要在搜索每个服务的特征,记录这个特征,然后向这个特征发送数据就可以了。
6.断开连接
调用以下代码,需要说明的是中心断开与外设的连接。
以上呢是整个蓝牙的开发过程,系统提供的框架api就这么多,开发起来也不是很难,要是你认为这篇文章到这里就结束了,你就大错特错了,这篇文章的精华内容将从这里开始,由于公司项目的保密性,我不能以它为例,那我就以小米手环为实例,主要分享一下数据解析。
1.当调用了以下代理方法的时候,我们需要处理接收到的数据
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error
小米手环所定义的几个UUID如下:
@"FF06" 这个UUID定义的是步数@"FF0C" 这个UUID定义的是电量@"2A06"这个UUID定义的是震动@"FF01"这个UUID定义的是相关的设备信息
通过以上的UUID,我们可以读取到步数,电量,操作手环震动,并读取手环相应设备的信息,这里需要说明的是我并不清楚设备信息的具体协议,所以这里没法解析。
if ([characteristic.UUID.UUIDString isEqualToString:STEP]) {
Byte *steBytes = (Byte *)characteristic.value.
int steps = bytesValueToInt(steBytes);
NSLog(@"步数:%d",steps);
当我们读到步数这个UUID时,我们可以拿到value,小米手环所定义的协议是4个字节,我们需要将4个字节转换为int 类型即可方法如下
需要说明的是这个方法是C语言的方法,采用位与运算,当然如果项目中需要另一种方式的转换,如:发过来两字节需要你转换为int,如果你不会转换,可以去网上搜索,我会在文章后附一些常用的转换方法。这里重点说明的是步数读取,剩余类似。
2.当我们给外设发送数据时,我们需要跟硬件定协议,当然这是在开始项目之前做好的事情。
小米手环协议中震动命令的触发,是向硬件发送一个10进制的 2这里需要说明的是我们发送数据给硬件一般是字节数组,然后将他转换为NSData发送。
这里需要再添加一点,如果协议要求你发ASCII码,例如‘SHAKE’,只需要这么处理
if (thePerpher && theSakeCC) {
Byte zd[] = {'S','H','A','K','E'};
NSData *theData = [NSData dataWithBytes:zd length:1];
[thePerpher writeValue:theData forCharacteristic:theSakeCC type:CBCharacteristicWriteWithoutResponse];
3.项目中实际开发的运用当我们面对实际开发时,我们不可能这么直接去在一个控制器中去写这么多代码,如果你说这没多少啊,那我无话可说了?。。。当然有人会说运用三方库的啊,babyBluetooth在github上star还是挺高的,我的观点是没有必要去依赖所谓的三方库,有的三方库高度封装性会致使我们如果遇到错误时无法排查,所以三方库慎用,当然你可以参考一些Star很高的三方库,看大神的代码思想,有利于自己读写代码的能力。
我的主要思路是封装一个单例类,封装好扫描的方法,读取数据的方法(一般是代理回调),发送指令(例如小米的震动)方法,而在读取数据中我们可以采用模型的思想,当收到蓝牙外设发送过来的数据时候,我们解析完后包装成模型通过代理回传过去,以后我们在控制器中每次拿到的都是模型数据,这样处理起来方便大大的。下面将小米手环demo附上,供需要的朋友参考学习,如果文章中我有什么没有说的很明白,或者什么疑惑可以留言。
附常用转换方法
@interface NSString (Extension)
由于项目中需要做关于后台持续扫描,类似于常见的蓝牙音箱,打开手机APP连接蓝牙音箱,播放音乐,当手机远离蓝牙音箱后,停止播放,当手机靠近的时候,蓝牙音箱又开始播放了,对于这中需求的实现我开始很困惑,蓝牙如何后台持续扫描呢,我尝试了很多方法是失败的,经过我多方面查询资料弄清楚如何实现这个需求:
1.需要后台运行需申请后台权限
勾选即可拥有后台权限,如果外设持续发送数据,APP端可以接收到数据。
2.扫描时需指定serviceUUID,需外设广播出自己的SeviceUUID,APP端作为扫描的条件。
这是苹果扫描方法的的官方解释:
Applications that have specified the bluetooth-central background mode are allowed to scan while backgrounded, with two
caveats: the scan must specify one or more service types in serviceUUIDs, and the CBCentralManagerScanOptionAllowDuplicatesKey
scan option will be ignored.
显而易见的说的很清楚,后台模式时蓝牙作为central,必须指定serviceUUIDs,scan option忽略。
扫描方法:
[self.centralManger scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"FEE0"],[CBUUID UUIDWithString:@"FEE7"]] options:nil];
这样当在后台的时候是可以持续扫描的。
3.当后台断开连接时候会调用系统方法
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
我们需要在这里设置自动重连,即可实现上述的需求。
关于蓝牙需要做一些补充及修改,首先对于后台扫描时候,我们申请后台权限只需要申请
如果两个都申请,如果提交安装包到APPStore,你会被拒绝
If your app is meant to work with external hardware,
supported protocols must be included in the
UISupportedExternalAccessoryProtocols key in your app's Info.plist file -
and the hardware's PPID # should be provided in the Review Notes field
of your app in iTunes Connect.Additionally, your app must be
authorized by MFi to use the desired hardware. If you are not yet in the
MFi Program, you can enroll at MFi program.Please either revise
your Info.plist to include the UISupportedExternalAccessoryProtocols key
and update your Review Notes to include the PPID # - or remove the
external-accessory value from the UIBackgroundModes key.
阅读(...) 评论()iphone 可以连接几个蓝牙设备? - 知乎6被浏览4972分享邀请回答0添加评论分享收藏感谢收起0添加评论分享收藏感谢收起iOS蓝牙开发(二):iOS 蓝牙4.0中心模式 代码实现 - Dr的专栏 - CSDN博客
iOS蓝牙开发(二):iOS 蓝牙4.0中心模式 代码实现
上一篇简单介绍了蓝牙的部分基础知识,详细的东西大家可以去github上搜babyBluetooth,里面有一些学习资料
iOS连接外设的流程
建立中心管理者
扫描外设 discoverPeripheral
连接外设 connectPeripheral
扫描外设中的服务和特征 discoverServices discoverCharacteristics
获取外设的services
获取外设service中的characteristics
获取characteristic的值value、descriptor的value
与外设做数据交互 write、read
订阅characteristic的通知notify
断开连接 disconnected
1、导入CoreBluetooth头文件,建立中心管理类,设置代理
#import &CoreBluetooth/CoreBluetooth.h&
@interface ViewController : UIViewController&CBCentralManagerDelegate&
@interface ViewController (){
//系统蓝牙设备管理对象,可以把他理解为主设备,通过他,可以去扫描和链接外设
CBCentralManager *
//用于保存被发现设备
NSMutableArray *
- (void)viewDidLoad {
[super viewDidLoad];
设置主设备的委托,CBCentralManagerDelegate
必须实现的:
- (void)centralManagerDidUpdateState:(CBCentralManager *)//主设备状态改变的委托,在初始化CBCentralManager的适合会打开设备,只有当设备正确打开后才能使用
其他选择实现的委托中比较重要的:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI; //找到外设的委托
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)//连接外设成功的委托
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)//外设连接失败的委托
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)//断开外设的委托
//初始化并设置委托和线程队列,最好一个线程的参数可以为nil,默认会就main线程
manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
2、扫描外设(discover),扫描外设的方法我们放在centralManager成功打开的委托中,因为只有设备成功打开,才能开始扫描,否则会报错。
所以当重新连接外设时,都不会成功,因为states还没打开;一般自己写蓝牙,这个地方要处理一下,连接的时候判断一下,还未打开就重连,一直等到PoweredOn
-(void)centralManagerDidUpdateState:(CBCentralManager *)central{
switch (central.state) {
case CBCentralManagerStateUnknown:
NSLog(@"&&&CBCentralManagerStateUnknown");
case CBCentralManagerStateResetting:
NSLog(@"&&&CBCentralManagerStateResetting");
case CBCentralManagerStateUnsupported:
NSLog(@"&&&CBCentralManagerStateUnsupported");
case CBCentralManagerStateUnauthorized:
NSLog(@"&&&CBCentralManagerStateUnauthorized");
case CBCentralManagerStatePoweredOff:
NSLog(@"&&&CBCentralManagerStatePoweredOff");
case CBCentralManagerStatePoweredOn:
NSLog(@"&&&CBCentralManagerStatePoweredOn");
//开始扫描周围的外设
第一个参数nil就是扫描周围所有的外设,扫描到外设后会进入
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
[manager scanForPeripheralsWithServices:nil options:nil];
//扫描到设备会进入方法
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
NSLog(@"当扫描到设备:%@",peripheral.name);
//接下来可以连接设备
3、连接外设
有一点注意,找到的peripheral必须被持有:(比如添加到数组、赋值给另一个被持有的变量),否则CBCentralManager中也不会保存这个peripheral,那么CBPeripheralDelegate中的方法也不会被调用
//扫描到设备会进入方法
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
//接下连接我们的测试设备,如果你没有设备,可以下载一个app叫lightbule的app去模拟一个设备
//这里自己去设置下连接规则,我设置的是P开头的设备
if ([peripheral.name hasPrefix:@"P"]){
一个主设备最多能连7个外设,每个外设最多只能给一个主设备连接,连接成功,失败,断开会进入各自的委托
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)//连接外设成功的委托
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)//外设连接失败的委托
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)//断开外设的委托
//找到的设备必须持有它,否则CBCentralManager中也不会保存peripheral,那么CBPeripheralDelegate中的方法也不会被调用!!
[peripherals addObject:peripheral];
//连接设备
[manager connectPeripheral:peripheral options:nil];
//连接到Peripherals-成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
NSLog(@"&&&连接到名称为(%@)的设备-成功",peripheral.name);
//连接到Peripherals-失败
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
NSLog(@"&&&连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]);
//Peripherals断开连接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
NSLog(@"&&&外设连接断开连接 %@: %@\n", [peripheral name], [error localizedDescription]);
4、扫描外设中的服务和特征(discover)
设备连接成功后,就可以扫描设备的服务了,同样是通过委托形式,扫描到结果后会进入委托方法。但是这个委托已经不再是主设备的委托(CBCentralManagerDelegate),而是外设的委托(CBPeripheralDelegate),这个委托包含了主设备与外设交互的许多 回叫方法,包括获取services,获取characteristics,获取characteristics的值,获取characteristics的Descriptor,和Descriptor的值,写数据,读rssi,用通知的方式订阅数据等等。
5、获取外设的services
//连接到Peripherals-成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
NSLog(@"&&&连接到名称为(%@)的设备-成功",peripheral.name);
//设置的peripheral委托CBPeripheralDelegate
//@interface ViewController : UIViewController&CBCentralManagerDelegate,CBPeripheralDelegate&
[peripheral setDelegate:self];
//扫描外设Services,成功后会进入方法:-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
[peripheral discoverServices:nil];
//扫描到Services
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
NSLog(@"&&&扫描到服务:%@",peripheral.services);
if (error)
NSLog(@"&&&Discovered services for %@ with error: %@", peripheral.name, [error localizedDescription]);
for (CBService *service in peripheral.services) {
NSLog(@"%@",service.UUID);
//扫描每个service的Characteristics,扫描到后会进入方法: -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
[peripheral discoverCharacteristics:nil forService:service];
6、获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值
//扫描到Characteristics
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
if (error)
NSLog(@"error Discovered characteristics for %@ with error: %@", service.UUID, [error localizedDescription]);
for (CBCharacteristic *characteristic in service.characteristics)
NSLog(@"service:%@ 的 Characteristic: %@",service.UUID,characteristic.UUID);
//获取Characteristic的值,读到数据会进入方法:-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
for (CBCharacteristic *characteristic in service.characteristics){
[peripheral readValueForCharacteristic:characteristic];
//搜索Characteristic的Descriptors,读到数据会进入方法:-(void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
for (CBCharacteristic *characteristic in service.characteristics){
[peripheral discoverDescriptorsForCharacteristic:characteristic];
//获取的charateristic的值
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
//打印出characteristic的UUID和值
//!注意,value的类型是NSData,具体开发时,会根据外设协议制定的方式去解析数据
NSLog(@"characteristic uuid:%@
value:%@",characteristic.UUID,characteristic.value);
//搜索到Characteristic的Descriptors
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
//打印出Characteristic和他的Descriptors
NSLog(@"characteristic uuid:%@",characteristic.UUID);
for (CBDescriptor *d in characteristic.descriptors) {
NSLog(@"Descriptor uuid:%@",d.UUID);
//获取到Descriptors的值
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error{
//打印出DescriptorsUUID 和value
//这个descriptor都是对于characteristic的描述,一般都是字符串,所以这里我们转换成字符串去解析
NSLog(@"characteristic uuid:%@
value:%@",[NSString stringWithFormat:@"%@",descriptor.UUID],descriptor.value);
7、把数据写到Characteristic中
-(void)writeCharacteristic:(CBPeripheral *)peripheral
characteristic:(CBCharacteristic *)characteristic
value:(NSData *)value{
//打印出 characteristic 的权限,可以看到有很多种,这是一个NS_OPTIONS,就是可以同时用于好几个值,常见的有read,write,notify,indicate,知知道这几个基本就够用了,前连个是读写权限,后两个都是通知,两种不同的通知方式。
typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {
CBCharacteristicPropertyBroadcast
CBCharacteristicPropertyRead
CBCharacteristicPropertyWriteWithoutResponse
CBCharacteristicPropertyWrite
CBCharacteristicPropertyNotify
CBCharacteristicPropertyIndicate
CBCharacteristicPropertyAuthenticatedSignedWrites
CBCharacteristicPropertyExtendedProperties
CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0)
CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0)
NSLog(@"%lu", (unsigned long)characteristic.properties);
//只有 characteristic.properties 有write的权限才可以写
if(characteristic.properties & CBCharacteristicPropertyWrite){
最好一个type参数可以为CBCharacteristicWriteWithResponse或type:CBCharacteristicWriteWithResponse,区别是是否会有反馈
[peripheral writeValue:value forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
NSLog(@"该字段不可写!");
8、订阅Characteristic的通知
一般在discoverCharacteristic的代理中,发现了类型是notify的characteristic,直接就可以订阅了
//设置通知
-(void)notifyCharacteristic:(CBPeripheral *)peripheral
characteristic:(CBCharacteristic *)characteristic{
//设置通知,数据通知会进入:didUpdateValueForCharacteristic方法
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
//取消通知
-(void)cancelNotifyCharacteristic:(CBPeripheral *)peripheral
characteristic:(CBCharacteristic *)characteristic{
[peripheral setNotifyValue:NO forCharacteristic:characteristic];
9、断开连接(disconnect)
//停止扫描并断开连接
-(void)disconnectPeripheral:(CBCentralManager *)centralManager
peripheral:(CBPeripheral *)peripheral{
//停止扫描
[centralManager stopScan];
//断开连接
[centralManager cancelPeripheralConnection:peripheral];
iOS中蓝牙模块OTA升级(YModem协议)
我的热门文章}

我要回帖

更多关于 ios11 控制中心 蓝牙 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信