Re: Using CoreBluetooth from Command Line Tool
Re: Using CoreBluetooth from Command Line Tool
- Subject: Re: Using CoreBluetooth from Command Line Tool
- From: Andras Kovi <email@hidden>
- Date: Fri, 05 Apr 2013 01:33:32 +0200
I tried your code. Turned it to ARC and kept a reference to the WirelessBandManager in the main function. It works well for me. I tried it with the queue and the main queue too and with scan and retrieve.
Don't you have to retain the WirelessBandManager instance in the main function? Just asking. I generally use ARC and shiver from these retain-release calls.
Andras
On 2013.04.05., at 0:22, email@hidden wrote:
> 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