Witam,
piszę aplikację na Androida która ma za zadanie połączyć się z modułem bluetooth podłączonym do AVR i wysłać dwie zmienne, rozłączyć się i zamknąć aplikację. Niby wszystko działa, program się łączy z modułem, wysyła co ma wysłać i rozłącza się i zamyka. Problem jest gdy chcę drugi raz się połączyć to już się aplikacja z modułem nie może połączyć. Tak jakby moduł nadal był połączony albo się zawieszał bo jak wyłączę układ z modułem BT i go raz jeszcze włączę i włączę aplikację raz jeszcze to się znów wszystko dobrze wykonuje, kolejny raz i już się nie połączy. Wydaje mi się, że muszę mieć coś z aplikacją na Androidzie, bo próbowałem łączyć z modułem BT przez program BlueSoleil i następnie przez program RealTerm wysyłać ręcznie te dwie wartości i rozłączyć w BlueSoleil i znów połaczyć itd. i się mi wtedy łączy za każdym razem.
public class ServiceARC extends IntentService {
private ControlSystem controlSystem;
// private DataARCs dataARC;
private SaveAndroidSerialFile saveASF;
private LoadAndroidSerialFile loadASF;
private String patchFile = "/storage/sdcard0/ARC/arcSetting.ser";
private DataARC dataARC;
private Handler handler = new Handler();
/*
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public ServiceARC() {
super("ServiceARC");
}
@Override
protected void onHandleIntent(Intent intent) {
// makeToast("dzia");
loadFile();
sendBT();
saveFile();
controlSystem.close();
//makeToast("koniec");
handler.post(new Runnable() {
@Override
public void run() {
makeToast(ServiceARC.this, "koniec");
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler = new Handler();
return super.onStartCommand(intent, flags, startId);
}
// METODA TWORZĄCA TOASTY
private void makeToast(Context ctx, String s) {
Toast t = Toast.makeText(ctx, s, Toast.LENGTH_LONG);
t.show();
}
private void loadFile() {
loadASF = new LoadAndroidSerialFile(getApplicationContext());
dataARC = (DataARC) loadASF.loadSerialFile(patchFile);
if (dataARC == null) {
dataARC = new DataARC();
}
handler.post(new Runnable() {
@Override
public void run() {
if (dataARC.getPositiondoor() == 1)
makeToast(ServiceARC.this, "otwieranie");
else if (dataARC.getPositiondoor() == 0)
makeToast(ServiceARC.this, "zamykanie");
}
});
}
private void sendBT() {
controlSystem = new ControlSystem(getApplicationContext());
controlSystem.sendParControl(dataARC.getPositiondoor(), dataARC.getTimeLight() / 10);
}
private void saveFile() {
dataARC.changePositiondoor();
saveASF = new SaveAndroidSerialFile(getApplicationContext());
saveASF.saveSerialFile(dataARC, patchFile);
}
}
public class ControlSystem {
//Składowe
private Context ctx;
private BluetoothService btService;
public ControlSystem(Context ctx) {
this.ctx = ctx;
initBluetooth();
}
private void initBluetooth() {
//
btService = new BluetoothService(ctx);
while (!btService.isEnable()) {
}
btService.connectBT();
}
public void open() {
btService.sendInt(1);
btService.sendInt(6);
}
public void sendParControl(int position, int timeLight){
btService.sendInt(position);
btService.sendInt(timeLight);
}
public void CreateReceiveThread() {
Runnable threadTask = new ReceiveSystem(ctx, btService.getBtSocket());
Thread myThread = new Thread(threadTask);
myThread.start();
}
public void close(){
btService.disable();
}
}
public class BluetoothService {
// Składowe
private BluetoothDevice btDevice;
private BluetoothAdapter btAdapter;
private BluetoothSocket btSocket;
private OutputStream os;
private UUID MY_UUID;
private Context ctx;
public BluetoothService(Context ctx) {
this.ctx = ctx;
initBT();
enable();
// makeToast("inicjalizacja");
}
public void enable(){
btAdapter.enable();
}
public void disable(){
try {
os.close();
btSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
btAdapter.disable();
}
public BluetoothSocket getBtSocket() {
return btSocket;
}
public boolean isEnable() {
//
if (btAdapter.isEnabled())
return true;
else
return false;
}
private void initBT() { //Inicjalizacja Bluetooth
//
btAdapter = BluetoothAdapter.getDefaultAdapter();
//Ustawienie adresu MAC urządzenia z którym ma się połączyć aplikacja
btDevice = btAdapter.getRemoteDevice("20:13:08:20:07:80");
//("B4:62:93:8F:D9:78"); // netbook ("40:61:86:A0:1B:EB") //("20:13:08:20:07:80")
//
MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
}
public void connectBT() {
btAdapter.cancelDiscovery();
try {
btSocket = btDevice.createInsecureRfcommSocketToServiceRecord(MY_UUID);
btSocket.connect();
os = btSocket.getOutputStream();
/* INFORMACJA CZY SOCKET SIE POŁĄCZYŁ
if (btSocket.isConnected())
makeToast("działa");
else
makeToast("nie działa");
*/
} catch (IOException e) {
os = null;
// makeToast("Blad poloczenia " + e);
}
}
public void sendString(String s) {
try {
byte[] b = s.getBytes();
os.write(b);
os.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void sendInt(int i) {
while (true) {
if (btSocket != null) {
if (btSocket.isConnected()) {
try {
os.write(i);
os.flush();
break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
}
}
}
// METODA TWORZĄCA TOASTY
private void makeToast(String s) {
Toast t = Toast.makeText(ctx, s, Toast.LENGTH_LONG);
t.show();
}
public boolean btIsConnected(){
if (btSocket.isConnected())
return true;
else
return false;
}
public void testRun() {
//
connectBT();
while (true) {
if (btSocket != null) {
if (btSocket.isConnected()) {
//
sendInt(10);
break;
}
}
}
//sendInt(10);
btAdapter.disable();
}
}
```xml
Logcat pokazuje mi coś takiego:
05-01 20:33:54.023 29999-30013/lolo.androidremotecar.androidremotecar.app W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
05-01 20:33:54.027 29999-30013/lolo.androidremotecar.androidremotecar.app D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[54]}