ReConnect BLE Device

本文介绍了如何使用UUID通过CoreBluetooth框架连接蓝牙设备,并对比了iOS7与iOS8版本在连接过程中的不同实现方法。重点讨论了如何在iOS8版本中使用NSUUID来管理UUID,并提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

取得UUID

先前文章CoreBluetooth For Central (3)中,在didDiscoverPeripheral Delegate取得可連線裝置的物件CBPeripheral

1
2
3
4
5
6
//-----------start-----------
- ( void )centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:( NSDictionary *)advertisementData RSSI:( NSNumber *)RSSI {
  NSLog (@ "%" ,peripheral);
}
 
//------------end------------

CBPeripheral內容印出時會得到下面內容:

<CBPeripheral: 0x14d3f810 identifier = 9D027D39-5A77-3B6B-BC45-5A1E00115269, Name = "TI BLE Keyfob", state = disconnected>

其中identifier為裝置的UUID,將它記錄下來可以在重新連線中使用。

重新連線方法

重新連線的方式依照iOS版本分為兩種如下:

iOS 7 以前
- (void)retrievePeripherals:(NSArray *)peripheralUUIDs

iOS 8 之後
- (NSArray *)retrievePeripheralsWithIdentifiers:(NSArray *)identifiers

iOS 7之前使用上只需利用此方法後,整個過程就會自動連線至裝置,但iOS 8之後分的比較細,個人認為比較有流程,也就是需要使用此方法取得裝置的CBPeripheral物件後,再利用此物件來連線,意思iOS 8需要兩個流程:

  1. 取得裝置CBPeripheral

  2. 連線至裝置

該方法在使用時可以傳入多個UUID,後續流程也相同,範例中都只針對單一BLE週邊連線做說明。

使用UUID連線至裝置

這裡有兩個版本的程式如下:

iOS 7
1
2
3
4
//-----------start-----------
     CFUUIDRef uuid = CFUUIDCreateFromString( nil , (CFStringRef) @ "9D027D39-5A77-3B6B-BC45-5A1E00115269" );
     [CM retrievePeripherals:[ NSArray arrayWithObject:(__bridge id )(uuid) ]];
//------------end------------
iOS 8
1
2
3
4
5
6
7
8
9
10
11
//-----------start-----------
<br>    NSUUID *uuid = [[NSUUID UUID] initWithUUIDString:@ "9D027D39-5A77-3B6B-BC45-5A1E00115269" ];
     NSArray *peripheralArray = [CM retrievePeripheralsWithIdentifiers:[ NSArray arrayWithObject:uuid]];
     //成功後會返回裝置CBPeripheral物件,範例使用UUID只傳入一個UUID至陣例,所以陣列返回內容只會有一個物件
     if (peripheralArray.count>0) {
         NSLog (@ "%@" ,[peripheralArray objectAtIndex:0]);
         [CM connectPeripheral:[peripheralArray objectAtIndex:0] options: nil ];
     } else {
         NSLog (@ "fail" );
     }
//------------end------------

後續的過程、Service的使用需一般方式相同,這裡附帶一提的是,iOS 8後將UUID改由NSUUID物件來管理使用,當然也變的比較方便。

 

 

http://cms.35g.tw/coding/corebluetooth-central-5/

转载于:https://www.cnblogs.com/iOSJason/p/4704412.html

#include <BLEDevice.h> #include <BLEScan.h> #include <BLEAdvertisedDevice.h> #include <BLEUtils.h> #include <BLE2902.h> #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHARACTERISTIC_UUID_RX "beb5483e-36e1-4688-b7f5-ea07361b26a8" #define CHARACTERISTIC_UUID_TX "d0a0a1d0-0a1d-4b0f-9c6a-7b2b8c9d0e0f" static BLEAdvertisedDevice* myDevice; bool doConnect = false; bool connected = false; static int lock_status= 0; BLERemoteCharacteristic* pRemoteCharacteristic; BLEClient* pClient; // 扫描回调 class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { if (advertisedDevice.getName() == "ESP32_BLE_Server") { advertisedDevice.getScan()->stop(); myDevice = new BLEAdvertisedDevice(advertisedDevice); doConnect = true; } } }; // 通知回调 static void notifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { String data = String((char*)pData); // 直接转换为字符串 Serial.print("Received: "); Serial.println(data); if (data == "0x00") { Serial.println("关锁"); lock_status=0; //String txValue = "locked"; //pRemoteCharacteristic->writeValue(txValue.c_str(), txValue.length()); } else if (data == "0x01") { Serial.println("开锁"); lock_status=1; //String txValue = "unlocked"; //pRemoteCharacteristic->writeValue(txValue.c_str(), txValue.length()); } } void connectToServer() { Serial.print("Connecting to "); Serial.println(myDevice->getAddress().toString().c_str()); pClient = BLEDevice::createClient(); pClient->connect(myDevice); connected = true; // 获取服务 BLERemoteService* pRemoteService = pClient->getService(SERVICE_UUID); if (pRemoteService == nullptr) { Serial.println("Service not found"); return; } // 获取发送特征(用于接收通知) pRemoteCharacteristic = pRemoteService->getCharacteristic(CHARACTERISTIC_UUID_TX); if (pRemoteCharacteristic == nullptr) { Serial.println("TX characteristic not found"); return; } pRemoteCharacteristic->registerForNotify(notifyCallback); // 获取接收特征(用于写入数据) BLERemoteCharacteristic* pWriteCharacteristic = pRemoteService->getCharacteristic(CHARACTERISTIC_UUID_RX); if (pWriteCharacteristic == nullptr) { Serial.println("RX characteristic not found"); return; } // 主循环中用于发送数据 while (connected) { if(lock_status==0) { String txValue = (char*)lock_status; pWriteCharacteristic->writeValue(txValue.c_str(), txValue.length()); Serial.print("Sent: "); Serial.println(txValue); }else if(lock_status==1) { String txValue = (char*)lock_status; pWriteCharacteristic->writeValue(txValue.c_str(), txValue.length()); Serial.print("Sent: "); Serial.println(txValue); } delay(10); } } void setup() { Serial.begin(115200); Serial.println("Starting BLE Client..."); BLEDevice::init(""); // 开始扫描 BLEScan* pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); pBLEScan->start(30); } void loop() { if (doConnect) { connectToServer(); doConnect = false; } delay(1000); } 这是BLE客户端,为什么会不停连接断开
07-03
内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值