在我的 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/