android - 找不到 BLE 广告

标签 android xamarin.android bluetooth-lowenergy

在我的 Xamarin.Forms 应用程序中,我正在编写 native Android 代码来宣传 UUID 和一些测试数据,以便另一台设备扫描和查找它。我正在平板电脑 SM-T580 上运行该应用程序。这是我的代码:

var parameters = (new AdvertiseSettings.Builder())
                         .SetAdvertiseMode(AdvertiseMode.Balanced)
                         .SetConnectable(false)
                         .SetTimeout(0)
                         .SetTxPowerLevel(AdvertiseTx.PowerMedium).Build();

AdvertiseData data = (new AdvertiseData.Builder()).AddServiceData(_applicationParcelUuid,
                                                                          System.Text.Encoding.ASCII.GetBytes("helloTest123"))
                                                  .Build();

if (BluetoothAdapter.DefaultAdapter.BluetoothLeAdvertiser != null)
{
 BluetoothAdapter.DefaultAdapter.BluetoothLeAdvertiser.StartAdvertising(parameters, data, _customAvertiseCallback);
}

在我的_customAvertiseCallback中,OnStartSuccess重写被调用,所以我认为它应该可以工作。我尝试在 Nexus 5 设备上使用 nRF Connect 应用程序对其进行测试,但我从未在其上看到我的设备的广告。

编辑

我尝试添加扫描 BLE 广告的代码,看看我是否可以自己拾取它。它发现来自其他设备的其他 BLE 广告,但不是来 self 的应用程序。这是我的扫描代码,它在同一个应用程序上运行:

public void StartBluetoothScanning()
{
    if(_bleScanningInitialized)
    {
        return;
    }

    /**
        * Initialize BluetoothAdapter
        * Check the device has the hardware feature BLE
        * Then enable the hardware,
    */
    BluetoothManager bluetoothManager = (BluetoothManager)GetSystemService(Java.Lang.Class.FromType(typeof(BluetoothManager)));
    var bluetoothAdapter = bluetoothManager.Adapter;
    bool isBleSupported = bluetoothAdapter != null && this.BaseContext.PackageManager.HasSystemFeature(PackageManager.FeatureBluetoothLe);

    if(!isBleSupported)
    {
        return;
    }

    /**
        * Register GATT update receiver
    */

    this.RegisterReceiver(_gattUpdateReceiver, new IntentFilter(BluetoothAdapter.ActionStateChanged));

    /**
    * Initialize Bluetooth service.
    */

    Intent gattServiceIntent = new Intent(BaseContext, typeof(BluetoothGattService));
    var componentName = BaseContext.StartService(gattServiceIntent);
    bool isBind = BaseContext.BindService(gattServiceIntent, _serviceConnection, Bind.AutoCreate);

    /**
    * Prepare for scanning
    */

    List<ScanFilter> scanFilters = new List<ScanFilter>();
    ScanFilter.Builder scanFilterBuilder = new ScanFilter.Builder();
    //scanFilterBuilder.SetServiceUuid(_applicationParcelUuid);
        scanFilters.Add(scanFilterBuilder.Build());

    ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder();
        scanSettingsBuilder.SetScanMode(Android.Bluetooth.LE.ScanMode.Balanced);

    if (!bluetoothAdapter.IsEnabled)
    {
        bluetoothAdapter.Enable();
    }

    if (BluetoothAdapter.DefaultAdapter.BluetoothLeScanner != null)
    {
        BluetoothAdapter.DefaultAdapter.BluetoothLeScanner.StartScan(scanFilters, scanSettingsBuilder.Build(), _customScanCallback);

        _bleScanningInitialized = true;
    }
    else
    {
        if (ContextCompat.CheckSelfPermission(ApplicationContext,
            Android.Manifest.Permission.AccessFineLocation) != Permission.Granted)
        {

        }
    }
}

public class CustomScanCallback : ScanCallback
{
    public override void OnScanResult([GeneratedEnum] ScanCallbackType callbackType, ScanResult result)
    {
        base.OnScanResult(callbackType, result);

        if (result.ScanRecord.ServiceUuids != null)
        {
            foreach (var x in result.ScanRecord.ServiceUuids)
            {
                var id = x.Uuid.ToString();

                // never true
                if(id == _applicationGuid)
                {
                    // Found my advertisement,
                }
            }
        }
    }

    public override void OnScanFailed([GeneratedEnum] ScanFailure errorCode)
    {
        // never gets called
        base.OnScanFailed(errorCode);
    }
}

最佳答案

终于找到问题了:AddServiceData应该是AddServiceUuid,这样我就可以在扫描回调的result.ScanRecord.ServiceUuids中找到它。另外,对于其他不知道的人来说,蓝牙 5.0 需要 Android 8.0,它具有增加的广告数据容量:

https://source.android.com/devices/bluetooth/ble_advertising

您的设备还需要支持蓝牙 5.0。我的 SM-T580 没有。

对于旧版本的蓝牙,您不能通告超过 1 个 UUID,或最大用户负载为 29 字节。

关于android - 找不到 BLE 广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54155335/

相关文章:

c# - Shared Xamarin.Forms - 命名空间中不存在类型或命名空间名称 'App'

android - Monodroid 动画值

android - 单体机器人 : using extended view class in xml

android - 使用 BLE - 读取 GATT 特性

c - 了解实现低功耗蓝牙 CRC 的 C 代码

android - 应用程序缓存在 android 设备上不起作用(在 chrome 浏览器上运行良好)

android - 从 Android Studio Gradle 项目的 GIT 中排除的文件,以维护 MAC 和 Windows 中的代码。

android - ADT (Eclipse) 与 Android Studio : How much APK file size difference is normal?

java - 可能的 Android 项目依赖于其他(非库)Android 项目吗?

linux - 在 linux 命令行中使用低功耗蓝牙