蓝牙学习之①:调戏小米手环

基本流程

1.将手机作为调试机,用来搜索附近的蓝牙设备(在本次练习中,指小米手环)并连接。所以,手机是中央设备central。

2.调试机先扫描周边蓝牙设备,用UITableview展示所扫描到的周边蓝牙设备。

3.将扫描到的蓝牙设备(小米手环)设置为蓝牙发射器,即是周边设备peripheral,进行连接connect。

4.连接上蓝牙设备(小米手环)后,获取蓝牙设备(小米手环)中的所有服务services。

5.对每一个服务service进行遍历,获取其中所有的特性characteristic。

6.读取每一个特性,获取每个特性的值value。

7.对蓝牙设备(小米手环)的指定服务中的指定特性写入数据,实现我们想要达到的效果。


1.扫描设备

新建一个project,我在最开始的ViewController中添加了一个UIButton,title为@“扫描蓝牙”,点击这个按钮会跳到下一个界面BLEViewController,在这个界面中开始扫描附近的蓝牙设备。

首先在BLEViewController中导入蓝牙框架头文件

#import <CoreBluetooth/CoreBluetooth.h>

遵守蓝牙协议

@interfaceBLEViewController ()<CBCentralManagerDelegate>

定义需要用到的属性

/**

 *  用于管理中央设备的manager

 */

@property (nonatomic,strong)CBCentralManager *centralManager;

/**

 * 用于保存扫描出来的周边设备的数组

 */

@property (nonatomic,strong)NSMutableArray *arrayBLE;

/**

 * 用于处理蓝牙事件的线程

 */

@property (nonatomic)dispatch_queue_t bleGCD;

viewDidLoad方法中进行相关的初始化操作。

//初始化周边设备数组

self.arrayBLE = [[NSMutableArray alloc]init];

//初始化蓝牙线程

self.bleGCD =dispatch_queue_create("BLEgcd",NULL);

//初始化中央设备管理者

self.centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:self.bleGCD];

    实现CBCentralManagerDelegate中的代理方法centralManagerDidUpdateState,该方法会监听centralManager的状态变化,当运行程序的设备处在蓝牙开启状态下才开始扫描附近的蓝牙设备。

-(void)centralManagerDidUpdateState:(CBCentralManager *)central{

    switch (central.state)

    {

        caseCBCentralManagerStatePoweredOn:

           //当前运行程序的设备处于蓝牙开启状态,开始扫描附近的蓝牙设备

            [self.centralManager scanForPeripheralsWithServices:niloptions:nil];

            break;

            

        default:

            NSLog(@"central Manager Did change State");

            break;

    }

}

    - (void)scanForPeripheralsWithServices:(nullableNSArray<CBUUID *> *)serviceUUIDs options:(nullableNSDictionary<NSString *,id> *)options;这个方法会一直不停地调用,在这个方法中,services参数可以传入包含CBUUID的数组,以便只扫描到拥有指定service的蓝牙设备;options参数可以传入包含CBCentralManagerScanOptionAllowDuplicatesKey或

CBCentralManagerScanOptionSolicitedServiceUUIDsKey的字典,前一个键表示是否过滤每次扫描中发现的同一蓝牙设备,后一个键对应的值可以是一个包含CBUUID的数组,以便只扫描指定service,我感觉似乎和本方法第一个参数services有点重复?这里想扫描到附近的所有蓝牙设备,所以都传入nil。

    开始扫描之后,当扫描到蓝牙设备时,会来到下面这个方法。

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{

    BLEinfo * discoveredBLEinfo = [[BLEinfo

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值