使用手持蓝牙打印机与安卓设备配对

37

我有一台蓝牙手持打印机,可以通过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时,这似乎才有效。所以这意味着我正在做正确的事情。


你是否正在使用SPP UUID?(private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");) - 我猜你很可能在使用,如果你不是的话,打印机可能不会接受连接,但无论如何,我还是想确认一下。 - Trevor
createInsecureRfcommSocket 方法不接受 UUID 作为参数,只接受通道。由于没有 PIN,创建安全通道不是一个选项。 - navjotk
你尝试过使用接受UUID的公共API使其工作吗?http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createInsecureRfcommSocketToServiceRecord%28java.util.UUID%29 我知道它只在较新版本的Android SDK中才有,但值得一试,看看是否可行。 - Tom Whittock
2个回答

11

@Trevor Page 我觉得他走在正确的道路上。这是我用来连接 Basic Stamp 微控制器的 Google 示例。

Okay, I'm ready. What would you like to know?

测试是否正常工作。

BluetoothService mService = new BluetoothService(this, mHandler);
mService.write(Bytes);

-6

1
他想通过蓝牙连接,而不是在办公室或家里连接电脑和打印机。 - blindstuff
这里我特别谈论的是一种基于蓝牙的热敏打印机。谷歌云打印可能适用于通用解决方案。 - navjotk

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