从外部蓝牙扫描仪捕获iOS密钥代码

时间:2014-08-01 18:37:45

标签: ios bluetooth barcode-scanner

我正在尝试在iOS中扫描包含不可打印字符的二维条码。我有一个我想支持的多个扫描仪。当使用SDK通过串行端口配置文件(SPP)连接时,我可以很好地读取所有这些数据。我想支持的其中一个设备只支持人机接口设备(HID)(外部键盘)。

当我在HID模式下使用扫描仪来填充UITextField时,将删除不可打印的字符。我已将设备连接到笔记本电脑,并使用密钥代码捕获设备查看数据是否实际发送过。

是否有办法使用来自连接为HID的蓝牙设备的不可打印字符填充UITextField?

1 个答案:

答案 0 :(得分:5)

我发现如何从HID模式下连接到iOS的蓝牙设备接收不可打印的密钥代码。

作为参考,2D条形码具有以下通用格式:

[)><RS>'01'<GS>'9612345'<GS>'111'<GS>'000'<GS>'012345678901234'<GS>'FDEB'<GS><GS><GS><GS><GS>'25'<GS>'Y'<GS>'123 1ST AVE'<GS>'SEATTLE'<GS>'WA'<RS><EOT>

其中&lt; RS&gt;是char(30)或序列ctrl- ^,&lt; GS&gt;是char(29)或序列ctrl-],&lt; EOT&gt;是char(4)或ctrl-d,它们是ASCII control codes

在iOS 7及更高版本中,您可以使用UIKeyCommand从HID蓝牙设备捕获Key Down事件。 UIKeyCommand用于从蓝牙键盘捕获Command-A之类的东西,但它也可用于映射ASCII序列。诀窍是映射密钥代码序列而不是ASCII代码。例如,在视图控制器中,您可以:

- (NSArray *) keyCommands {
    // <RS> - char(30): ctrl-shift-6 (or ctrl-^)
    UIKeyCommand *rsCommand = [UIKeyCommand keyCommandWithInput:@"6" modifierFlags:UIKeyModifierShift|UIKeyModifierControl action:@selector(rsKey:)];
    // <GS> - char(29): ctrl-]
    UIKeyCommand *gsCommand = [UIKeyCommand keyCommandWithInput:@"]" modifierFlags:UIKeyModifierControl action:@selector(gsKey:)];
    // <EOT> - char(4): ctrl-d
    UIKeyCommand *eotCommand = [UIKeyCommand keyCommandWithInput:@"D" modifierFlags:UIKeyModifierControl action:@selector(eotKey:)];
    return [[NSArray alloc] initWithObjects:rsCommand, gsCommand, eotCommand, nil];
}

- (void) rsKey: (UIKeyCommand *) keyCommand {
    NSLog(@"<RS> character received");
}

- (void) gsKey: (UIKeyCommand *) keyCommand {
    NSLog(@"<GS> character received");
}

- (void) eotKey: (UIKeyCommand *) keyCommand {
    NSLog(@"<EOT> character received");
}

我希望这会有所帮助。