2016-03-28 97 views
0

我试图用BLE框架来测试广告BLE - 我怎么能检查做广告

// Get LE advertise Object 
     BluetoothLeAdvertiser bluetoothLeAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser(); 

     // Setting LE advertise 
     AdvertiseSettings advertiseSettings = new AdvertiseSettings.Builder() 
       .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) 
       .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH) 
       .setTimeout(0) 
       .setConnectable(true) 
       .build(); 

     // UUIDs 
     ParcelUuid serviceUUID = new ParcelUuid(UUID.fromString(SERVICE_UUID)); 

     // Setting LE advertise data 
     AdvertiseData advertiseData = new AdvertiseData.Builder() 
       .setIncludeDeviceName(true) 
       .addServiceUuid(serviceUUID) 
       .build(); 

     // Start advertising 
     bluetoothLeAdvertiser.startAdvertising(advertiseSettings, advertiseData, advertiseCallback); 

上面的代码工作正常,但我发现,如果我再次调用此方法,中央设备将显示2相同名称设备,当我再次调用该方法时,它将成为3个中央名称相同的设备,所以我尝试在Android上搜索BLE API,但找不到任何方法可以检测到广告已经存在BluetoothLeAdvertiser,有什么方法检测广告已经存在?


编辑:

/** 
* Advertise callback 
*/ 
private AdvertiseCallback advertiseCallback = new AdvertiseCallback() { 
    @Override 
    public void onStartFailure(int errorCode) { 
     super.onStartFailure(errorCode); 
     GlobalVariable.logInfo(BLEUtility.class.getName(), String.format("Advertising start failed (%d)", errorCode)); 
    } 

    @Override 
    public void onStartSuccess(AdvertiseSettings settingsInEffect) { 
     super.onStartSuccess(settingsInEffect); 
     GlobalVariable.logInfo(BLEUtility.class.getName(), "Advertising start succeed"); 
    } 
}; 

不幸的Android没有做广告检查方法,所以只设置一个标志,真正当onStartSuccess

回答

0

EDIT1:

你不能用一个回调启动servel广告:

/** 
* Start Bluetooth LE Advertising. The {@code advertiseData} will be broadcasted if the 
* operation succeeds. The {@code scanResponse} is returned when a scanning device sends an 
* active scan request. This method returns immediately, the operation status is delivered 
* through {@code callback}. 
* <p> 
* Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} 
* 
* @param settings Settings for Bluetooth LE advertising. 
* @param advertiseData Advertisement data to be advertised in advertisement packet. 
* @param scanResponse Scan response associated with the advertisement data. 
* @param callback Callback for advertising status. 
*/ 
public void startAdvertising(AdvertiseSettings settings, 
     AdvertiseData advertiseData, AdvertiseData scanResponse, 
     final AdvertiseCallback callback) { 
    synchronized (mLeAdvertisers) { 
     BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter); 
     if (callback == null) { 
      throw new IllegalArgumentException("callback cannot be null"); 
     } 
     if (!mBluetoothAdapter.isMultipleAdvertisementSupported() && 
       !mBluetoothAdapter.isPeripheralModeSupported()) { 
      postStartFailure(callback, 
        AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED); 
      return; 
     } 
     boolean isConnectable = settings.isConnectable(); 
     if (totalBytes(advertiseData, isConnectable) > MAX_ADVERTISING_DATA_BYTES || 
       totalBytes(scanResponse, false) > MAX_ADVERTISING_DATA_BYTES) { 
      postStartFailure(callback, AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE); 
      return; 
     } 

//look here 

     if (mLeAdvertisers.containsKey(callback)) { 
      postStartFailure(callback, AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED); 
      return; 
     } 

     IBluetoothGatt gatt; 
     try { 
      gatt = mBluetoothManager.getBluetoothGatt(); 
     } catch (RemoteException e) { 
      Log.e(TAG, "Failed to get Bluetooth gatt - ", e); 
      postStartFailure(callback, AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR); 
      return; 
     } 
     AdvertiseCallbackWrapper wrapper = new AdvertiseCallbackWrapper(callback, advertiseData, 
       scanResponse, settings, gatt); 
     wrapper.startRegisteration(); 
    } 
} 

我认为没有系统的方法来判断它。

private boolean started = false; 
public void startadvertise(){ 
    if(started)return; 
    started = true; 
    //your code to startAdvertising 
} 

public void stopadvertise(){ 
    started = false; 
    //your code to stopAdvertising 
} 
+0

所以唯一的办法就是设置一个标志...确定... – user3814793

+0

@ user3814793哪里是你advertiseCallback?我认为这是key.Just用一个成员来存储它,你将只能启动一个广告。 –

+0

什么是“mLeAdvertisers”? – user3814793