Получение RSSIValue от IOBluetoothHostController - PullRequest
0 голосов
/ 19 октября 2010

Я пытаюсь написать простое приложение, которое собирает RSSIValue и отображает его через NSLog, мой код выглядит следующим образом:

#import <Foundation/Foundation.h> 
#import <Cocoa/Cocoa.h> 
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>
#import <IOBluetooth/objc/IOBluetoothHostController.h>
#import <IOBluetooth/IOBluetoothUtilities.h>

@interface getRSSI: NSObject {}
-(void) readRSSIForDeviceComplete:(id)controller device:(IOBluetoothDevice*)device 
                             info:(BluetoothHCIRSSIInfo*)info error:(IOReturn)error; 
@end

@implementation getRSSI
- (void) readRSSIForDeviceComplete:(id)controller device:(IOBluetoothDevice*)device 
                              info:(BluetoothHCIRSSIInfo*)info error:(IOReturn)error
{
    if (error != kIOReturnSuccess) {
        NSLog(@"readRSSIForDeviceComplete return error");
        CFRunLoopStop(CFRunLoopGetCurrent());
    }
    if (info->handle == kBluetoothConnectionHandleNone) {
        NSLog(@"readRSSIForDeviceComplete no handle");
        CFRunLoopStop(CFRunLoopGetCurrent());
    }
    NSLog(@"RSSI = %i dBm ", info->RSSIValue);
    [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 5]];
    [device closeConnection];
    [device openConnection];
    [controller readRSSIForDevice:device];
}
@end

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSLog(@"start"); 

    IOBluetoothHostController *hci = [IOBluetoothHostController defaultController];
    NSString *addrStr = @"xx:xx:xx:xx:xx:xx";
    BluetoothDeviceAddress addr;
    IOBluetoothNSStringToDeviceAddress(addrStr, &addr);
    IOBluetoothDevice *device = [[IOBluetoothDevice alloc] init];
    device = [IOBluetoothDevice withAddress:&addr];
    [device retain];
    [device openConnection];
    getRSSI *rssi = [[getRSSI alloc] init];
    [hci setDelegate:rssi];
    [hci readRSSIForDevice:device];
    CFRunLoopRun();
    [hci release];
    [rssi release];
    [pool release]; 
    return 0; 
}

Проблема, с которой я сталкиваюсь, заключается в том, что readRSSIForDeviceComplete, кажется, работает нормально, информация передается по значению. Проблема заключается в том, что значение RSSI кардинально отличается от того, которое я могу просмотреть в OS X, щелкнув по значку bluetooth вверху. Для моего приложения типично выводить значения 1,2, -1, -8 и т. Д., Когда в меню отображается -64 дБм, -66, -70, -42 и т. Д.

Я был бы очень признателен за руководство.

1 Ответ

0 голосов
/ 28 декабря 2010

Значение, которое вы получаете от readRSSIForDeviceComplete, является значением RSSI. Значение, отображаемое через OS X при щелчке по меню или нажатии Alt при нажатии на меню BlueTooth, представляет собой Raw RSSI-значение.

Предполагая, что у вас есть Инструменты разработчика, вы можете увидеть оба значения с помощью «Проводника Bluetooth» (/ Разработчик / Приложения / Bluetooth / Проводник Bluetooth). Я понятия не имею, какая значимая разница существует между этими двумя значениями, но для меня они, кажется, постоянно различаются на величину -60.

Таким образом, ваши значения RSSI 1, 2, -1, -8 будут соответствовать необработанным значениям RSSI -59, -58, -61, -68.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...