【问题标题】:BLE advertisement with different data packets in androidandroid中不同数据包的BLE广告
【发布时间】:2019-01-10 05:31:37
【问题描述】:

我是蓝牙低功耗广告的新手。 BLE 支持 API 级别 28 的动态广告。因为您可以发布不同的数据包。我正在尝试做,但在广告集中获取状态代码 18 和 Null。 谁能告诉我如何在android中做动态广告。我的设备是装有 Android 8.1.0 的 Nexus 6。

这是我的代码:

 //setting parameters

AdvertisingSetParameters parameters = (new AdvertisingSetParameters.Builder())
            .setLegacyMode(false)
            .setConnectable(true)
            .setInterval(AdvertisingSetParameters.INTERVAL_HIGH)
            .setTxPowerLevel(AdvertisingSetParameters.TX_POWER_MEDIUM)
            .build();

//Adding advertising data

AdvertiseData.Builder mbuilder = new AdvertiseData.Builder();
    mbuilder.setIncludeDeviceName(false);
    mbuilder.setIncludeTxPowerLevel(false);

mbuilder.addManufacturerData(Integer.parseInt(manuf, 16), manufacturerData1);
    AdvertiseData mData = mbuilder.build();

//Adding scan response data

AdvertiseData scanResponse = new AdvertiseData.Builder()
            .setIncludeDeviceName(true)
            .build();

//Advertising set call back and I am receiving null in Advertising set and status code 18

AdvertisingSetCallback callback = new AdvertisingSetCallback() {
        @Override
        public void onAdvertisingSetStarted(AdvertisingSet advertisingSet, int txPower, int status) {
            Log.i("", "onAdvertisingSetStarted(): txPower:" + txPower + " , status: "
                    + status);

            if (status==AdvertisingSetCallback.ADVERTISE_FAILED_ALREADY_STARTED)
                Toast.makeText(context, "ADVERTISE_FAILED_ALREADY_STARTED", Toast.LENGTH_SHORT).show();
            else if (status==AdvertisingSetCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED)
                Toast.makeText(context, "ADVERTISE_FAILED_FEATURE_UNSUPPORTED", Toast.LENGTH_SHORT).show();
            else if (status==AdvertisingSetCallback.ADVERTISE_FAILED_DATA_TOO_LARGE)
                Toast.makeText(context, "ADVERTISE_FAILED_DATA_TOO_LARGE", Toast.LENGTH_SHORT).show();
            else if (status==AdvertisingSetCallback.ADVERTISE_FAILED_INTERNAL_ERROR)
                Toast.makeText(context, "ADVERTISE_FAILED_INTERNAL_ERROR", Toast.LENGTH_SHORT).show();
            else if (status==AdvertisingSetCallback.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS)
                Toast.makeText(context, "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS", Toast.LENGTH_SHORT).show();
            else if (status==AdvertisingSetCallback.ADVERTISE_SUCCESS)
                Toast.makeText(context, "ADVERTISE_SUCCESS", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onAdvertisingSetStopped(AdvertisingSet advertisingSet) {
            Log.i("", "onAdvertisingSetStopped():");
        }
    };

//starting advertisement

    mBluetoothLeAdvertiser.startAdvertisingSet(parameters, mData, scanResponse, null, null, callback);

【问题讨论】:

    标签: java android bluetooth-lowenergy android-bluetooth ads


    【解决方案1】:

    你真的需要“scanResponse”吗?我的设备有 BLE 5.0 和 Android 9.0。如果我通过“null”而不是“scanResponse”,则将当前对象和正确状态返回给回调函数。但如果我通过“scanResponse”,则得到“null”对象和“status”18。

    如果改变

    mBluetoothLeAdvertiser.startAdvertisingSet(parameters, mData, scanResponse, null, null, callback);
    

    mBluetoothLeAdvertiser.startAdvertisingSet(parameters, mData, null, null, null, callback);
    

    一切都为我工作,我可以在其他设备上从我的智能手机扫描 BLE 5 信号。

    【讨论】:

    • 这里是教程。你可以在这个链接上检查它:source.android.com/devices/bluetooth/ble_advertising 我也用 ScanResponse 运行它,但我没有工作。好吧,我明白了这背后的原因。 StartAdvertisingSet 函数来自 API lvl 26,我们需要蓝牙 5.0。我的设备有蓝牙 4.2。这就是我获得 STATUS 18 的原因。我希望这对你也有帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多