Hes*_*ter 2 bluetooth objective-c ios core-bluetooth cbperipheralmanager
我正在尝试将 iPhone 设置为心率监视器并使用标准心率服务发送信息,以便我在 PC 上运行的应用程序可以检索数据。我是 iOS 新手,但之前我已经在 Android 和 Windows 上运行过蓝牙功能。我正在关注这里的信息,但我在第一个障碍处就跌倒了......
根据文档中的指定,我首先调用
CBPeripheralManager *myPeripheralManager = [[CBPeripheralManager alloc] initWithDelegate:(id<CBPeripheralManagerDelegate>)self queue:nil options:nil];
Run Code Online (Sandbox Code Playgroud)
我还实现了 PeripheralManagerDidUpdateState 回调,但问题就在这里。这个回调永远不会运行!我等了几分钟,什么也没发生。我怀疑我错过了一个非常简单的步骤,因为我搜索了一整天,但在网上什么也没找到!谁能解释一下在代码中和用我的 iPhone 进行实际操作时要采取的明确步骤吗?在这个回调运行之前它必须有连接吗?它必须与任何东西配对吗?
这是完整的代码。一切运行良好,我没有收到任何错误。
#import "ViewController.h"
@import CoreBluetooth;
@interface ViewController()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"App running...");
//Create the peripheral manager
CBPeripheralManager *myPeripheralManager = [[CBPeripheralManager alloc] initWithDelegate:(id<CBPeripheralManagerDelegate>)self queue:nil options:nil];
}
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{
int state = peripheral.state;
NSLog(@"Peripheral manager state = %d", state);
//Set the UUIDs for service and characteristic
CBUUID *heartRateServiceUUID = [CBUUID UUIDWithString: @"180D"];
CBUUID *heartRateCharacteristicUUID = [CBUUID UUIDWithString:@"2A37"];
CBUUID *heartRateSensorLocationCharacteristicUUID = [CBUUID UUIDWithString:@"0x2A38"];
//char heartRateData[2]; heartRateData[0] = 0; heartRateData[1] = 60;
//Create the characteristics
CBMutableCharacteristic *heartRateCharacteristic =
[[CBMutableCharacteristic alloc] initWithType:heartRateCharacteristicUUID
properties: CBCharacteristicPropertyNotify
value:nil
permissions:CBAttributePermissionsReadable];
CBMutableCharacteristic *heartRateSensorLocationCharacteristic =
[[CBMutableCharacteristic alloc] initWithType:heartRateSensorLocationCharacteristicUUID
properties:CBCharacteristicPropertyRead
value:nil
permissions:CBAttributePermissionsReadable];
//Create the service
CBMutableService *myService = [[CBMutableService alloc] initWithType:heartRateServiceUUID primary:YES];
myService.characteristics = @[heartRateCharacteristic, heartRateSensorLocationCharacteristic];
//Publish the service
NSLog(@"Attempting to publish service...");
[peripheral addService:myService];
//Set the data
NSDictionary *data = @{CBAdvertisementDataLocalNameKey:@"iDeviceName",
CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:@"180D"]]};
//Advertise the service
NSLog(@"Attempting to advertise service...");
[peripheral startAdvertising:data];
}
- (void)peripheralManager:(CBPeripheralManager *)peripheral
didAddService:(CBService *)service
error:(NSError *)error {
if (error) {
NSLog(@"Error publishing service: %@", [error localizedDescription]);
}
else NSLog(@"Service successfully published");
}
- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral
error:(NSError *)error {
if (error) {
NSLog(@"Error advertising: %@", [error localizedDescription]);
}
else NSLog(@"Service successfully advertising");
}
@end
Run Code Online (Sandbox Code Playgroud)
myPeripheralManager一旦方法返回,该对象就会被释放viewDidLoad,因为只有一个引用指向该对象,并且它超出了范围。
解决方案是创建一个ViewController引用以下实例的属性CBPeripheralManager:
@interface ViewController()
@property (nonatomic, strong) CBPeripheralManager *myPeripheralManager;
@end
Run Code Online (Sandbox Code Playgroud)
然后初始化该属性viewDidLoad:
self.myPeripheralManager = myPeripheralManager = [[CBPeripheralManager alloc] initWithDelegate:(id<CBPeripheralManagerDelegate>)self queue:nil options:nil];
Run Code Online (Sandbox Code Playgroud)
您可能想阅读有关 Objective-C 中内存管理(特别是自动引用计数)的更多信息。
| 归档时间: |
|
| 查看次数: |
2368 次 |
| 最近记录: |