Core Bluetooth測試比較麻煩,正常情況下,得至少有2台真實的藍牙4.0設備
如何讓iOS模擬器也能測試藍牙4.0程序?
買一個CSR藍牙4.0 USB適配器,插在Mac上
在終端輸入sudo nvram bluetoothHostControllerSwitchBehavior=”never”
重啟Mac
用Xcode 4.6調試代碼,將程序跑在iOS 6.1的模擬器上
(蘋果把iOS 7.0模擬器對BLE的支持移除掉了)
Core Bluetooth的使用場景
運動手環、智能家居、嵌入式設備等等(金融刷卡器、心電測量器)
每個藍牙4.0設備都是通過服務(Service)和特征(Characteristic)來展示自己的
一個設備必然包含一個或多個服務,每個服務下面又包含若干個特征
特征是與外界交互的最小單位
比如說,一台藍牙4.0設備,用特征A來描述自己的出廠信息,用特征B來收發數據
服務和特征都是用UUID來唯一標識的,通過UUID就能區別不同的服務和特征
設備裡面各個服務(service)和特征(characteristic)的功能,均由藍牙設備硬件廠商提供,比如哪些是用來交互(讀寫),哪些可獲取模塊信息(只讀)等
建立中心設備
掃描外設(Discover Peripheral)
連接外設(Connect Peripheral)
掃描外設中的服務和特征(Discover Services And Characteristics)
利用特征與外設做數據交互(Explore And Interact)
斷開連接(Disconnect)
絕大多數智能手機支持藍牙 4.0(BLE)
藍牙芯片發展迅速,在性能和效率方面都有很大提高,且不斷變得更小更便宜
iBeacon + 藍牙,前景一片光明
應用之一:室內導航
Estimote公司為iBeacon提供基站
3個iBeacon基站的預購價格為99美元(約合人民幣610元)
Estimote公司推出的iBeacon基站的最遠傳輸距離為50m,但是他們推薦在10m范圍內的使用效果最好
一塊紐扣電池就能為一個iBeacon基站提供長達 2 年的使用壽命,而且是在設備不斷對外發射信號的情況下
#import ViewController.h
#import
@interface ViewController ()
/**
* 外設
*/
@property (nonatomic, strong) NSMutableArray *peripherals;
/**
* 中心管理者
*/
@property (nonatomic, strong) CBCentralManager *mgr;
@end
@implementation ViewController
- (NSMutableArray *)peripherals
{
if (!_peripherals) {
_peripherals = [NSMutableArray array];
}
return _peripherals;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 1.創建中心設備
CBCentralManager *mgr = [[CBCentralManager alloc] init];
self.mgr = mgr;
// 設置代理
mgr.delegate = self;
// 2.利用中心設備掃描外部設備
/*
如果指定數組代表只掃描指定的設備
*/
[mgr scanForPeripheralsWithServices:nil options:nil];
}
#pragma mark - CBCentralManagerDelegate
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
// 保存掃描到得外部設備
// 判斷如果數組中不包含當前掃描到得外部設置才保存
if (![self.peripherals containsObject:peripheral]) {
peripheral.delegate = self;
[self.peripherals addObject:peripheral];
}
}
/**
* 模擬點擊, 然後連接所有的外設
*/
- (void)start
{
for (CBPeripheral *peripheral in self.peripherals) {
/**
* 連接外設
*/
[self.mgr connectPeripheral:peripheral options:nil];
}
}
/**
* 連接外設成功調用
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
// 掃描外設中得服務
[peripheral discoverServices:nil];
}
/**
* 連接外設失敗調用
*/
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
}
#pragma makr - CBPeripheralDelegate
/**
* 只要掃描到服務就會調用
*
* @param peripheral 服務所在的外設
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
// 獲取外設中所有掃描到得服務
NSArray *services = peripheral.services;
for (CBService *service in services) {
// 拿到需要的服務
if ([service.UUID.UUIDString isEqualToString:@123])
{
// 從需要的服務中查找需要的特征
// 從peripheral中得service中掃描特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
/**
* 只要掃描到特征就會調用
*
* @param peripheral 特征所屬的外設
* @param service 特征所屬的服務
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
// 拿到服務中所有的特診
NSArray *characteristics = service.characteristics;
// 遍歷特征, 拿到需要的特征處理
for (CBCharacteristic * characteristic in characteristics) {
if ([characteristic.UUID.UUIDString isEqualToString:@8888]) {
NSLog(@設置鬧鐘);
}
}
}
@end