Java Android应用程序在30秒后丢弃Bluetooth 2 SPP数据流
问题。 在我的Android应用程序中,通过蓝牙2 SPP连接的数据流在大约30秒后挂起 上下文。 我正在尝试将运行android 4.3(第一代nexus 7)的android平板电脑作为客户端连接到由Atmega 1284P微控制器控制的Bluetooth 2 RN-41模块。微控制器只是通过USART线路将数据推送到蓝牙模块,我成功地连接到该模块,并在我的android应用程序中传输部分数据。然而,我注意到,大约30秒后,数据流停止(即使连接似乎持续存在)。这让我快发疯了,我不太确定到底出了什么问题。我是一个Android初学者。谢谢大家的帮助 Android代码。我取出了else和一些捕获,以缩短代码量,并试图将代码分解为逻辑的、有注释的部分。我是新手,所以如果我的代码很傻,我道歉Java Android应用程序在30秒后丢弃Bluetooth 2 SPP数据流,java,android,bluetooth,android-bluetooth,spp,Java,Android,Bluetooth,Android Bluetooth,Spp,问题。 在我的Android应用程序中,通过蓝牙2 SPP连接的数据流在大约30秒后挂起 上下文。 我正在尝试将运行android 4.3(第一代nexus 7)的android平板电脑作为客户端连接到由Atmega 1284P微控制器控制的Bluetooth 2 RN-41模块。微控制器只是通过USART线路将数据推送到蓝牙模块,我成功地连接到该模块,并在我的android应用程序中传输部分数据。然而,我注意到,大约30秒后,数据流停止(即使连接似乎持续存在)。这让我快发疯了,我不太确定到底出
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private BluetoothSocket btSocket = null;
private OutputStream outStream = null;
private InputStream inStream = null;
private BluetoothDevice pairedScale = null;
private UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); // found this at https://stackoverflow.com/questions/4632524/how-to-find-the-uuid-of-serial-port-bluetooth-device
private String MAC_ADDR;
private boolean isBTConnected = false;
...
public void connectToBT() {
/* * *
* Find Bluetooth device from list of paired devices
* * */
if (mBluetoothAdapter.isEnabled()) {
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
MAC_ADDR = macSpinner.getItemAtPosition(macSpinner.getSelectedItemPosition()).toString();
for (BluetoothDevice device : pairedDevices) {
Log.v("HP", "Iterating through paired BT devices for a match");
if (MAC_ADDR.equals(device.toString())) {
pairedScale = device;
Toast.makeText(MainActivity.this, device.toString(), Toast.LENGTH_LONG).show();
Log.v("HP", "Found a BT device match: " + device.toString());
changeDisplayText("\nUsing paired device: " + device.toString(), true);
break;
}
}
}
/* * *
* Spawn new thread and attempt to connect
* * */
// If socket created successfully, spawn new thread
if (btSocket != null) {
new Thread(new Runnable() {
public void run() {
isConnecting = true;
// try to connect
try {
btSocket.connect();
} catch (IOException e) {
e.printStackTrace();
Log.e("HP", "Couldn't connect socket");
}
/* * *
* Create IO Streams
* * */
// create IO stream
if (btSocket.isConnected()) {
Log.v("HP", "Congratulations! Socket connected");
isBTConnected = true;
try {
inStream = btSocket.getInputStream();
outStream = btSocket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
Log.e("HP", "Couldn't create io stream");
}
} else {
Log.e("HP", "Couldn't connect socket");
}
// we have our io streams, now get data
if (isBTConnected && inStream != null) {
Log.v("HP", "Attempting to get data from inStream");
runOnUiThread(new Runnable() {
public void run() {
changeDisplayText("\nConnection successful!" +
"\nStreaming Data...", true);
}
});
Log.v("HP", "Starting data stream...");
// read from the input stream
byte[] scaleData = new byte[512];
byte[] allScaleData;
String hpFileName = "streamedData_" + epoch.toString() + ".dat";
FileOutputStream fOutStream = null;
/* * *
* Create file to store data
* * */
// external storage
File myDir = new File(Environment.getExternalStorageDirectory().toString() + "/streamedData");
myDir.mkdirs();
File file = new File(myDir, hpFileName);
Log.v("HP", "Attempted to make file");
try {
fOutStream = new FileOutputStream(file);
Log.v("HP", "Made file");
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.e("HP", "Error: Couldn't make file");
}
/* * *
* Stream data here
* * */
Integer bytesRead;
while (true) {
try {
bytesRead = inStream.read(scaleData);
Log.d("HP", "Read " + bytesRead.toString() + " bytes");
fOutStream.write(Arrays.copyOfRange(scaleData, 0, bytesRead.intValue()));
} catch (IOException e) {
Log.d("HP", "Done reading bytes");
try {
btSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
break;
}
}
try {
fOutStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
clearBTConnection();
isConnecting = false;
}
}).start();
}
}
}
private BluetoothAdapter mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
私有BluetoothSocket btSocket=null;
私有OutputStream outStream=null;
私有InputStream inStream=null;
私有BluetoothDevice pairedScale=null;
私有UUID MY_UUID=UUID.fromString(“00001101-0000-1000-8000-00805f9b34fb”);//找到这个https://stackoverflow.com/questions/4632524/how-to-find-the-uuid-of-serial-port-bluetooth-device
私有字符串MAC_ADDR;
私有布尔值isBTConnected=false;
...
公共无效连接tobt(){
/* * *
*从配对设备列表中查找蓝牙设备
* * */
if(mBluetoothAdapter.isEnabled()){
设置pairedDevices=mBluetoothAdapter.getBondedDevices();
MAC_ADDR=macSpinner.getItemAtPosition(macSpinner.getSelectedItemPosition()).toString();
用于(蓝牙设备:pairedDevices){
Log.v(“HP”,“通过配对的BT设备进行迭代匹配”);
if(MAC_ADDR.equals(device.toString())){
pairedScale=设备;
Toast.makeText(MainActivity.this,device.toString(),Toast.LENGTH_LONG.show();
Log.v(“HP”,“发现BT设备匹配:“+device.toString()”);
changeDisplayText(“\n使用配对设备:“+device.toString(),true”);
打破
}
}
}
/* * *
*生成新线程并尝试连接
* * */
//如果套接字创建成功,则生成新线程
if(btSocket!=null){
新线程(newrunnable()){
公开募捐{
断开连接=正确;
//尝试连接
试一试{
btSocket.connect();
}捕获(IOE异常){
e、 printStackTrace();
Log.e(“HP”,“无法连接套接字”);
}
/* * *
*创建IO流
* * */
//创建IO流
if(btSocket.isConnected()){
Log.v(“HP”,“恭喜您!已连接套接字”);
isBTConnected=true;
试一试{
inStream=btSocket.getInputStream();
outStream=btSocket.getOutputStream();
}捕获(IOE异常){
e、 printStackTrace();
Log.e(“HP”,“无法创建io流”);
}
}否则{
Log.e(“HP”,“无法连接套接字”);
}
//我们有io流,现在获取数据
if(isBTConnected&&inStream!=null){
Log.v(“HP”,“试图从流内获取数据”);
runOnUiThread(新的Runnable(){
公开募捐{
changeDisplayText(“\n连接成功!”+
“\n正在流化数据…”,true);
}
});
Log.v(“HP”,“启动数据流…”);
//从输入流中读取
字节[]scaleData=新字节[512];
字节[]allScaleData;
字符串hpFileName=“streamedata”+epoch.toString()+“.dat”;
FileOutputStream-fOutStream=null;
/* * *
*创建文件以存储数据
* * */
//外部存储器
File myDir=新文件(Environment.getExternalStorageDirectory().toString()+“/streamddata”);
myDir.mkdirs();
File File=新文件(myDir,hpFileName);
Log.v(“HP”,“试图创建文件”);
试一试{
fOutStream=新文件输出流(文件);
Log.v(“HP”、“制作文件”);
}catch(filenotfounde异常){
e、 printStackTrace();
Log.e(“HP”,“错误:无法生成文件”);
}
/* * *
*这里有流数据
* * */
整数字节读取;
while(true){
试一试{
字节读取=流内读取(缩放数据);
Log.d(“HP”,“Read”+bytesRead.toString()+“bytes”);
write(Arrays.copyOfRange(scaleData,0,bytesRead.intValue());
}捕获(IOE异常){
Log.d(“HP”,“完成读取字节”);
试一试{