Получите RSSI Bluetooth для Android Wear на телефоне Android

Я хотел бы определить расстояние между телефоном Android (Nexus 5X) и устройством Android Wear (Samsung Gear live) с помощью Bluetooth RSSI.

Я нашел решения для использования функции Bluetooth readRemoteRssi();, как в

final Runnable runnable = new Runnable() {  
        @Override
        public void run() {
            // TODO Auto-generated method stub
            mBluetoothLeService.readRemoteRssi();
            mHandler.postDelayed(this, 1000);
        }
    };

Однако при использовании Android Wear нет необходимости использовать Bluetooth-менеджеры, адаптеры или сервисы GATT; Я не видел их инициализированными в примерах носимых устройств. Вот мой вопрос: как мне получить значение Bluetooth RSSI от Android Wear на моем телефоне после сопряжения с интервалом около 5 секунд. Может ли кто-нибудь указать мне пример кода, делающего примерно то, что я планирую сделать?

[EDIT] Я нашел несколько примеров кода и получил следующий MainActivity. Я могу получить список сопряженных устройств, затем запускаю обнаружение и с помощью BroadcastReceiver пытаюсь прочитать значение RSSI.

package com.tudelft.androidweardistance;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayList<String> mDeviceList = new ArrayList<String>();
    private BluetoothAdapter mBluetoothAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        listView = (ListView) findViewById(R.id.listView);
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        getPairedDevices();
        startDiscovery();
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    public void discover(View view){
        getPairedDevices();
        startDiscovery();
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void startDiscovery() {
        mBluetoothAdapter.cancelDiscovery();
        mBluetoothAdapter.startDiscovery();
    }

    private void getPairedDevices() {
        Set<BluetoothDevice> devicesArray=mBluetoothAdapter.getBondedDevices();
        if(devicesArray.size()>0){
            for(BluetoothDevice device:devicesArray){
                mDeviceList.add(device.getName());
                System.out.println(device.getName());
            }
        }
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(mReceiver);
        super.onDestroy();
    }

    private final BroadcastReceiver mReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action)) {
                int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
                Toast.makeText(getApplicationContext(), "  RSSI: " + rssi + "dBm", Toast.LENGTH_SHORT).show();
                System.out.println(rssi);
            }
        }
    };

}

Возможно, Samsung Gear Live несовместим со службами RSSI, потому что BroadcastReceiver не печатает никаких RSSI.

Большое спасибо, ЛХЖ


person lhjohn    schedule 14.02.2016    source источник
comment
дайте ссылку на образец носимого проекта, который вы упомянули   -  person Neo    schedule 14.02.2016
comment
В идеале я хочу реализовать эту функциональность в этом приложении SensorDashboard github.com/pocmo/SensorDashboard.   -  person lhjohn    schedule 14.02.2016


Ответы (1)


Bluetooth-связь Android Wear обеспечивается операционной системой Android. Поскольку адаптер Bluetooth отсутствует, доступ к данным RSSI через приложение после установления соединения невозможен.

person lhjohn    schedule 16.03.2016