Соединение Android Bluetooth SPP, кажется, обрывается через пару секунд - PullRequest
1 голос
/ 13 июня 2011

У меня есть довольно простая программа, основанная в основном на простом клиентском приложении для тестирования 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;
            }

        }
}

1 Ответ

2 голосов
/ 13 июня 2011

Вкладка и (по моему опыту с 6 различными устройствами) все устройства Samsung имеют УЖАСНЫЕ реализации Bluetooth SPP. Я бы предложил выбрать другое устройство.

Кроме того, я бы проверил, что вы вызываете flush для OutputStream, особенно если вы не отправляете разделители строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...