第一步:掃描外設(shè)
[self.centralManager scanForPeripheralsWithServices:nil options:nil];
第二步:選擇想要連接的外設(shè),這里實現(xiàn)通過把掃描到的外設(shè)數(shù)據(jù)回調(diào)給tableView,通過點擊cell實現(xiàn)
2.1.主控制器里點擊按鈕后獲取掃描的外設(shè)數(shù)據(jù):
- (IBAction)scanButtonClick:(id)sender {
[kHMBlueToothManager beginScanCBPeripheral:^(NSArray *peripheralArr) {
self.tableArr = peripheralArr;
[self.tableView reloadData];
}];
}
2.2.主控制器里通過tableCell展示數(shù)據(jù)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.tableArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
CBPeripheral *peripheral = self.tableArr[indexPath.row];
cell.textLabel.text = peripheral.name ;
cell.detailTextLabel.text = [peripheral.identifier UUIDString];
return cell;
}
2.3點擊cell的代理方法實現(xiàn)選擇想要連接的外設(shè)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
CBPeripheral *peripheral = self.tableArr[indexPath.row];
[kHMBlueToothManager connectPeripheral:peripheral Completion:^(NSError *error) {
if (error == nil) {
NSLog(@"連接成功");
}else{
NSLog(@"連接失敗");
}
}];
}
第三步:連接外設(shè)
#pragma mark -流程3-連接外設(shè)
- (void)connectPeripheral:(CBPeripheral *)peripheral Completion:(void(^)(NSError *))completionBlock
{
[self.centralManager connectPeripheral:peripheral options:nil];
//保存連接回調(diào)
self.connectBlock = completionBlock;
}
第四步:發(fā)現(xiàn)外設(shè)服務(wù)
#pragma mark -流程4 開發(fā)發(fā)現(xiàn)外設(shè)的服務(wù)
//如果沒有尋找服務(wù)的話,外設(shè)的服務(wù)數(shù)組是空
//3.尋找外設(shè)的服務(wù),為nil則表示尋找所有的服務(wù)
[peripheral discoverServices:nil];
第五步:通過代理方法發(fā)現(xiàn)服務(wù)里的特征
#pragma mark -流程5 發(fā)現(xiàn)外設(shè)的服務(wù)
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
//遍歷外設(shè)的服務(wù)
for (CBService *service in peripheral.services) {
//實際工作中蔑匣,智能硬件開發(fā),硬件工程師會給你一份藍牙協(xié)議觅赊,協(xié)議中會表名哪一個功能對應(yīng)哪一個服務(wù)
NSLog(@"服務(wù)UUID:%@",service.UUID);
#pragma mark -流程6 發(fā)現(xiàn)服務(wù)的特征
//開始尋找服務(wù)的特征 第一個參數(shù):特征UUID 為nil表示尋找所有特征 第二個參數(shù):服務(wù)
[peripheral discoverCharacteristics:nil forService:service];
}
}
第五步:也是通過代理方法發(fā)現(xiàn)服務(wù)的特征
#pragma mark -流程6 發(fā)現(xiàn)服務(wù)的特征
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error
{
for (CBService *service in peripheral.services) {
//遍歷服務(wù)的特征
for (CBCharacteristic *characteristic in service.characteristics) {
//特征是中心與外設(shè)進行數(shù)據(jù)交互最小的單位? 所有的數(shù)據(jù)的發(fā)送都是發(fā)送給特征的? 每一個特征都對應(yīng)一個非常細節(jié)的功能:
NSLog(@"特征UUID:%@",characteristic.UUID);
//開啟與特征之間的通知(中心與外設(shè)長連接,當(dāng)特征發(fā)送數(shù)據(jù)過來時,能夠及時收到)
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
//讀取特征服務(wù)搂擦,一次性
//? ? ? [peripheral readValueForCharacteristic:c];
//例如我的小米手環(huán)1代? 其中? 2A06這一個特征表示尋找手環(huán)功能? 如果給該特征發(fā)送一個? 二進制為2的指令? 此時手環(huán)會震動
第六步:給特征發(fā)送數(shù)據(jù)(這里根據(jù)自己的需求來做)
#pragma mark -7.給特征發(fā)送數(shù)據(jù)(根據(jù)實際的特征UUID來做)
if ([[characteristic.UUID UUIDString] isEqualToString:@"2A06"]) {
/**
Value:給特征發(fā)送的數(shù)據(jù)
Characteristic:特征
type:特征的類型 實際開發(fā)過程中:特征的類型不能寫錯 具體的情況我們可以兩個都試一下 CBCharacteristicWriteWithResponse 該類型需要回應(yīng)
CBCharacteristicWriteWithoutResponse,不需要回應(yīng)
*/
Byte byte[1];
byte[0] = 2 & 0xff;
[peripheral writeValue:[NSData dataWithBytes:byte length:1] forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse];
}
}
}
}
第七步:雙方互發(fā)數(shù)據(jù)(這里也是根據(jù)需求來做)
//給特征發(fā)送數(shù)據(jù)回調(diào)
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error
{
}
#pragma mark- 獲取外設(shè)發(fā)來的數(shù)據(jù)纱烘,不論是read和notify,獲取數(shù)據(jù)都是從這個方法中讀取杨拐。
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
NSLog(@"外設(shè)發(fā)送過來的數(shù)據(jù):%@",characteristic.value.description );
}
#pragma mark- 中心讀取外設(shè)實時數(shù)據(jù)
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
if (error) {
}
if (characteristic.isNotifying) {
//讀取外設(shè)數(shù)據(jù)
[peripheral readValueForCharacteristic:characteristic];
NSLog(@"%@",characteristic.value);
} else {
}
}