android - LE ScanRecord 的 getServiceData() 返回 null

标签 android android-studio bluetooth-lowenergy

我正在尝试实现蓝牙广告商和扫描仪。我的广告商代码在广告数据包中使用一些服务数据进行广告。在扫描器端,当我尝试使用在广告商中添加服务数据期间使用的相同 UUID 获取数据时,getService 数据方法返回空对象。这是我的广告客户代码。

public class Main_Service extends Service{
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeAdvertiser mBluetoothLeAdvertiser;
private Intent mIntent;
private String RSSI,SSID,MAC;
@Override
public IBinder onBind(Intent intent) {
    return null;
}
public int onStartCommand (Intent intent, int flags, int startId) {
    RSSI = intent.getStringExtra("RSSI");
    SSID = intent.getStringExtra("SSID");
    MAC= intent.getStringExtra("MAC");
    Toast.makeText(this, RSSI+";"+SSID+";"+MAC+":", Toast.LENGTH_LONG).show();
    initialize();
    startadvertising();
    return 0;
}
public void onCreate() {
    Toast.makeText(this, "Service Created", Toast.LENGTH_LONG).show();
}
private void startadvertising() {
    AdvertiseSettings settings = buildAdvertiseSettings();
    AdvertiseData data = buildAdvertiseData();
    if (mBluetoothLeAdvertiser != null) {
        mBluetoothLeAdvertiser.startAdvertising(settings, data, new AdvertiseCallback() {
            @Override
            public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                super.onStartSuccess(settingsInEffect);
                Toast.makeText(getBaseContext(), "Adertising", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onStartFailure(int errorCode) {
                super.onStartFailure(errorCode);
                Toast.makeText(getBaseContext(), "Advertisement failed", Toast.LENGTH_LONG).show();
            }
        });
    }
    else{
        Toast.makeText(getBaseContext(), "BLE is not supported", Toast.LENGTH_LONG).show();
    }
}
private void initialize() {
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if(mBluetoothAdapter!=null){
        if(!mBluetoothAdapter.isEnabled()){
            mBluetoothAdapter.enable();
        }
    }
    else{
        Toast.makeText(getBaseContext(), "BL is not supported", Toast.LENGTH_LONG).show();
    }
    mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
}
private AdvertiseSettings buildAdvertiseSettings() {
    AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
    settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER);
    settingsBuilder.setTimeout(0);
    return settingsBuilder.build();
}
private AdvertiseData buildAdvertiseData() {
    AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
    //String data = RSSI+SSID.substring(0,10)+MAC.replaceAll(":","");
    byte[] serviceData = new byte[15];
    serviceData[0] = (byte)Integer.parseInt(RSSI);
    String[] macAddressParts = MAC.split(":");
    for(int i=0; i<6; i++){
        Integer hex = Integer.parseInt(macAddressParts[i], 16);
        serviceData[i+1] = hex.byteValue();
    }
    for(int i=0;i<8;i++) {
        serviceData[i+7] = (byte)(SSID.charAt(i));
    }
    long mostsignificant=0,leastsignificant=5122;
    UUID s_id = new UUID(mostsignificant,leastsignificant);
    dataBuilder.addServiceData(new ParcelUuid(s_id),serviceData);
    Toast.makeText(this, s_id.toString(), Toast.LENGTH_LONG).show();
    return dataBuilder.build();
}
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
}
public void onDestroy() {
    mBluetoothAdapter = null;
    mBluetoothLeAdvertiser = null;
    Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
}
}

最佳答案

在正常的 BLE 流程中,我们需要在与 BLE 设备建立成功连接后调用 discoverService()。我们将在 onServiceDiscoverd() 中获得回调。之后,我们需要使用相应的服务和特征 UUID 来访问 getService()。在调用 discoverService() 之前,getService() 将始终返回 null。我希望这能帮到您。如果您需要,我可以分享我完整的服务流程。

关于android - LE ScanRecord 的 getServiceData() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48983333/

相关文章:

Android Studio 3.2 上的 AndroidX - 运行应用程序时出现 VerifyError

java - 更改选定状态下的按钮形状?

bluetooth - GATTTool 无法读取/写入特性

android - 增加 Android BLE 绑定(bind)/配对对话框超时

java - Java中如何解析这一行信息呢?

android - 如何在用户个人资料页面中重新创建动画,如 "PATH android app "所示?

android - AlarmManager 设置为 PM 在 AM 时间触发

android - 文件上传进度条android,类似于whatsapp?

android - Android Studio-如何导出包含其他jar的jar?

ios - 如何在应用程序未运行(终止/终止)时保持 Core Location 和 Core Bluetooth 运行?