【问题标题】:Android BLE. Is it possible to send data to devices on scanning?安卓 BLE。是否可以在扫描时向设备发送数据?
【发布时间】:2020-02-08 05:58:44
【问题描述】:

我正在开发一个具有 BLE 设备的应用程序,该设备仅在扫描时发送某些参数时才会在扫描时显示。

App nrf Connect 很好地完成了这项任务(当按原始数据过滤时,使用0x02010612435542 原始数据参数)。

设备不会显示其名称、UUID 和制造商数据。 在 nrf Connect 上,它唯一共享的是这样的原始回报:0X020106124355420000080390BECB49400400CB500CF(这正是我现在需要的)。 并且通过 Mac 地址扫描(在设备的一个单元上测试),它只给我它的 rssi)

我的问题是,就像 nrfConnect 一样,我如何编码过滤器或类似的东西,将其作为扫描参数发送,以便我可以找到我的设备?这些设备没有名称(扫描时显示 N/A),我无法添加 Mac 地址过滤器列表,因为当我的应用程序完成时,会有大量相同类型的设备。

private List<ScanFilter> scanFilters() {
    List<ScanFilter> list = new ArrayList<ScanFilter>();

        ScanFilter scanFilter = new ScanFilter.Builder().build();
        list.add(scanFilter);

        //What kind of filter do I use to send that data on scanning?

    return list;
}

【问题讨论】:

    标签: java android bluetooth-lowenergy


    【解决方案1】:

    在您的 BLE 扫描仪中,您会收到包含 BluetoothDevice 实例的 ScanResult,即已扫描的设备。至少,您应该能够读取设备的 BLE 地址,即其硬件地址。使用方法:

    BluetoothDevice.getAddress(); 
    

    这个硬件地址应该有一个预定义的范围,例如以“A3:B4”开头,它可以过滤scanRecords。向您的设备制造商询问这些硬件地址是如何生成的。

    另外,如果您知道所支持设备的制造商 ID,则可以根据制造商数据设置过滤器:

    ScanFilter scanFilter = new ScanFilter.Builder()
                                    .setManufacturerData(manufacturerId, manufacturerData)
                                    .build();
    

    注意manufacturerData数组的前两个字节是manufacturerId。

    编辑:manufacturerData 是返回的字节数组的一部分

    scanResult.getScanRecord().getBytes()
    

    scanResult 被传递给 ScanCallback 你给BluetoothLESCanner.startScan(...)

    【讨论】:

    • 感谢您的回复!但这是交易......在官方蓝牙公司 ID 网站link[link] 上包含所有制造商 ID,开发我的设备的公司(公司)没有 ID:link 当我执行基于 MacAddress 的扫描,scanRecord 结果如下:[ScanRecord [mAdvertiseFlags=6, mServiceUuids=null, mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=null]]。该公司是否可能没有/广播制造商ID?
    • 只需向蓝牙 SIG 发送一条消息,然后告诉他们您想要一个公司标识符。您的另一个选择是使用“服务数据”,但由于服务 uuid 是 16 字节(128 位),因此您将获得更多开销。
    • scanResult.getScanRecord().getBytes()返回包含厂商数据的字节数组
    • 在扫描记录的字节数组中,厂商数据部分以0xFF开头,即-1,(后跟数据长度)。由于我在您的扫描记录中没有看到 -1,因此您的制造商似乎没有遵循标准约定:dylanh.art/ble/android/2016/09/27/ble-advertising-packets.html
    • 谢谢伙计。如果我可以投票给你,我会的。等我弄清楚了,我会在这里发布。
    【解决方案2】:

    我终于找到了解决问题的方法。

    这不是我的想法,但感谢@matdev,我设法以某种方式解决了这个问题。它没有回答主要问题,即是否可以将数据发送到扫描设备,但是,该解决方案对我有用。

    首先,我按名称做了一个过滤器,其中设备name == null

    private List<ScanFilter> scanFilters() {
        List<ScanFilter> list = new ArrayList<ScanFilter>();
    
        ScanFilter scanFilterName = new ScanFilter.Builder().setDeviceName(null).build();
    
        list.add(scanFilterName);
    
        return list;
    }
    

    它给了我一个包含大量设备的庞大列表。所以我添加了另一个过滤器,但这次是在scanResult() 上。正如@matdev 所指出的那样,另一个过滤器是MAC Address 后缀,对于我的设备也是如此。

    private Set<String> btDeviceData = new LinkedHashSet<String>();
    private ScanCallback scanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
    
            BluetoothDevice device = result.getDevice();
    
            ScanRecord record = result.getScanRecord();
            byte[] dataByteArray = record.getBytes();
    
            if (device.getAddress().startsWith("F8:36:9B")) {
    
                btDeviceData.add(device.getAddress());
            }
        }
    };
    

    通过这样做,我得到了一个列表(具体来说是Set),其中只有我正在寻找的设备。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      相关资源
      最近更新 更多