安卓:SPP蓝牙设备之间切换(Android: Switch between SPP Bluetoo

2019-06-25 23:07发布

我有两个不同的蓝牙打印机。 BIXOLON SPP-R200和富士通FTP-628WSL110。 我可以连接到单独的每个人(使用三星Galaxy SII)打印,断开并重新连接就好了。 但是,如果我关掉BIXOLON并尝试配对的富士通(以前未成,BIXOLON仍配对),然后尝试连接到创建的套接字时失败。 同周围的其他方法。

以下是错误信息:

07-02 13:00:11.040: E/MyApp.BluetoothConnection(9380): Failed to connect to rfcomm socket.
07-02 13:00:11.040: E/MyApp.BluetoothConnection(9380): java.io.IOException: Service discovery failed
07-02 13:00:11.040: E/MyApp.BluetoothConnection(9380):  at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:406)
07-02 13:00:11.040: E/MyApp.BluetoothConnection(9380):  at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:217)
07-02 13:00:11.040: E/MyApp.BluetoothConnection(9380):  at MyApp.BluetoothConnection.connect(BluetoothConnection.java:171)
07-02 13:00:11.040: E/MyApp.BluetoothConnection(9380):  at MyApp.AbstractBluetoothPrinter.connect(AbstractBluetoothPrinter.java:34)

下面是代码,这使得连接尝试,即下解释的情况下失败的线是btSocket.connect(); - 例外见上面:

/** Is set in connect() */
private BluetoothSocket btSocket = null;
/** Is set prior to connect() */
private BluetoothSocket btDevice;

public boolean connect(){

        try {
            btSocket = btDevice.createRfcommSocketToServiceRecord("00001101-0000-1000-8000-00805F9B34FB");
            if (btDevice.getName().startsWith("FTP")) {
                //Special treatment for the fujitsu printer
                SystemClock.sleep(1000);
            }
        } catch (Throwable e) {
            LogCat.e(TAG, "Failed to create rfcomm socket.", e);
            return false;
        }

        try {
            // Stop Bluetooth discovery if it's going on
            BluetoothHandler.cancelDiscovery();
            // This fails under the described circumstances
            btSocket.connect();
        } catch (Throwable e) {
            LogCat.e(TAG, "Failed to connect to rfcomm socket.", e);
            return false;
        }

        // Obtain streams etc...
}

我使用的是相同的 UUID连接到两个设备从SDK API(但在同一时间只有一台设备处于开机状态,他们从来没有在同一时间开启),著名的SPP UUID:

00001101-0000-1000-8000-00805F9B34FB

这让我怀疑:莫非,我需要对每个设备进行不同的UUID? 如果有任何想法有哪些?

Answer 1:

确定后,尝试不同的解决方案好几天了,我现在能够在上述提到的打印机之间进行切换。 由于我不能完全肯定这是我的措施是为成功的原因,我会全部列出来,所以有人绊倒在这篇文章将对如何解决他的问题,蓝牙的一些线索。 有一两件事,但是我敢肯定:你并不需要不同的UUID来连接两个不同的打印机 - 您可以使用相同的UUID(但我只对他们有一个接通)

我认为缓存上次打印的设备-但是不像以前我不再缓存实际BluetoothDevice类 ,而不是我只缓存它的MAC地址,这是获得通过:

BluetoothDevice bluetoothDevice; 

//Obtain BluetoothDevice by looking through paired devices or starting discovery

bluetoothDevice.getAddress(); 

的getAddress()返回一个字符串:设备的硬件地址。 我缓存该MAC地址和下一个用户想打印的时候,我对阵所有配对打印机的MAC地址缓存的MAC地址 - 如果MAC地址匹配这些中的一个,我尝试连接到该打印机。 如果失败,重置我的缓存的MAC地址并试图找到通过先在另一台设备检查我配对的设备,如果他们中的一个可以连接(如果我可以成功连接我相应地更新我的缓存的MAC地址),如果失败,我开始蓝牙发现寻找其他潜在的设备。

现在,为了不留下任何套接字连接开到我的打印机之一我的日常如下(我离开了尝试,渔获我身边的每个调用,以缓解读包裹):

创建套接字

BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord(MY_UUID);

所述MY_UUID是指用于连接到SPP设备公知的UUID:

00001101-0000-1000-8000-00805F9B34FB

如果套接字创建失败(这是罕见的,如果它发生是最有可能是由于权限或蓝牙不足被禁用/不可用),我们不能继续进行,因为我们需要一个套接字连接到。 因此,在你的catch块,你应该触发断开方法(稍后更多)。

连接到创建的套接字

bSocket.connect();

如果连接失败,我们无法继续进行,因为我们需要一个有效的套接字连接,以获得输入和输出流。 因此,在你的catch块,你应该触发断开方法(稍后更多)。

获得的输入和输出流

下一步骤将是获得从插座的输入和输出流。 我这样做是在它运行了好几次(5次应该是足够了)一个for循环 - 在每个迭代我检查我是否有输出流,如果没有,我尝试获得它,同为输入流。 在循环结束时,我检查,如果我有我的两个流,如果是我退出循环(和整个连接方式),如果没有,我着手进行循环,然后再试一次。 我平时都在我的第一个循环迭代流,但是有时我需要两个或三个迭代,以获得两个流。

如果我达到循环声明显然我没有得到我的流还是其他什么东西出了问题后,下面的代码。 此时的连接被认为已经失败,我执行我的断开代码(清理开流和插座,后来更多)。

读/写

现在,你有你的目标蓝牙设备的连接,您可以执行读取和写入操作。 一旦你做到了,应该关闭所有流和插座,更多关于这个在未来一段清除:断开连接。 请记住:如果在读/写操作发生异常时,一定要触发断开方法,以清除您的资源。 如果您的打印机需要某种形式的初始化命令,确保连接到打印机和执行你的读/写操作之前之后发出这一权利。

断开

通常有两种场合上,您应该断开:

  • 一旦你与你的读/写操作完成
  • 如果某个地方发生了异常,一路走来,清理你的资源

关闭你的流

你要做的第一件事就是清理您的视频流,同时检查,你的输入和输出流,如果他们不为空,关闭它们,并将它们设置为null。 请务必将每个操作(关闭输入流,关闭输出流等)到其自己的try-catch否则没有做一个清理(由于抛出一个例外)将跳过所有其他清理措施。

关闭套接字

现在,你已经确认自己的输入流清理,着手关闭您的套接字连接,并设置其随后为null。

还有一两件事:我有我的断开方法在开始时的Thread.sleep和结束。 在开始时,一个约2.5秒(= 2500毫秒)长,目的是确保没有别的事情与打印机(如待读/写操作或打印机仍然打印等)。 第二个是了Thread.sleep在我的断开方法的结束,大约是800毫秒长。 其原因在睡眠到底是与试图关闭一个右后立即打开一个新的socket当我有问题。 有关详细信息,请参考这个答案 。

有问题吗?

如果任何人有与我的OP或我的回答的问题,请让我知道在评论,我会尽我所能来回答他们。



文章来源: Android: Switch between SPP Bluetooth Devices