GJLightBlueTooth——一个轻量级的iOS蓝牙开发库

从上家公司离职已经快半年了,与蓝牙打了一年的交道,从小白一个到略知一二。最近在整理上一家公司作的一些项目,突发奇想,本身封装一个蓝牙库,方便之后的使用。说干就干,若是须要项目代码,猛击这里GJLightBlueTooth。若是有用,请赏颗小星星。git

GJLightBlueTooth架构

当初为了避免在一个类里面同时处理发送与接收逻辑,也本着对外封闭的原则,为了给使用库的人一个简单的类,就设计了:github

用户 ——> GJLightBlueTooth ——> CoreBlueTooth ——> GJLightBlueTooth ——> 用户
复制代码

这样的架构bash

其中:架构

  • GJLightBlueTooth:至关于一个中介,架起来自页面用户的指令和系统CoreBlueTooth交互的桥梁,这里的交互包括向蓝牙设备发送指令和设置回调。
  • GJLBTCentralManager:全部与系统CoreBlueTooth的沟通都在这里进行,这里将指令发出去,也在这里获取回调,经过block回传。

另外,在Demo中,你还会看到MyBLETool这个类,这是为了将Demo项目中页面与业务分离而单独出来的一个类,能够理解为设备类。为了咱们不须要在具体的页面中去设置回传的block。工具

使用

在建立页面后,你应该初始化GJLightBlueTooth蓝牙工具:self.BLE = [[GJLightBlueTooth alloc] init]。post

在获取到Characteristic后,你应该根据实际读写的Characteristic匹配出设备上的CBCharacteristic,保存在本地,用于后面的写与读。ui

[self.BLE setBlockWhenDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
        strongify(self);
        for (CBCharacteristic *cha in service.characteristics){
            if ([cha.UUID.UUIDString isEqualToString:CharacteristicUUIDWrite]){
                self.writeCharacter = cha;
            }
        }
        //[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoverCharacteristics" object:service];
    }];
复制代码

扫描

[self.BLE scan]
复制代码

中止扫描

[self.BLE stopScan]
复制代码

链接设备

[self.BLE connectWithPeripheral:peri]
复制代码

断开链接

[self.BLE cancelConnectWithPeripheral:peri]
复制代码

读取信号量

[self.BLE readRSSIWithPeriperal:peri]
复制代码

发送数据

[self.BLE sendDataToPeriperal:peri WriteCharacteristic:self.writeCharacter Command:command NSEncoding:encoding]
复制代码

这里针对如今不少公司提出须要手机与设备有心跳的要求,开启了一个线程队列。该队列设置可以同时存在的指令数为3。spa

NSData *cmdData = [[NSString stringWithFormat:@"%@",command] dataUsingEncoding:encoding];
    
    NSOperation *opration = [NSBlockOperation blockOperationWithBlock:^{
        [peripheral writeValue:cmdData
            forCharacteristic:writeCharacteristics
                         type:CBCharacteristicWriteWithoutResponse];
        /*
         * you can set thread time interval.but the order while delay when there are a lot of orders.
         */
        //[NSThread sleepForTimeInterval:SleepTimeGap];
    }];
    
    [self.writeQueue addOperation:opration];
复制代码

你也能够设置指令间隔时间,可是这样会形成因心跳刷新过快形成的延迟发送。线程

注意

  • 在新版本的iOS中,已经不容许经过peripheral.RSSI来获取设备的信号量,必须在用[peripheral readRSSI]后,使用回调来获取。这就会形成在扫描到设备时候没法显示信号量。因此专门建立了一个分类CBPeripheral+RSSI,利用Runtime来动态给peripheral建立了一个rssi属性。
char nameKey;

- (void)setRssi:(NSNumber *)rssi{
    objc_setAssociatedObject(self, &nameKey, rssi, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSNumber *)rssi{
    return objc_getAssociatedObject(self, &nameKey);
}
复制代码
  • 在MyBLETool中,须要设置GJLBTCentralManager回调流,这里为了防止循环引用,须要进行weak-strong dance。
weakify(self);

[self.BLE setBlockWhenDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
        strongify(self);
        for (CBCharacteristic *cha in service.characteristics){
            if ([cha.UUID.UUIDString isEqualToString:CharacteristicUUIDWrite]){
                self.writeCharacter = cha;
            }
        }
        //[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoverCharacteristics" object:service];
    }];
复制代码

最后是两张demo的效果

若是须要项目代码,猛击这里GJLightBlueTooth。若是有用,请赏颗小星星。设计

相关文章
相关标签/搜索