android - 对 Android 中的 BLE 定向广告 (ADV_DIRECT_IND) 使用react

标签 android bluetooth bluetooth-lowenergy android-bluetooth android-ble

如何在 Android 中对定向广告 (ADV_DIRECT_IND == 0001) 使用react?

有一个 BLE 小工具可以向 Android 手机发送定向广告(目前使用手机的硬编码 MAC 地址),在我的 Android 应用程序中我想使用react并启动与小工具的连接并读取 org.bluetooth.characteristic.location_and_speed小工具的值(value):

screenshot

请告知是否可以通过 Android 5 API 实现。

最佳答案

直接广告 确实有效 - 至少对于 HTC M8 手机和 Android 5.0(API 级别 21 及更高)。

解决方案是将设备地址添加到 ScanFilter .

如果将过滤器留空,则不会调用扫描回调。

这是我的工作代码:

public static final String TAG = "My_BLE_app";

public static final String DEVICE_1 = "D4:BE:84:72:5B:8E";
public static final String DEVICE_2 = "C4:39:07:19:60:E2";

private Context mContext;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mScanner;
private ScanSettings mSettings;
private List<ScanFilter> mFilters = new ArrayList<ScanFilter>();

首先是初始化BLE的方法:

public boolean init() {
    BluetoothManager bluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
    if (mBluetoothAdapter == null)
        return false;

    mScanner = mBluetoothAdapter.getBluetoothLeScanner();
    mSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();

    mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_1).build());
    mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_2).build());

    return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
}

然后是扫描回调:

private ScanCallback mDirectedScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        processResult(result);
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        for (ScanResult result: results) {
            processResult(result);
        }
    }

    private void processResult(ScanResult result) {
        BluetoothDevice device = result.getDevice();
        if (device == null)
            return;

        String address = device.getAddress();
        if (!BluetoothAdapter.checkBluetoothAddress(address))
            return;

        int rssi = result.getRssi();

        Log.d(TAG, "address=" + address + ", rssi=" + rssi);

        // TODO connect to the device in under 1 second
    }
};

最后是开始扫描的代码:

mScanner.startScan(mFilters, mSettings, mDirectedScanCallback);

有一个问题仍然悬而未决:

我不知道如何检测 Android 端的扫描类型 - 即扫描是否是定向的

关于android - 对 Android 中的 BLE 定向广告 (ADV_DIRECT_IND) 使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31880312/

相关文章:

android - 如何在共享首选项中存储来自 OAuth2 的凭据

android - 启动 Accept Thread 时 Bindlisten 失败

android - 如何使用蓝牙使用adb?

javascript - 使用 chrome.bluetooth API 连接到设备

android - 类未找到异常 : unable to find class "android.support.v4.util.ArrayMap"

android - 可以将 Beta 版应用程序作为 .apk 分发给亲朋好友进行测试并获得反馈吗?

android - Android Studio 中的 ARToolkit

android - Android 九补丁绘图中红色的含义

bluetooth - Unity 可以从 iOS 上的蓝牙键盘读取输入吗?

bluetooth - 苹果心率监测实例及蓝牙心率测量特性字节序