当前位置:首页 » 安卓系统 » android蓝牙rssi

android蓝牙rssi

发布时间: 2022-07-23 15:01:42

1. 如何读取一次,我连接的多个设备的 rssi 值

我正在开发一个应用程序有连接到蓝牙设备的 Android 4.3。
我可以连接到 BLE 设备和从设备中读取 RSSI,通过使用 BluetoothGatt.readRemoteRssi()。
我想要读的多个设备一次我已连接,但我可以只读 BLE RSSI 设备 RSSI 的最后一次,我连接的设备。
如果有两个 BLE 设备 A 和 B。我连接到A 的设备,并读取该 RSSI。之后,我连接到B 的设备,和我可以从设备 B读取 RSSI。但它并不读取设备 A的 RSSI,它只能从设备 B读取 RSSI。
在Main.java ,它列出已连接的位置的所有设备。
当我单击该设备,在列表上,它把传送的设备的名称和地址到DeviceControl.java。
final Intent qintent = new Intent(this, DeviceControl.class);
devicelist.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
HashMap<String, Object> select = (HashMap<String, Object>) devicelist.getItemAtPosition(arg2);
String name = (String) select.get(“name”);
String address = (String) select.get(“address”);
qintent.putExtra(DeviceControl.EXTRAS_DEVICE_NAME, name);
qintent.putExtra(DeviceControl.EXTRAS_DEVICE_ADDRESS, address);
startActivity(qintent);
}
});
DeviceControl.java将调用BluetoothLeService.java和连接到设备。
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
// TODO Auto-generated method stub
mBluetoothLeService = ((BluetoothLeService.LocalBinder) service)。getService();
if(!mBluetoothLeService.initialize()) {
Log.e(TAG, “Unable to initialize Bluetooth”);
finish();
}
registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
mBluetoothLeService.connect(mDeviceAddress);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
// TODO Auto-generated method stub
mBluetoothLeService = null;
}
};
BluetoothLeService.java将连接到该设备。
public boolean connect(final String address) {
if (mBluetoothAdapter == null || address == null) {
Log.w(TAG, “BluetoothAdapter not initialized or unspecified address.”);
return false;
}
if(mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
&& mBluetoothGatt != null) {
Log.d(TAG, “Trying to use an existing mBluetoothGatt for connection.”);
if(mBluetoothGatt.connect()) {
mConnectionState = STATE_CONNECTING;
return true;
}else {
return false;
}
}
final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
if(device == null) {
Log.w(TAG, “Device not found. Unable to connect”);
return false;
}
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
Log.d(TAG, “Try to create a new connection”);
mBluetoothDeviceAddress = address;
mConnectionState =STATE_CONNECTING;
return true;
}
它连接到设备后,我可以使用 readRemoteRssi 来从设备中读取 RSSI。
public void readRemoteRssi() {
mBluetoothGatt.readRemoteRssi();
}
但它只能读取 RSSI 的最后一个设备的我已连接。
当我看到日志时,它总是发送onCharacteristicWrite和readRemoteRssi()到我连接的最后一个设备。
我应该重新连接关贸总协定 》 或之前我想 RSSI 对读取或写入的 CharacteristicWrite 值的第一个设备重新连接到的第一个地址的设备概览
它不会有其他的方法来读取我已连接的所有设备的 RSSI 概览
解决方法 1:
使多个 BluetoothGatt 对象来连接多个设备分开,并调用 readRemoteRssi 一个接一个。
懒的和坏的示例中,您应该能够将那些 BluetoothGatt 对象放入数组
BluetoothGatt mBluetoothGatt1 = device1.connectGatt(this, false, mGattCallback);
BluetoothGatt mBluetoothGatt2 = device2.connectGatt(this, false, mGattCallback);

2. Android 蓝牙测距离,两部蓝牙手机距离

  • /**

  • *功能:根据rssi计算距离

  • *Createdbyliuhuichaoon2017/1/17.

  • */

  • publicclassRssiUtil{

  • //A和n的值,需要根据实际环境进行检测得出

  • privatestaticfinaldoubleA_Value=50;/**A-发射端和接收端相隔1米时的信号强度*/

  • privatestaticfinaldoublen_Value=2.5;/**n-环境衰减因子*/

  • /**

  • *根据Rssi获得返回的距离,返回数据单位为m

  • *@paramrssi

  • *@return

  • */

  • publicstaticdoublegetDistance(intrssi){

  • intiRssi=Math.abs(rssi);

  • doublepower=(iRssi-A_Value)/(10*n_Value);

  • returnMath.pow(10,power);

  • }

  • }

  • 扫描蓝牙过程中获得信号强度:

    [java]view plain

  • /*监听扫描过程中的变化*/

  • =newBroadcastReceiver(){

  • @Override

  • publicvoidonReceive(Contextcontext,Intentintent){

  • Stringaction=intent.getAction();

  • //Whendiscoveryfindsadevice

  • if(BluetoothDevice.ACTION_FOUND.equals(action))

  • {

  • //

  • //通过EXTRA_DEVICE附加域来得到一个BluetoothDevice设备

  • BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

  • //Ifit'salreadypaired,skipit,becauseit'sbeenlistedalready

  • //如果这个设备是不曾配对过的,添加到list列表

  • /*if(device.getBondState()!=BluetoothDevice.BOND_BONDED)

  • {*/

  • //信号强度

  • intrssi=intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);

3. android ble搜到一个蓝牙怎么跟特征值通信的

Generic Attribute Profile (GATT)
通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。

Attribute Protocol (ATT)
GATT是基于ATT Protocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。

Characteristic
Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。

Descriptor
对Characteristic的描述,例如范围、计量单位等。

Service
Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart rate measurement"的Characteristic。

二、角色和职责:

Android设备与BLE设备交互有两组角色:

中心设备和外围设备(Central vs. peripheral);
GATT server vs. GATT client.

Central vs. peripheral:
中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan advertisement。而peripheral角色负责make advertisement。

GATT server vs. GATT client:
这两种角色取决于BLE连接成功后,两个设备间通信的方式。

举例说明:
现 有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角 色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。

当 连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向 Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则 Android设备作为server端可能更合适。

三、权限及feature:

和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature:

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
finish();
}

四、启动蓝牙:

在使用蓝牙BLE之前,需要确认Android设备是否支持BLE feature(required为false时),另外要需要确认蓝牙是否打开。
如果发现不支持BLE,则不能使用BLE相关的功能。如果支持BLE,但是蓝牙没打开,则需要打开蓝牙。

打开蓝牙的步骤:

1、获取BluetoothAdapter

BluetoothAdapter是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操作了。

获取BluetoothAdapter代码示例如下:
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

注:这里通过getSystemService获取BluetoothManager,再通过BluetoothManager获取BluetoothAdapter。BluetoothManager在Android4.3以上支持(API level 18)。

2、判断是否支持蓝牙,并打开蓝牙

获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。
如果没打开,需要让用户打开蓝牙:
private BluetoothAdapter mBluetoothAdapter;

// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

五、搜索BLE设备:

通过调用BluetoothAdapter的startLeScan()搜索BLE设备。调用此方法时需要传入 BluetoothAdapter.LeScanCallback参数。
因此你需要实现 BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回。

由于搜索需要尽量减少功耗,因此在实际使用时需要注意:

1、当找到对应的设备后,立即停止扫描;
2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。

搜索的示例代码如下:
/**
* Activity for scanning and displaying available BLE devices.
*/
public class DeviceScanActivity extends ListActivity {

private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler;

// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;

private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, SCAN_PERIOD);

mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}

}

}

如果你只需要搜索指定UUID的外设,你可以调用 startLeScan(UUID[], BluetoothAdapter.LeScanCallback)方法。
其中UUID数组指定你的应用程序所支持的GATT Services的UUID。

BluetoothAdapter.LeScanCallback的实现示例如下:
private LeDeviceListAdapter mLeDeviceListAdapter;

// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};

注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。

六、连接GATT Server:

两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。
连接GATT Server,你需要调用BluetoothDevice的connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。调用示例:

mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

函数成功,返回BluetoothGatt对象,它是GATT profile的封装。通过这个对象,我们就能进行GATT Client端的相关操作。BluetoothGattCallback用于传递一些连接状态及结果。

BluetoothGatt常规用到的几个操作示例:

connect() :连接远程设备。
discoverServices() : 搜索连接设备所支持的service。
disconnect():断开与远程设备的GATT连接。
close():关闭GATT Client端。
readCharacteristic(characteristic) :读取指定的characteristic。
setCharacteristicNotification(characteristic, enabled) :设置当指定characteristic值变化时,发出通知。
getServices() :获取远程设备所支持的services。

等等。

注:
1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。
2、 一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如 discoverServices与onServicesDiscovered回调,readCharacteristic与 onCharacteristicRead回调,setCharacteristicNotification与 onCharacteristicChanged回调等。

4. 怎么用android获取bluetooth的信号强度

要拿到蓝牙信号指示值 rssi 分为两个步骤。
1.在oncreate方法里面增加 注册扫描广播
public void onCreate(Bundle savedInstanceState) {

// 注册开始发现广播。
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
this.registerReceiver(mReceiver, filter);

}
2.新建BroadcastReceiver广播对象,并实现里面的onreceive方法,在onreceive得到rssi(信号强度)。
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

//当设备开始扫描时。
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//从Intent得到blueDevice对象
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

if (device.getBondState() != BluetoothDevice.BOND_BONDED) {

//信号强度。
short rssi = intent.getExtras().getShort(
BluetoothDevice.EXTRA_RSSI);

}

}
}
};

5. android 蓝牙室内定位 ibeacon 关于RSSI算法

可以通过高斯权重法来对最终的位置进行加权计算。同时你也可以考虑采用滤波来进行修正。

6. 那种手机蓝牙串口助手能接受汉字

蓝牙串口助手 Bluetooth SPP是一款Android平台蓝牙客户端通信工具(即:蓝牙从机模式),可进行蓝牙串口通信测试。能连接单片机及PC的蓝牙串口。
1.8重大更新(扫描设备时显示rssi,class;增加键盘控制器模式)

7. android 蓝牙连接后怎么得到rssi值

要拿到蓝牙信号指示值 rssi 分为两个步骤。
1.在oncreate方法里面增加 注册扫描广播
public void onCreate(Bundle savedInstanceState) {

// 注册开始发现广播。
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
this.registerReceiver(mReceiver, filter);

}
2.新建BroadcastReceiver广播对象,并实现里面的onreceive方法,在onreceive得到rssi(信号强度)。
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override

8. Android 蓝牙连接后怎么得到rssi值 并且连续刷新 哪个大神帮我一下

要拿到蓝牙信号指示值 rssi 分为两个步骤。
1.在oncreate方法里面增加 注册扫描广播
public void onCreate(Bundle savedInstanceState) {

// 注册开始发现广播。
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
this.registerReceiver(mReceiver, filter);

}
2.新建BroadcastReceiver广播对象,并实现里面的onreceive方法,在onreceive得到rssi(信号强度)。
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

//当设备开始扫描时。
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//从Intent得到blueDevice对象
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

if (device.getBondState() != BluetoothDevice.BOND_BONDED) {

//信号强度。
short rssi = intent.getExtras().getShort(
BluetoothDevice.EXTRA_RSSI);

热点内容
无需服务器搭建网站 发布:2025-01-22 21:53:34 浏览:114
旅游青蛙安卓版如何下载 发布:2025-01-22 21:52:51 浏览:317
欧文5的配置是什么 发布:2025-01-22 21:30:23 浏览:108
日志存储数据库 发布:2025-01-22 21:30:07 浏览:474
gulp上传cdn 发布:2025-01-22 21:27:34 浏览:203
emule文件夹 发布:2025-01-22 21:23:23 浏览:981
s7e什么时候推送安卓7 发布:2025-01-22 21:20:59 浏览:203
狐狸的清白脚本分析 发布:2025-01-22 21:19:59 浏览:182
如何破解仿射密码 发布:2025-01-22 21:13:53 浏览:81
百度视频存储 发布:2025-01-22 21:13:11 浏览:168