藍(lán)牙是開(kāi)發(fā)中常用的功能唠帝。通過(guò)手機(jī)APP與硬件設(shè)備連接笆搓,進(jìn)而操作硬件性湿,在開(kāi)發(fā)中越來(lái)越常見(jiàn)。
藍(lán)牙的理論知識(shí)可自行從網(wǎng)上搜索满败,此處只介紹如何在項(xiàng)目中通過(guò)代碼集成藍(lán)牙功能肤频。
集成藍(lán)牙SDK時(shí),用到的是iOS自帶的SDK算墨,在pch文件或者是用到藍(lán)牙的某個(gè)類(此處小編假設(shè)用到藍(lán)牙的是自定義的BlueTooth類)的頭部引入:
#import <CoreBluetooth/CoreBluetooth.h>
在BlueTooth類中聲明一下屬性
@property (nonatomic, strong) CBCentralManager *manager;//藍(lán)牙的中心管理者
@property (nonatomic, strong) CBPeripheral *peripheral;
@property (strong ,nonatomic) CBCharacteristic *writeCharacteristic;//藍(lán)牙的寫(xiě)特征
@property (nonatomic,strong) CBCharacteristic *readCharacteristic;//藍(lán)牙的讀特征
@property (nonatomic,strong) CBCharacteristic *vedioCharacteristic;
@property (nonatomic,strong) CBCharacteristic *batteryCharacteristic;//藍(lán)牙的電池特征宵荒,可以檢測(cè)電池電量
@property (nonatomic,strong) CBCharacteristic *stateCharacteristic;//藍(lán)牙的狀態(tài)特征,檢測(cè)是否連接
@property (strong,nonatomic) NSMutableArray *nDevices;//搜索到的所有藍(lán)牙設(shè)備
@property (strong,nonatomic) NSMutableArray *nServices;//當(dāng)前匹配的藍(lán)牙設(shè)備的所有服務(wù)
@property (strong,nonatomic) NSMutableArray *nCharacteristics;//當(dāng)前匹配的藍(lán)牙設(shè)備的所有特征
在BlueTooth類中加入藍(lán)牙代理
<CBCentralManagerDelegate,CBPeripheralDelegate>
在BlueTooth類的viewDidLoad方法中初始化:
_manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
_nDevices = [[NSMutableArray alloc]init];?
_nServices = [[NSMutableArray alloc]init];
_nCharacteristics = [[NSMutableArray alloc]init];
點(diǎn)擊頁(yè)面的某個(gè)button净嘀,點(diǎn)擊方法中開(kāi)始掃描周圍的藍(lán)牙設(shè)備:
[_manager scanForPeripheralsWithServices:nil options:nil];
#pragma mark 查到外設(shè)后报咳,停止掃描,連接設(shè)備
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
? ? NSLog(@"已發(fā)現(xiàn) peripheral: %@ ---%@--rssi: %@,---UUID: %@ --advertisementData: %@ ", peripheral, peripheral.name,RSSI, peripheral.identifier, advertisementData);
? ? [peripheral setDelegate:self];
? ? [peripheral discoverServices:nil];
? ? NSString *blueName = peripheral.name;
? ? if([你要查找的設(shè)備名稱 isEqualToString:blueName]){
? ? ? ? ? ? self.peripheral = peripheral;//找到需要的外設(shè)挖藏,并賦值
? ? ? ? ? ? [_manager connectPeripheral:_peripheral options:@{CBConnectPeripheralOptionNotifyOnConnectionKey : @YES }];
? ? ? ? ? ? [self.manager stopScan];
? ? ? ? }else{
????????????//如果查到的設(shè)備名稱不是你需要的暑刃,繼續(xù)查找
? ? ? ? }
? ? ? ? BOOL replace = NO;
? ? ? ? // Match if we have this device from before
? ? ? ? //搜索到的藍(lán)牙,在設(shè)備數(shù)組遍歷膜眠,如果曾經(jīng)沒(méi)有連接過(guò)這個(gè)藍(lán)牙岩臣,就添加,如果鏈接過(guò)宵膨,則替換
? ? ? ? for (int i=0; i < _nDevices.count; i++) {
? ? ? ? ? ? CBPeripheral *p = [_nDevices objectAtIndex:i];
????????????if ([p isEqual:peripheral]) {
????????????????[_nDevices replaceObjectAtIndex:i withObject:peripheral];
? ? ? ? ? ? ? ? replace = YES;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (!replace) {
? ? ? ? ? ? [_nDevices addObject:peripheral];
? ? ? ? }
? ? }
}
//連接外設(shè)失敗
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
? ? NSLog(@"鏈接外設(shè)失敗%@",error);
}
#pragma mark 連接外設(shè)后的處理
//連接外設(shè)成功架谎,開(kāi)始發(fā)現(xiàn)服務(wù)
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
?? ?[self.peripheral setDelegate:self];
? ? [self.peripheral discoverServices:nil];
? ? NSLog(@"掃描服務(wù)");
}
#pragma mark 發(fā)現(xiàn)服務(wù)和搜索到的Characteristice
//已發(fā)現(xiàn)服務(wù)
-(void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
? ? NSLog(@"發(fā)現(xiàn)服務(wù)!");
? ? int i = 0;
? ? for(CBService* s in peripheral.services){
? ? ? ? [self.nServices addObject:s];
? ? }
? ? for(CBService* s in peripheral.services){
?????????//NSLog(@"%d :服務(wù) UUID: %@(%@)", i, s.UUID.data, s.UUID);
? ? ? ? i++;
? ? ? ? [peripheral discoverCharacteristics:nil forService:s];
? ? ? ? //NSLog(@"掃描Characteristics...");
? ? }
}
#pragma mark? 已搜索到Characteristics
-(void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
? ? for(CBCharacteristic* c in service.characteristics){
? ? ? ? [peripheral readValueForCharacteristic:c];
? ? ? ? //NSLog(@"特征 UUID:? %@-- %@-- (%@)", c,c.UUID.data, c.UUID);
? ? ? ? [peripheral setNotifyValue:YES forCharacteristic:c];
? ? ? ? if([c.UUID isEqual:[CBUUID UUIDWithString:@"FFF1"]]){ //寫(xiě)
? ? ? ? ? ? self.writeCharacteristic = c;
? ? ? ? ? ? [peripheral readValueForCharacteristic:c];
? ? ? ? }else if([c.UUID isEqual:[CBUUID UUIDWithString:@"FFF2"]]){//讀
? ? ? ? ? ? self.readCharacteristic = c;
? ? ? ? ? ? [peripheral readValueForCharacteristic:c];
? ? ? ? }else if ([c.UUID isEqual:[CBUUID UUIDWithString:@"2a19"]]){//電池電量
? ? ? ? ? ? self.batteryCharacteristic = c;
? ? ? ? }
? ? ? ? uint8_t val[c.value.length];
? ? ? ? [c.value getBytes:val length:c.value.length];
? ? ? ? if([c.UUID.UUIDString isEqualToString:@"FFF6"]){
? ? ? ? ? ? self.stateCharacteristic = c;
? ? ? ? ? ? [peripheral readValueForCharacteristic:c];
? ? ? ? ? ? [peripheral setNotifyValue:YES forCharacteristic:c];
? ? ? ? }
? ? }
}
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
? ? NSLog(@"已斷開(kāi)與設(shè)備:[%@]的連接",peripheral.name);
}
//獲取外設(shè)發(fā)來(lái)的數(shù)據(jù),不論是read和notify,獲取數(shù)據(jù)都是從這個(gè)方法中讀取辟躏。
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
? ? NSData *data = characteristic.value;
? ? NSString* value = [self hexadecimalString:data];
? ? if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"FFF2"]]) {
? ? }else if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2a19"]]){//電池
? ? ? ? NSData *data = characteristic.value;
? ? ? ? NSString *value = [self hexadecimalString:data];
? ? ? ? NSString * temp10 = [NSString stringWithFormat:@"%lu",strtoul([value UTF8String],0,16)];
? ? ? ? //NSLog(@"電池----%@",temp10);
? ? }else{
? ? ? ? //NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
? ? ? ? //NSLog(@"其他的特征值--%@",value);
? ? }
}
當(dāng)你找到了相應(yīng)的藍(lán)牙設(shè)備谷扣,并且需要向藍(lán)牙設(shè)備發(fā)送數(shù)據(jù)的時(shí)候,調(diào)用以下方法捎琐。
if (characteristic.properties & CBCharacteristicPropertyWrite) {
? ? ? ? // 寫(xiě)入數(shù)據(jù)
? ? ? ? [peripheral writeValue:data forCharacteristic:_writeCharacteristic type:CBCharacteristicWriteWithResponse];
? ? }
以上是集成藍(lán)牙的全部代碼会涎,不明白的可以留言涯曲。具體的操作還需要iOS開(kāi)發(fā)人員和公司的硬件工程師進(jìn)行配合。