我設計具有傳感器和在接收端的Android裝置的傳感器系統:難度從BLE包在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());
}
該代碼始終返回null,在那裏我嘗試閱讀我的數據點。
總的來說,我可以讀取設備的名稱和設備的UUID,但不能讀取數據。
請給我一些關於此事的看法。
你有沒有試過檢查'scanRecord'是否有任何值? – Natan
是的。我使用'.getScanRecord()。getServiceUuids()。get(0)'和'.getScanRecord()。getDeviceName()'來讀取設備名稱和UUID,所有工作都很好。 – user2149122
getBytes()'怎麼辦? – Natan