Какво задейства излъчванията на BluetoothDevice.ACTION_ACL?

Бих искал да знам какви събития в отдалечени физически устройства задействат ACTION_ACL_CONNECTED и ACTION_ACL_DISCONNECTED в слушателно устройство. Резултатите от теста ми нямат смисъл. Събрах няколко устройства на няколко дециметра едно от друго:

  • Galaxy Tab P7500 с Android 3.1
  • телефон i5500 с Android 2.2
  • компютър с WinXP с Bluetooth USB ключ
  • две слушалки с бутони за включване/изключване

Първо сдвоявам ръчно всички устройства от раздела. Нито компютърът, нито телефонът са сдвоени с друго устройство освен Tab. (Една от слушалките никога не може да бъде намерена от раздела по никакъв начин, но може лесно да бъде намерена от телефона както ръчно, така и програмно). След това имам просто приложение, за да започна откриване и което слуша и показва ACL излъчванията. И ето какво се случва (едно и също нещо всеки път, то е последователно в своята лудост):

  • startDiscovery() от Tab с активирани всички устройства: - Компютърът е единственото намерено устройство
  • Деактивирайте bluetooth на компютър: - Няма реакция на раздела
  • Активирайте bluetooth на компютър: - Няма реакция на раздела
  • Включване на слушалките за първи път: - ACTION_ACL_CONNECTED в раздела
  • Изключване на слушалките: - Няма реакция на раздела
  • Включете отново слушалките: - ACTION_ACL_DISCONNECTED и ACTION_ACL_CONNECTED в бърза последователност в раздела
  • Деактивиране на bluetooth на Tab: - Няма реакция на Tab
  • Активирайте bluetooth в раздела: - Слушалки ACTION_ACL_CONNECTED в раздела
  • startDiscovery() от телефона: - Компютърът е единственото устройство, открито от телефона, въпреки че телефонът е сдвоен само с Tab, а не с компютъра. В противен случай телефонът реагира само на слушалките, на които Tab никога не реагира.

Какво да направя от тази бъркотия? Не може ли човек да разчита на устройство, причиняващо ACTION_ACL_CONNECT, дори когато е сдвоено и се включва в обхват?

Ето методите за BroadcastReceiver и дейностите onCreate, но не очаквам подробностите в този код да имат значение:

BroadcastReceiver intentReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        if (device != null) {
            name = device.getName();
        Log.v(TAG, "Device=" + device.getName());
        }
        else {
            name = "None";
        }

        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            text1.setText(name + " connected " + (checkCounter++));
            Log.v(TAG, "connected: " + device);
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
            text2.setText(name + " disconnected " + (checkCounter++));
        Log.v(TAG, "disconnected: " + device);
        }
        else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            text3.setText( name + " found " + (checkCounter++));
        Log.v(TAG, "found: " + device + "");
        }
        else if (blueAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            text4.setText("Started " + (checkCounter++));
            Log.v(TAG, "Discovery started");
        }
        else if (blueAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            text4.setText("Finished " + (checkCounter++));
            Log.v(TAG, "Discovery finished");
        }
    }
};


public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.bluetoothlayout);

    text1 = (TextView)findViewById(R.id.textView1);
    text2 = (TextView)findViewById(R.id.textView2);
    text3 = (TextView)findViewById(R.id.textView3);
    text4 = (TextView)findViewById(R.id.textView4);

    BluetoothDevice mw600 =         blueAdapter.getRemoteDevice("58:17:0C:EB:C5:08");
    BluetoothDevice bt500 =         blueAdapter.getRemoteDevice("00:1D:43:00:C4:54");
    BluetoothDevice galaxyTab = blueAdapter.getRemoteDevice("00:07:AB:6A:96:7D");
    BluetoothDevice pcDongle =  blueAdapter.getRemoteDevice("00:15:83:4D:8B:57");

    intentFilter = new IntentFilter();
    intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
    intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
    intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
    intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_STARTED);
    intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_FINISHED);
    if (!isReceiverRegistered) {
        registerReceiver(intentReceiver, intentFilter);
        isReceiverRegistered = true;
    }
    if (!blueAdapter.isEnabled()) {
        blueAdapter.enable();
    }
    blueAdapter.startDiscovery();
}

person Tombola    schedule 02.03.2012    source източник


Отговори (1)


Работя с андроиди, наистина объркани bt от доста време,

ето какво мога да ти кажа:

ACTION_ACL_CONNECTED се изпраща всеки път, когато е установена успешна връзка. Този е толкова прост, колкото може.

Сега доста досадната част.

ACTION_ACL_DISCONNECTED се изпраща всеки път, когато връзката е затворена на ниво ХАРДУЕР. КОГА ще се случи това зависи от самото устройство. АКО ръчно прекъснете връзката/изключите другото устройство, то по някакъв начин не изпраща сигнал „пич, няма ме“ към дроида, вместо това след до 20 секунди някое куче-пазач лае и връзката се затваря и намерението се изпраща.

Сега опитах това само със SPP устройства, към които се свързвам. Слушалка afaik се свързва активно сама, защото не е SPP. Така че автоматично се свързва с вас, ако сте сдвоени и сте в режим на слушане. Сега не знам какво прави слушалката, ако я „изключите“. Може би се прекъсва правилно или може би просто прекъсва връзката, без да се сбогува. В последния случай ще отнеме известно време на кучето пазач да прекъсне връзката с дроида, което може да отнеме от 0 до 20 секунди, не ме питайте защо, това е само мое наблюдение.

person NikkyD    schedule 03.10.2012
comment
съгласен с теб. След може да изминат 10 секунди връзка, се получава предаване за прекъсване на връзката - person Basavaraj Hampali; 10.11.2013
comment
Съгласен съм, че Android BT е объркан. Re: ACL_DISCONNECT, ако има хардуерно прекъсване на връзката, BT устройството не може да каже на Android, че го няма, тъй като устройството е имало внезапна и неочаквана повреда. Следователно е необходимо запитване от Android, за да се потвърди дали устройството все още е там... - person angryITguy; 21.01.2019