连接串行蓝牙设备时遇到问题

12

我遇到了两个与常规蓝牙相关的问题。这是我的代码。

- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self    selector:@selector(showElements) userInfo:nil repeats:NO]; 
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(accessoryConnected:) name:EAAccessoryDidConnectNotification object:nil];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(accessoryDisconnected:) name:EAAccessoryDidConnectNotification object:nil];    
    [[EAAccessoryManager sharedAccessoryManager]registerForLocalNotifications];
}

-(void)showElements{
    [[EAAccessoryManager sharedAccessoryManager] showBluetoothAccessoryPickerWithNameFilter:nil completion:^(NSError *error) {
        if (error) {
            NSLog(@"error :%@", error);
        }
        else{
            NSLog(@"Its Working");
        }
    }];    
}

- (void)accessoryConnected:(NSNotification *)notification
{    
    EAAccessory *connectedAccessory = [[notification userInfo] objectForKey:EAAccessoryKey];

}

1)建立连接后我收到了这个错误。

error :Error Domain=EABluetoothAccessoryPickerErrorDomain Code=1 "(null)"

以下是完整的日志:

BTM: attaching to BTServer
BTM: setting pairing enabled
BTM: found device "ESGAA0010" 00:04:3E:95:BF:82
BTM: disabling device scanning
BTM: connecting to device "ESGAA0010" 00:04:3E:95:BF:82
BTM: attempting to connect to service 0x00000080 on device "ESGAA0010" 00:04:3E:95:BF:82
BTM: connection to service 0x00000080 on device "ESGAA0010" 00:04:3E:95:BF:82 succeeded
BTM: setting pairing disabled
error :Error Domain=EABluetoothAccessoryPickerErrorDomain Code=1 "(null)"

你可以看到日志的最后一行,显示了错误。我搜索并发现苹果文档说这个错误意味着设备未被找到(EABluetoothAccessoryPickerResultNotFound),但是如果设备没有被找到,为什么日志中它显示已连接。

2) accessoryConnected: 方法没有被调用。这很可能是由于第一个问题引起的。但我认为在这里提一下也值得一提。

我已经添加了 ExternalAccessory 框架,设备也符合 MFI 要求。请帮助我解决这些问题。谢谢


如果您尝试使用EAAccessorySelectedKey而不是EAAccessoryKey,请注意。根据文档,不知道正确的键应该是哪个,一个是当选择器显示连接时。此外,您获得的错误输出是在EAAccessory *connectedAccessory行之前还是之后? - Larme
@Larme 谢谢回复,但是方法本身没有被调用...那么这似乎不是问题所在。 - Kundan
它是在哪个设备上测试的?iOS版本是多少? - Larme
我正在iPhone 6和iPhone 5上进行测试,分别使用iOS 9.1和iOS 8.4。 - Kundan
@Shivaay 我遇到了这个错误:Error Domain=EABluetoothAccessoryPickerErrorDomain Code=2 "(null)"。 - sandeep tomar
2个回答

15

我今天遇到了同样的问题。解决方法很简单,你需要在你的 .plist 文件中添加额外的一行。

<key>UISupportedExternalAccessoryProtocols</key>
<array>
    <string>YOUR_DEVICE_PROTOCOL</string>
</array>

如果设备被添加到MFi计划中,它应该有自己的协议。请查看您设备的文档或者询问设备的创建者。

编辑

[[EAAccessoryManager sharedAccessoryManager] showBluetoothAccessoryPickerWithNameFilter:nil completion:^(NSError *error) {
    if (error) {
        NSLog(@"error :%@", error);
    }
    else{
        NSLog(@"Its Working");
    }
}]; 

错误是EABluetoothAccessoryPickerError的实例。有可能的值:

public enum Code : Int {
    public typealias _ErrorType = EABluetoothAccessoryPickerError

    case alreadyConnected
    case resultNotFound
    case resultCancelled
    case resultFailed
}

您的错误代码是1,因此resultNotFound。请注意,在修复.plist文件showBluetoothAccessoryPickerWithNameFilter时,有时会返回错误代码= 0。然后没有错误,因为您的设备是case alreadyConnected。我添加了这些信息,因为在发现这一点之前,我浪费了很多时间。 :)

祝你好运。

编辑(Swift 3.0)

EAAccessoryManager.shared().showBluetoothAccessoryPicker(withNameFilter: nil) { (error) in
    if let error = error {
        switch error {
        case EABluetoothAccessoryPickerError.alreadyConnected:
            break
        default:
            break
        }
    }
}

我想知道你是否有Swift 3.0的版本?我正在努力在UIAlertView中向用户显示此错误,你是如何调用这个case的?case不应该有int 0到3吗? - Jonas
我更新了我的答案,使用Swift 3.0版本并添加了错误处理。 - Kamil Harasimowicz
1
UIAlert​View自iOS 9起已被弃用,请改用UIAlertController - Kamil Harasimowicz
1
谢谢你们的帮助。 - Jonas

1
尝试进入iOS蓝牙设置,取消配对设备并重新配对。我之前遇到了"305"错误,问题是我已经配对了设备,然后更新了设备的固件。之后它就无法再连接,直到我从iPhone中删除了设备,然后在设备固件更新后重新配对。这可能对您无效,但互联网上关于305错误的信息很少,希望这能帮助到某些人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接