在 Android 上难以从 BLE 包中读取数据
Difficulty in reading data from BLE package on Android
我正在设计一个传感器系统,在接收端有一个传感器和一个 Android 设备:
目前,由于传感器不可用,我正在使用另一个 android 设备作为 BLE 广告商。注意我没有连接设备,只是看了广告包
在发射端,我正在创建一个包含设备名称、UUID 和特定 UUID 数据的数据包:
private void advertise() {
BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode( AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY )
.setTxPowerLevel( AdvertiseSettings.ADVERTISE_TX_POWER_HIGH )
.setConnectable(false)
.build();
ParcelUuid pUuid = new ParcelUuid( UUID.fromString( getString( R.string.ble_uuid ) ) );
byte[] mdata = "Hello".getBytes(Charset.forName("UTF-8"));
AdvertiseData data = new AdvertiseData.Builder()
.setIncludeDeviceName( true )
.addServiceUuid( pUuid )
.addServiceData( pUuid, mdata )
.build();
AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
}
@Override
public void onStartFailure(int errorCode) {
Log.e( "BLE", "Advertising onStartFailure: " + errorCode );
super.onStartFailure(errorCode);
}
};
这部分效果很好,因为我使用 BLE 扫描仪应用程序接收到的原始数据正是我要发送的数据。
问题出在接收端。我所做的是:
private void discover() {
List<ScanFilter> filters = new ArrayList<ScanFilter>();
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid( new ParcelUuid(UUID.fromString( getString(R.string.ble_uuid ) ) ) )
.build();
filters.add( filter );
ScanSettings settings = new ScanSettings.Builder()
.setScanMode( ScanSettings.SCAN_MODE_LOW_LATENCY )
.build();
mBluetoothLeScanner.startScan(filters, settings, mScanCallback);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mBluetoothLeScanner.stopScan(mScanCallback);
}
}, 10000);
}
我的 scanCallBack 函数如下:
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if( result == null
|| result.getDevice() == null
|| TextUtils.isEmpty(result.getDevice().getName()) )
return;
StringBuilder builder = new StringBuilder( result.getDevice().getName());
for(int j = 0; j < result.getScanRecord().getServiceUuids().size(); j++){
builder.append("\n");
builder.append("Result no. " + j);
builder.append("\n");
builder.append(result.getScanRecord().getServiceUuids().get(j));
builder.append("\n");
builder.append("Service data: ");
builder.append("\n");
builder.append(result.getScanRecord().getServiceData(result.getScanRecord().getServiceUuids().get(j)));
}
mText.setText(builder.toString());
}
在我尝试读取数据时,此代码始终 returns 为空。
总的来说,我可以读取设备的名称和设备的 UUID,但不能读取数据。
请给我一些关于这件事的智慧。
我发现 android 使用 16 位 UUIDS,这意味着它按以下方式转换 128 位 UUID:
这是原始的 128 位 UUID:
01122334-4556-6778-899A-ABBCCDDEEFF0
.
使用此 UUID 发送数据。
一旦从 android 收到此 UUID,android 仅保留 2334 并转储其余部分。
然后它以默认方式创建一个新的 128 位 UUID:
0000XXXX-0000-1000-8000-00805f9b34fb
.
其中 XXXX 是我的 16 位 UUID 2334。
所以为了访问我的数据,我需要寻找 android 给我的数据的 128 位 UUID,在这种情况下:
00002334-0000-1000-8000-00805f9b34fb
.
所以在我的例子中,在 android 分配给我自己的 128 位 UUID 上发送我的数据是非常实用的。
我不确定为什么会这样,但现在它运行良好。
我正在设计一个传感器系统,在接收端有一个传感器和一个 Android 设备:
目前,由于传感器不可用,我正在使用另一个 android 设备作为 BLE 广告商。注意我没有连接设备,只是看了广告包
在发射端,我正在创建一个包含设备名称、UUID 和特定 UUID 数据的数据包:
private void advertise() {
BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode( AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY )
.setTxPowerLevel( AdvertiseSettings.ADVERTISE_TX_POWER_HIGH )
.setConnectable(false)
.build();
ParcelUuid pUuid = new ParcelUuid( UUID.fromString( getString( R.string.ble_uuid ) ) );
byte[] mdata = "Hello".getBytes(Charset.forName("UTF-8"));
AdvertiseData data = new AdvertiseData.Builder()
.setIncludeDeviceName( true )
.addServiceUuid( pUuid )
.addServiceData( pUuid, mdata )
.build();
AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
}
@Override
public void onStartFailure(int errorCode) {
Log.e( "BLE", "Advertising onStartFailure: " + errorCode );
super.onStartFailure(errorCode);
}
};
这部分效果很好,因为我使用 BLE 扫描仪应用程序接收到的原始数据正是我要发送的数据。
问题出在接收端。我所做的是:
private void discover() {
List<ScanFilter> filters = new ArrayList<ScanFilter>();
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid( new ParcelUuid(UUID.fromString( getString(R.string.ble_uuid ) ) ) )
.build();
filters.add( filter );
ScanSettings settings = new ScanSettings.Builder()
.setScanMode( ScanSettings.SCAN_MODE_LOW_LATENCY )
.build();
mBluetoothLeScanner.startScan(filters, settings, mScanCallback);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mBluetoothLeScanner.stopScan(mScanCallback);
}
}, 10000);
}
我的 scanCallBack 函数如下:
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if( result == null
|| result.getDevice() == null
|| TextUtils.isEmpty(result.getDevice().getName()) )
return;
StringBuilder builder = new StringBuilder( result.getDevice().getName());
for(int j = 0; j < result.getScanRecord().getServiceUuids().size(); j++){
builder.append("\n");
builder.append("Result no. " + j);
builder.append("\n");
builder.append(result.getScanRecord().getServiceUuids().get(j));
builder.append("\n");
builder.append("Service data: ");
builder.append("\n");
builder.append(result.getScanRecord().getServiceData(result.getScanRecord().getServiceUuids().get(j)));
}
mText.setText(builder.toString());
}
在我尝试读取数据时,此代码始终 returns 为空。
总的来说,我可以读取设备的名称和设备的 UUID,但不能读取数据。
请给我一些关于这件事的智慧。
我发现 android 使用 16 位 UUIDS,这意味着它按以下方式转换 128 位 UUID:
这是原始的 128 位 UUID:
01122334-4556-6778-899A-ABBCCDDEEFF0
.
使用此 UUID 发送数据。
一旦从 android 收到此 UUID,android 仅保留 2334 并转储其余部分。
然后它以默认方式创建一个新的 128 位 UUID:
0000XXXX-0000-1000-8000-00805f9b34fb
.
其中 XXXX 是我的 16 位 UUID 2334。
所以为了访问我的数据,我需要寻找 android 给我的数据的 128 位 UUID,在这种情况下:
00002334-0000-1000-8000-00805f9b34fb
.
所以在我的例子中,在 android 分配给我自己的 128 位 UUID 上发送我的数据是非常实用的。
我不确定为什么会这样,但现在它运行良好。