gpt4 book ai didi

android - LE ScanRecord 的 getServiceData() 返回 null

转载 作者:行者123 更新时间:2023-11-30 00:06:03 25 4
gpt4 key购买 nike

我正在尝试实现蓝牙广告商和扫描仪。我的广告商代码在广告数据包中使用一些服务数据进行广告。在扫描器端,当我尝试使用在广告商中添加服务数据期间使用的相同 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com