Re: Using CoreBluetooth from Command Line Tool
Re: Using CoreBluetooth from Command Line Tool
- Subject: Re: Using CoreBluetooth from Command Line Tool
- From: email@hidden
- Date: Thu, 04 Apr 2013 15:22:46 -0700
It is a proprietary device I'm connecting with, so the UUID isn't changing (it is the same UUID I see when I scan from my GUI app or command line app).
The symptoms feel like a dead lock on the queue CoreBluetooth is using to send events. Being I have no visibility it is hard to know for sure.
Below is a stripped version of the code that fails to respond to the connect. Note: the UUID is hardcoded to simplify my testing. Using the same hardcoded UUID in my GUI version works and behaves as expected.
The debug log output is the following (nothing more)
2013-04-04 15:18:15.836 cbtest[4025:1303] Did update state to: 5
2013-04-04 15:18:15.838 cbtest[4025:1303] Did retrieve peripheral: <CBConcretePeripheral: 0x10010bf40>
-- dave
#import <Foundation/Foundation.h>
#import <IOBluetooth/IOBluetooth.h>
@interface WirelessBandManager : NSObject <CBCentralManagerDelegate>
{
CBCentralManager * mBLEManager;
CBPeripheral * mPeripheral;
dispatch_queue_t mBleDispatchQueue;
}
@end
@implementation WirelessBandManager
- (id)init
{
self = [super init];
if (self)
{
mBleDispatchQueue = dispatch_queue_create("com.xyz.ble.mgr", DISPATCH_QUEUE_SERIAL);
mBLEManager = [[CBCentralManager alloc] initWithDelegate:self queue:mBleDispatchQueue];
}
return self;
}
#pragma mark -
#pragma mark CBCentralManager Delegate Methods
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
NSLog(@"Did update state to: %d",(int)central.state);
if (central.state == CBCentralManagerStatePoweredOn)
{
NSMutableArray * uuids = [[NSMutableArray alloc] initWithCapacity:1];
NSString * uuidStr = @"42EF45DA-718D-42C2-AB91-A6588121E52A";
CFUUIDRef uuidRef = CFUUIDCreateFromString(NULL, (CFStringRef)uuidStr);
[uuids addObject:(id)uuidRef];
CFRelease(uuidRef);
[mBLEManager retrievePeripherals:uuids];
[uuids release];
}
}
- (void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals
{
mPeripheral = [peripherals[0] retain];
NSLog(@"Did retrieve peripheral: %@",mPeripheral);
NSDictionary *connOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey];
[mBLEManager connectPeripheral:mPeripheral options:connOptions];
}
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
NSLog(@"Did connect to peripheral: %@",peripheral);
}
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"Did FAIL to connect to peripheral: %@ Error:%@",peripheral,error);
}
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"Did disconnect from peripheral: %@ Error:%@",peripheral,error);
}
@end
#pragma mark -
#pragma mark MAIN
// =========================================================================
// main()
// =========================================================================
int main(int argc, const char * argv[])
{
@autoreleasepool
{
[[WirelessBandManager alloc] init];
dispatch_main();
}
return 0;
}
On Apr 4, 2013, at 2:34 PM, Andras Kovi <email@hidden> wrote:
> Hi Dave,
>
> I haven't tried to run CB in a command line app, but one little note: make sure you don't use WiFi while connected. WiFi and BLE interfere severely on my Mac Mini. I guess it's similar on the MacBook.
>
> Do you want to connect to an i* device or a proprietary one? i* devices change their BLE addresses every few minutes. If you don't use secure connection, then I think they can get out of sync. This is probably the reason why you need to do a scan. Command line or Cocoa should not make any difference IMHO.
>
> Andras
>
> On 2013.04.04., at 22:40, email@hidden wrote:
>
>> Hi,
>>
>> I'm trying to write a simple command line app that uses CoreBluetooth on an BLE capable mac book (OSX v10.8.3).
>>
>> If I use the retrievePeripherals I get the delegate didRetrievePeripherals to fire. If I then try to connect to the found peripheral, the didConnectPeripheral delegate never fires.
>>
>> However, if I scan for peripherals and get the delegate didDiscoverPeripheral to fire. I can then connect and connect succeeds. However, once I'm connected and have my characteristics, the data I receive from my peripheral is not reliably received.
>>
>> Using similar code in a GUI application works perfect.
>>
>> Has anyone else been successful running the CoreBluetooth stack from within a command line app?
>>
>> In my main I essentially create a dispatch_queue and let it run my operations via dispatch_async. Meanwhile, I let main just call dispatch_main().
>>
>> -- dave
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Bluetooth-dev mailing list (email@hidden)
>> Help/Unsubscribe/Update your Subscription:
>>
>> This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Bluetooth-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden