代码之家  ›  专栏  ›  技术社区  ›  Drake

找不到可靠的广告

  •  2
  • Drake  · 技术社区  · 6 年前

    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广告的代码,看看我是否可以自己选择它。它可以从其他设备中找到其他可播放的广告,但不能从我的应用程序中找到。这是我的扫描代码,它运行在同一个应用程序上:

    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);
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Drake    6 年前

    AddServiceData 应该是 AddServiceUuid 所以我可以在里面找到它 result.ScanRecord.ServiceUuids 扫描回调函数的。另外,对于其他不知道的人来说,蓝牙5.0需要安卓8.0,它增加了广告的数据容量:

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

    对于较旧版本的蓝牙,您发布的UUID不能超过1个,最大用户负载不能超过29字节。