2016-10-03 185 views
0

我正在玩Android和iOS的實驗性Bluetooth LE程序,現在我在iOS端發送Android端過濾信標廣告時遇到了一些麻煩。 Android有一個功能,可以通過UUID過濾廣告(我需要這個功能,因爲我試圖獲得以特定值開頭的UUID),但是我無法使其工作。這就是我想要的:Android藍牙LE屏蔽UUID過濾器

private void freshen() { 
    // kill current scanner 
    if (mLEScanner != null) 
     mLEScanner.stopScan(mScanCallback); 

    // set new one to be a match scanner 
    ScanSettings settings = new ScanSettings.Builder() 
      .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) 
      .build(); 

    List<ScanFilter> filters = new ArrayList<>(); 

    // create data uuid starting with the value 1 
    ParcelUuid data = ParcelUuid.fromString("10000000-0000-0000-0000-000000000000"); 
    // create a mask to ensure only that value is searched 
    ParcelUuid mask = ParcelUuid.fromString("10000000-0000-0000-0000-000000000000"); 

    // build the filter 
    ScanFilter.Builder builder = new ScanFilter.Builder(); 
    builder.setServiceUuid(data, mask); 
    ScanFilter filter = builder.build(); 

    // add the filter to the scanner 
    filters.add(filter); 
    mLEScanner.startScan(filters, settings, mScanCallback); 
} 

它正在產生零結果。即使我將所有掩碼值設置爲0(這是忽略的數字),它仍然會產生零結果。當我刪除過濾器時,會出現大量以1開頭的結果。這在Android的當前版本中打破了嗎?

回答

0

它不是解決這個問題的方法,但是我決定用DeviceName來過濾,因爲這可以由Android和iOS雙方填充。現在,我注重的iOS到Android通訊=>

的iOS:

func centralManager(_: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi: NSNumber){ 

    delegate?.didDiscoverPeripheral(peripheral) 
    let splitUp : [String] = "\(advertisementData)".components(separatedBy: "\n") 
    if (splitUp.count > 1) 
    { 
     var chop = splitUp[1] 
     let counter = chop.characters.count - 2 
     chop = chop[0..<counter] 
     let chopSplit : [String] = "\(chop)".components(separatedBy: "\"") 

     if !(chopSplit.count > 1 && chopSplit[1] == "Device Information" && !sending) 
     { 
      let hexString = chop[4..<7] + chop[12..<19] + chop[21..<26] 
      let hexArray = [hexString[0..<1], hexString[2..<3], hexString[4..<5], hexString[6..<7], hexString[8..<9], hexString[10..<11], hexString[12..<13], hexString[14..<15], hexString[16..<17]] 
      let charArray = hexArray.map { Character(hexToScalar(char: $0)) } 
      let string = String(charArray) as String 
      if (string == "GoTcHa" + stringify(number: writing)) 
      { 
       writing += 1 
       let messageUUID = StringToUUID(hex: String(writing) + "hello" + String(writing)) 
       peripheralManager.stopAdvertising() 
       let name = String(writing) as NSString 
       peripheralManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey: [CBUUID(string: messageUUID)], CBAdvertisementDataLocalNameKey: name]) 
      } 
     } 
    } 
} 

func StringToUUID(hex: String) -> String 
{ 
    var rev = String(hex.characters.reversed()) 
    let hexData: NSData! = rev.data(using: String.Encoding.utf8, allowLossyConversion: false) as NSData! 
    rev = hexData.toHexString() 
    while(rev.characters.count < 31) { 
     rev = "0" + rev; 
    } 
    rev = String(writing % 10) + rev[0..<30] 
    let finalString = rev[0..<7] + "-" + rev[8..<11] + "-" + rev[12..<15] + "-" + rev[16..<19] + "-" + rev[20..<31] 
    return finalString 
} 

而且更重要的是Android的掃描方法,它現在總是通過設備名稱在尋找下一個消息忽略來自iOS的重複消息:

private void freshen() { 
    if (mLEScanner != null) 
     mLEScanner.stopScan(mScanCallback); 
    ScanSettings settings = new ScanSettings.Builder() 
      .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) 
      .setNumOfMatches(ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT) 
      .build(); 

    List<ScanFilter> filters = new ArrayList<>(); 

    ScanFilter filter = new ScanFilter.Builder() 
      .setDeviceName("" + (reading % 10)) 
      .build(); 

    filters.add(filter); 

    mLEScanner.startScan(filters, settings, mScanCallback); 
} 

我需要讓iOS端更好地過濾Android的響應,但它在Android接收端是有效的。