Get bluetooth signal strength
I want to get the Bluetooth signal strength of an another device which connected to my phone, How can I get the Bluetooth signal strength? I tried to search a lot over google and did not find any answer. Does someone know how can I implement it? this is myActivity:
public class MainActivity extends Activity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); >@Override public boolean onCreateOptionsMenu(Menu menu) < // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; >private final BroadcastReceiver receiver = 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(); >> >; >
i already saw it, however there is no any example of how to find the signal strength..maybe can you help me?
4 Answers 4
To get the signal you can check Bluetooth RSSI, you can read RSSI for connected devices, or perform a Bluetooth discovery to check the RSSI for any nearby devices.
Basically a Bluetooth discovery is a broadcast to all stations within range to respond back. As each devices responds back, Android fires off an ACTION_FOUND intent. Within this intent you can getExtra EXTRA_RSSI to obtain the RSSI.
Note that not all bluetooth hardware supports RSSI.
Also Related: Android IRC Office Hours Question About Android Bluetooth RSSI here is a Bluetooth Classic broadcast receiver example
private final BroadcastReceiver receiver = new BroadcastReceiver() < @Override public void onReceive(Context context, Intent intent) < String action = intent.getAction(); if(BluetoothDevice.ACTION_FOUND.equals(action)) < short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE); Toast.makeText(getApplicationContext()," RSSI: " + rssi + "dBm", Toast.LENGTH_SHORT).show(); >> >;
thanks alot, i wrote this code, however when i paired with device it does not show me in Toast the signal strength, do you have another way? i also add my activity to the main thread
I think your code is ok, but you need to implement startDiscovery() in order to see results.
The true is that BluetoothDevice.EXTRA_RSSI only works for discovering devices, when you connect to one of them you are not able any more to get its RSSI.
Here I developed a very simple sample of an Activity that permit you see the RSSI of the devices near to you. You first need to add a TextView and a Button to your layout, then enable the Bluetooth Adapter and then just click the button.
package com.in2apps.rssi; import android.os.Bundle; import android.app.Activity; 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.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class RSSIActivity extends Activity < private BluetoothAdapter BTAdapter = BluetoothAdapter.getDefaultAdapter(); @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_rssi); registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); Button boton = (Button) findViewById(R.id.button1); boton.setOnClickListener(new OnClickListener()< public void onClick(View v) < BTAdapter.startDiscovery(); >>); > @Override public boolean onCreateOptionsMenu(Menu menu) < getMenuInflater().inflate(R.menu.activity_rssi, menu); return true; >private final BroadcastReceiver receiver = 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); String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); TextView rssi_msg = (TextView) findViewById(R.id.textView1); rssi_msg.setText(rssi_msg.getText() + name + " =>" + rssi + "dBm\n"); > > >; >
Проверить уровень сигнала блютуз
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
divel76
Подскажите пожалуйста, возможно ли средствами ардуино приблизительно узнать расстояние между bluetooth/wi-fi передатчиком и приемником в некой градации, где 1 это еле уловил сигнал, а 10 отличный приём. Связи между bluetooth/wi-fi модулями не происходит, передатчик- постоянно транслирует своё имя в эфир, приёмник же сканируя эфир находит имя и на его основе делает вычисления.
Пример: в лесу на деревьях висят слабенькие bluetooth/wi-fi передатчики с именами point1; point2; point3 и т.д., мимо него пробегают десять/двадцать человек с приёмниками на разном расстоянии от поинтов, скажем от 0 до 20 метров, и мне бы важно знать, кто и насколько не добежал до дерева и срезал путь вычислив и сохранив значения на приёмниках.
p.s. мне знакомы скетчи сканера «замусоренности» 2,4 диапазона, где возможно узнать насколько тот или иной канал заполнен, но передатчики без подключения не получают канал и следовательно очень трудно понять расстояние до конкретного передатчика, более того, передатчики делаю не я и даже не смогу узнать на базе какого модуля они будут собраны, мне известны только имена в эфире point1; point2; point3 и т.д.
kDn
IamNikolay
Геннадий П
1) Чтобы узнать уровень сигнала устройства — нужно чтобы оно активно активно обменивалось данными, т.е. передатчик был включен.
2) Передатчик устройства не всегда включен на полную мощность. Мощность регулируется в зависимости от уровня сигнала спаренного устройства.
3) Исходя из п.1 и п.2, если устройство не спарено или не видит спаренного устройства, то оно не производит сигнал по которому можно ориентироваться. В таком случае если не знать MAC-адрес Bluetooth устройства, то засечь его очень затруднительно.
4) Местность сильно влияет на уровень сигнала, особенно высокочастотного, типа 2.4Г на котором работают BT/WiFi.
5) Чтобы более-менее примерно узнать позицию устройства — проще всего, как уже написали, использовать триангуляцию. Соответственно нужно чтобы как минимум три пеленгатора видели устройство.
IamNikolay
divel76
Простите меня пожалуйста, либо я плохо объясняю либо что-то пошло не так.
Триангуляция здесь совершенно не уместна.
т.е. я правильно вас понял, что любой передатчик (BT/wi-fi) транслирующий свой открытый SSID в эфир
и esp32 — может измерять уровень/мощность сигнала без подключения?
Если это так, то это идеальное решение, а то я же начал смотреть в диапазон 433мГц.
1) Чтобы узнать уровень сигнала устройства — нужно чтобы оно активно активно обменивалось данными, т.е. передатчик был включен.
2) Передатчик устройства не всегда включен на полную мощность. Мощность регулируется в зависимости от уровня сигнала спаренного устройства.
3) Исходя из п.1 и п.2, если устройство не спарено или не видит спаренного устройства, то оно не производит сигнал по которому можно ориентироваться. В таком случае если не знать MAC-адрес Bluetooth устройства, то засечь его очень затруднительно.
4) Местность сильно влияет на уровень сигнала, особенно высокочастотного, типа 2.4Г на котором работают BT/WiFi.
5) Чтобы более-менее примерно узнать позицию устройства — проще всего, как уже написали, использовать триангуляцию. Соответственно нужно чтобы как минимум три пеленгатора видели устройство.
1. Они не могут обмениваться данными, так как не могут одновременно подключиться к 10-20-30 устройствам.
Но передатчик включен SSID транслируется открыто.
2. Если я выставлю AT командами передатчик в режим ведущий и в постоянный, открытый поиск, то по идее передатчик как раз и будет работать всегда в максимальной мощности транслируя своё имя в эфир ожидая подключения.
3. Использование MAC адресов невозможно, я их не знаю, но знаю имена, хотя, конкретно со своими передатчиками я могу использовать и MAC адреса.
4. Это играет мне на руку.
5. нет возможности.
—
по сути, мне нужен просто параметр RSSI – показатель, отображающий уровень мощности принимаемого сигнала.
И чтобы не наступать на грабли, покупая различные модули и экспериментируя с ними — прошу Вашего совета.
как можно проверить сигнал\скорость Блютуз соединения?
Версии 1.1 и 1.2 протокола Bluetooth обеспечивают скорость передачи данных до 723,1 кбит/с, а версия 2.0 отличается повышенной пропускной способностью (Enhanced Data Rate — EDR), которая достигает 2,1 Мбит/с (спецификация 2.0+EDR от 10 ноября 2004 г) . Разумеется, контроллеры с EDR имеют повышенное энергопотребление, однако втрое большая скорость сокращает время передачи, в результате чего реально затрачиваемая энергия вдвое меньше, чем у первых версий Bluetooth. Каждая последующая спецификация обратно совместима с предыдущими, что позволяет совместно использовать оборудование различных поколений, пусть и с определёнными ограничениями. Кроме того, протокол Bluetooth прост в использовании и поддерживается на уровне операционной системы Windows XP с установленным Service Pack 2.
Однако самым существенным недостатком Bluetooth является недостаточный уровень безопасности — эксперты постоянно находят множественные уязвимости в реализации этого беспроводного протокола, позволяющие злоумышленникам посылать на аппараты с включённым контроллером Bluetooth несанкционированные сообщения или спам (это занятие именуется «блюджекингом»), получать доступ к чужой информации («блюснарфинг») и завладевать на расстоянии мобильным телефоном для набора номеров, отправки сообщений, просмотра телефонной книги и выхода в интернет («блюбаггинг»). Впрочем, всех этих напастей можно избежать, если соблюдать некоторые правила пользования Bluetooth.
Засечь за какое время перекидываются файлы известного объема. И потом размер делиться на время в секундах. Для большей точности сделайте это несколько раз. Во время копирования закройте все приложения, что бы процессор не отвлекался на них.