gpt4 book ai didi

java - 蓝牙打印在不同设备上从 Socket 抛出 IOException

转载 作者:行者123 更新时间:2023-12-01 11:25:20 27 4
gpt4 key购买 nike

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

我之前能够在 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-catch block 的错误:

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

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

我该如何继续?

最佳答案

我看到您使用反射来创建 RFCOMM 连接。这是相当危险的,我最近回答了一个这方面的问题:How do Bluetooth SDP and UUIDs work? (specifically for Android)

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

您正在创建一个 UUID。我想(希望)你从打印机的文档中得到了它?但是,如果您检查代码,您会发现您没有使用它连接到打印机 - 您绝对应该这样做(请参阅链接的答案,了解整个故事)。使用createRfcommSocketToServiceRecord(uuid)打开你的套接字。

由于您使用的是 Nexus 7:我使用了两台 Nexus 7、一台 Nexus 4 和其他 10 台设备来测试 bluetooth middleware for android我写。尤其是 Nexus 设备非常敏感,当蓝牙受到许多并发调用的压力时,导致蓝牙适配器完全无用,直到我重新启动它们。另外,我想请记住,当我使用这个黑客反射 fragment 时,会出现一个错误,该 fragment 会填满 bt 适配器的 channel ,直到没有人留下,导致蓝牙完全失败(我无法找到相关官方的链接) android 错误报告,但有一个针对 Nexus 设备的错误报告)。

关于java - 蓝牙打印在不同设备上从 Socket 抛出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857058/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com