我有一台蓝牙手持打印机,可以通过Mac电脑(使用Coolterm)使用SPP连接进行通信。但是当我尝试从Android(使用平台7)做同样的事情时,遇到了多个问题:
打印机似乎不支持/需要PIN认证。在从OSX连接时,我只需选择“不使用PIN”,它就会完成配对。但是在Android上,当我使用
device.createRfcommSocketToServiceRecord()
时,它总是要求我输入PIN/密钥(我没有/不需要)。我使用反射技巧解决了这个问题:Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); BluetoothSocket connection = (BluetoothSocket) m.invoke(device, 1);
我不确定这是否有效,但打印机上闪烁的LED停止闪烁,这让我相信它有效。
一旦我拥有了套接字,我尝试使用以下方式向流中写入字节数据:
byte[] buffer = new byte[3]; buffer[0] = (byte) 0x8A; buffer[1] = (byte) 0xC1; buffer[2] = (byte) 0x04; outStream.write(buffer); int response = inStream.read(); mySocket.close();
从Coolterm发送相同的三字节序列到OSX,可以从打印机打印测试页。然而,在Android上似乎会使线程挂起(读取部分)。
我有什么遗漏的吗?
编辑:只有当我将通道设置为1时,这似乎才有效。所以这意味着我正在做正确的事情。
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
) - 我猜你很可能在使用,如果你不是的话,打印机可能不会接受连接,但无论如何,我还是想确认一下。 - TrevorcreateInsecureRfcommSocket
方法不接受 UUID 作为参数,只接受通道。由于没有 PIN,创建安全通道不是一个选项。 - navjotk