У меня есть довольно простая программа, основанная в основном на простом клиентском приложении для тестирования Bluetooth:
http://www.anddev.org/code-snippets-for-android-f33/serial-over-bluetooth-simple-test-client-t11106.html
В моем приложении 4 кнопки, каждая из которых отправляет свой байт данныхчерез соединение Bluetooth.
Кажется, что он отлично работает в течение нескольких секунд.Соединение установлено, гнездо RFCOMM подключается, и в течение первых нескольких секунд данные передаются по соединению (и принимаются с другой стороны). Однако после нескольких секунд совершенства данные перестают проходить.Тогда независимо от того, на какую из 4 кнопок я нажимаю, ничего не происходит.
Затем, когда я нажимаю кнопку «Выход» (которая пытается закрыть разъем Bluetooth с помощью функции .close ()), внезапно все данные, которые былиесли не пройти, то внезапно проходит через все сразу (как если бы он был сохранен в буфере) непосредственно перед закрытием соединения.и приемное устройство возвращается в режим обнаружения.
Я не понимаю, почему разрывается соединение и начинается сохранение данных, идеи?
Спасибо, Джеймс
Цель: Galaxy Tab @ Android 2.3.3
Приемное устройство: TI EZ430-RF2560 eval kit
package com.launcher.LaunchControl;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class ThinBTClient extends Activity implements OnClickListener {
private static final String TAG = "THINBTCLIENT";
public static final String ADDRESS = "ADDRESS";
private static final boolean D = true;
private BluetoothAdapter mBluetoothAdapter = null;
private BluetoothSocket btSocket = null;
private OutputStream outStream = null;
byte [] msgBuffer = {0x01, 0x02, 0x03, 0x04};
private static final UUID MY_UUID = //Bluetooth UUID to resolve to SSP Port 1 ^^
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static String address;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainlaunch);
findViewById(R.id.ExitButton).setOnClickListener(this);
findViewById(R.id.LaunchButton1).setOnClickListener(this);
findViewById(R.id.LaunchButton2).setOnClickListener(this);
findViewById(R.id.LaunchButton3).setOnClickListener(this);
findViewById(R.id.LaunchButton4).setOnClickListener(this);
if (D)
Log.e(TAG, "+++ ON CREATE +++");
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Toast.makeText(this,
"Bluetooth is not available.",
Toast.LENGTH_LONG).show();
finish();
return;
}
if (!mBluetoothAdapter.isEnabled()) {
Toast.makeText(this,
"Please enable your BT and re-run this program.",
Toast.LENGTH_LONG).show();
finish();
return;
}
if (D)
Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++");
Bundle extras = getIntent().getExtras();
if(extras !=null) {
if (extras.getString(ADDRESS) != null){;
address = extras.getString(ADDRESS);
}
}
}
@Override
public void onStart() {
super.onStart();
if (D)
Log.e(TAG, "++ ON START ++");
}
@Override
public void onResume() {
super.onResume();
if (D) {
Log.e(TAG, "+ ON RESUME +");
Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +");
}
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
try {
btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Socket creation failed.", e);
}
mBluetoothAdapter.cancelDiscovery();
try {
btSocket.connect();
Log.e(TAG, "ON RESUME: BT connection established, data transfer link open.");
} catch (IOException e) {
try {
btSocket.close();
} catch (IOException e2) {
Log.e(TAG,
"ON RESUME: Unable to close socket during connection failure", e2);
}
}
}
@Override
public void onPause() {
super.onPause();
if (D)
Log.e(TAG, "- ON PAUSE -");
if (outStream != null) {
try {
outStream.flush();
} catch (IOException e) {
Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);
}
}
try {
btSocket.close();
} catch (IOException e2) {
Log.e(TAG, "ON PAUSE: Unable to close socket.", e2);
}
}
@Override
public void onStop() {
super.onStop();
if (D)
Log.e(TAG, "-- ON STOP --");
}
@Override
public void onDestroy() {
super.onDestroy();
if (D)
Log.e(TAG, "--- ON DESTROY ---");
try {
btSocket.close();
} catch (IOException e1) {
Log.e(TAG, "ON RESUME: Unable to close socket during connection failure");
}
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.ExitButton:
try {
btSocket.close();
} catch (IOException e1) {
Log.e(TAG, "ON RESUME: Unable to close socket during connection failure");
}
this.finish();
break;
case R.id.LaunchButton1:
try {
outStream = btSocket.getOutputStream();
}
catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}
try {
outStream.write(msgBuffer[0]);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
outStream = null;
break;
case R.id.LaunchButton2:
try {
outStream = btSocket.getOutputStream();
}
catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}
try {
outStream.write(msgBuffer[1]);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
outStream = null;
break;
case R.id.LaunchButton3:
try {
outStream = btSocket.getOutputStream();
}
catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}
try {
outStream.write(msgBuffer[2]);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
outStream = null;
break;
case R.id.LaunchButton4:
try {
outStream = btSocket.getOutputStream();
}
catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}
try {
outStream.write(msgBuffer[3]);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
outStream = null;
break;
}
}
}