首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >找不到BLE广告

找不到BLE广告
EN

Stack Overflow用户
提问于 2019-01-11 23:26:01
回答 1查看 1.4K关注 0票数 2

在我的Xamarin.Forms应用程序中,我正在编写本地Android代码,为UUID和一些测试数据做广告,让其他设备扫描并找到它。我在平板电脑SM 580上运行这个应用程序。这是我的代码:

代码语言:javascript
复制
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覆盖会被调用,所以我认为它应该能工作。我试着使用Nexus5设备上的nRF连接应用程序来测试它,但我从未在上面看到过我的设备的广告。

编辑

我试图添加代码,扫描BLE广告,看看我是否可以自己捡起它。它从其他设备上找到了其他BLE广告,但没有从我的应用程序中找到。下面是我的扫描代码,它运行在同一个应用程序上:

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-14 17:18:38

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

advertising

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

对于较早版本的蓝牙,您不能广告超过一个UUID,或最大的用户有效载荷为29个字节。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54155335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档