当前位置: 首页 > 知识库问答 >
问题:

蓝牙打印会在不同的设备上从套接字引发IOException

酆英达
2023-03-14

我正在尝试通过蓝牙打印到热敏打印机。

我以前能够在Nexus 7设备(第一代和第二代)上成功打印。然而,当我将完全相同的代码复制粘贴到不同的应用程序上,并将其部署到华硕平板电脑上时,我突然得到一个IOException,告诉我我的套接字可能已关闭。

这是我的代码:

public void onPrintReceipt(){

    Toast.makeText(getApplicationContext(), "Printing", Toast.LENGTH_LONG).show();

    try{
        Set<BluetoothDevice> bdevices = bluetoothAdapter.getBondedDevices();
        blueToothDevice = bluetoothAdapter.getRemoteDevice("00:01:90:EE:B2:52");

        simpleComm(1);
    }
    catch(Exception ex){
        Log.e("", "simpleComm() Catch Statement Entered");
    }
}


protected void simpleComm(Integer port){

    //InputStream tmpIn = null;
    byte[] buffer = new byte[3]; //{65,65,53,53,49,52,65,66,67,68};

    buffer[0] = (byte) 0x08;
    buffer[1] = (byte) 0x99;
    buffer[2] = (byte) 0x04;
    OutputStream tmpOut;// = null;

    bluetoothAdapter.cancelDiscovery();

    Log.e(this.toString(), "Port = " + port);
    try {


        UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        Method m = blueToothDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });

        socket = (BluetoothSocket) m.invoke(blueToothDevice, port);

        // assert (socket != null) : "Socket is Null";
        if(socket.isConnected()){
            socket.close();
        }
        socket.connect();

        try {

            Log.e(this.toString(), "************ CONNECTION SUCCEES! *************");
            try{
                //tmpIn=socket.getInputStream();
                tmpOut = socket.getOutputStream();

                //mmInStream = tmpIn;
                mmOutStream = tmpOut;
                out = new BufferedWriter(new OutputStreamWriter(mmOutStream));

            }
            catch(Exception ex){
                Log.e(this.toString(), "Exception " + ex.getMessage());
            }

            //TODO print sequence starts here

            //....snip snip a LOT of code

        }
        finally{

            mmOutStream.flush();

            mmOutStream.close();
            socket.close();

        }

    }
    catch (IOException ex){
        Log.e(this.toString(), "IOException: " + ex.getMessage());
    }
    catch (NoSuchMethodException ex){
        Log.e(this.toString(), "NoSuchMethodException: " + ex.getMessage());
    }
    catch (IllegalAccessException ex){
        Log.e(this.toString(), "IllegalAccessException: " + ex.getMessage());
    }
    catch (InvocationTargetException ex){
        Log.e(this.toString(), "InvocationTargetException: " + ex.getMessage());
    }

}

这里是来自try-cat块的错误:

IOException: read failed, socket might closed or timeout, read ret: -1

现在我很困惑,为什么当我所做的只是将代码部署到不同的设备上时会突然出现错误。

我该如何进行?

共有1个答案

郜彬
2023-03-14

我看到你使用反射来创建RFCOMM连接。这相当危险,我最近回答了一个问题:蓝牙SDP和UUID是如何工作的?(专门针对Android)

tl; dr:您正在绕过SDP查找机制,该机制将UUID映射到您连接到的设备上的适当蓝牙信道。您的代码始终连接到蓝牙通道1。这可能在最初/某些情况下有效——但也可能是你的问题。这取决于接收设备。

您正在创建UUID。我猜(希望)你从打印机的留档拿到了?但是如果你检查你的代码,你会发现你没有用它来连接打印机——这是你绝对应该做的(参考链接的答案,了解整个故事)。使用createRfcomSocketToServiceRecords(uuid)打开套接字。

因为您使用的是Nexus 7:我使用了两台Nexus 7、一台Nexus 4和10台其他设备来测试我编写的android蓝牙中间件。尤其是Nexus设备非常敏感,因为很多并发呼叫都会给蓝牙带来压力,导致蓝牙适配器完全无用,直到我重启它们。此外,我想我还记得,当我使用这个黑客反射片段填充bt适配器的通道时,出现了一个错误,直到没有人留下,导致蓝牙完全失败(我无法找到相关官方android错误报告的链接,但Nexus设备有一个)。

 类似资料:
  • 我有一个应用程序,打印数据(文本和图像)到热敏打印机。 我的问题是,每当我打印冗长的数据时,打印输出就会被剪切,我会在打印的try-catch语句中抛出一个。 以下是我打印数据的部分: 这是我的打印签名功能,它类似于我用来打印徽标的功能。 ConvertBitmap函数: convertArgbToGrayScale函数: 我现在的问题是,在调用printSignature()函数后,打印机停止打

  • 我正在编写一个Android应用程序,它应该可以通过蓝牙发现设备。 我没有得到任何例外,但设备只是没有找到,即使我的windows pc找到他们(并可以找到自己)。 我肯定他们是好的,但我两种方法都试过了。当然我也分别试过了。 下面是我的ListActivity,它搜索设备: 日志显示扫描后MLEDeviceListAdapter:0和扫描后isEmpty():true。 则从不调用该日志(onS

  • 我已经开发了一个android应用程序来从蓝牙打印机打印账单,我的代码抛出的异常是“java.lang.NullPointerException:试图在空对象引用上调用虚拟方法'void java.io.OutputStream.write(byte[])”。 连接蓝牙打印机并发送数据进行打印的代码如下: //这将找到一个蓝牙打印机设备 //打印数据的代码

  • 连接设备 接口说明 用于连接 扫描出来的蓝牙设备。 参数说明 字段 类型 必须? 说明 device RKBLEDevice 是 蓝牙设备 示例代码 Swift: RokidMobileSDK.binder.connect(device: RKBLEDevice) Objc: [RokidMobileSDK.binder connect:device]; 断开设备 接口说明 用于断开已经连接的

  • 连接蓝牙设备 接口说明 接口需传入蓝牙名称(蓝牙address重启后会变) 参数说明 字段 类型 必须? 说明 name String 是 设备名称 举个大栗子 RokidMobileSDK.binder.connectBT(name, new IBTConnectCallBack() { @Override public void onConnectSucceed(BTDevic

  • 我如何获得Android所有已连接蓝牙设备的列表,而不考虑配置文件? 或者,我看到您可以通过BluetoothManager获取特定配置文件的所有连接设备。获取连接的设备。 我想我可以通过ACTION_ACL_CONNECTED/ACTION_ACL_DISCONNECTED监听连接/断开来查看哪些设备连接...似乎容易出错。 但我想知道是否有更简单的方法来获取所有已连接蓝牙设备的列表。