2016-08-29 3 views
-2

wenn ich startRangingBeaconsInRegion (neue Region ("myRangingUniqueId", null, null, null);) um das iBeacon-Signal in der Gegend, kann mein Code nur ein iBeacon bekommen signal, selbst wenn ich zwei oder drei iBeacon Sender im Raum aufstelle. Gibt es einen Fehler in meinem Code? oder vor stopRangingBeaconsInRegion kann die Ranging nur ein iBeacon-Signal bekommen?wenn mehrere iBeacon Sender, startRangingBeaconsInRegion Funktion nur erhalten eine UUID

mein Code:

private OnClickListener clickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v){ 
     if (v.equals(ibeaconRecv)){ 
      TransmitTh transmitTh = new TransmitTh(); 
      ReceiveTh receiveTh = new ReceiveTh(); 
      NewReceiveTh newReceiveTh = new NewReceiveTh(); 

      transmitTh.start(); 
      //receiveTh.start(); 
      newReceiveTh.start(); 
     } 
    } 
}; 




class NewReceiveTh extends Thread{ 

    @Override 
    public void run() { 
     int waitFlagTimes = WAIT_REV_FLAG_CHANGE_TIMES; 
     Identifier taponUUIDIden = Identifier.parse(TaponUUIDStr); 
     //Region doorBeaconRegion = new Region("TaponiBeaconDoor", taponUUIDIden, null, null); 
     Region doorBeaconRegion = new Region("TaponiBeaconDoor", null, null, null); 

     matchFlag = WAIT_FOUND_CORRECT_TRASNMIT; 
     //start receive iBeacon signal 
     Log.d("BEA","start to receive iBeacon signal"); 
     recTimes = TIMES_RECEV_NOT_FOUND;  
     try { 
      beaconManager.startRangingBeaconsInRegion(doorBeaconRegion); 
     } catch (RemoteException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     while(recTimes > 0){ 
      recTimes--; 
      if(matchFlag == FOUND_CORRECT_TRASNMIT){ 
       Log.i("BEA","Get the Door iBeacon signal and generate the output. it's a success end!"); 
       addValue = ((major + minor) > 0xFFFE)?(0xFFFE) : (major + minor); 
       minusValue = (major > minor)?(major - minor):(minor - major); 
       transmittFlag = true; 
       break; 
      } 
      else if(matchFlag == NOT_FOUND_CORRECT_TRASNMIT){ 
       Log.i("BEA","Not get correct iBeacon signal, try again!"); 
       matchFlag = WAIT_FOUND_CORRECT_TRASNMIT; 
      } 
      else{ 
       try { 
        Thread.sleep(TIME_INTERVAL_NOF_FOUND); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }      
      } 
     } 
     Log.d("BEA","time is over!"); 
     try { 
      beaconManager.stopRangingBeaconsInRegion(doorBeaconRegion); 
     } catch (RemoteException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }   
    } 
} 


@Override 
public void onBeaconServiceConnect() { 
    beaconManager.setRangeNotifier(new RangeNotifier() { 

     @Override 
     public void didRangeBeaconsInRegion(Collection<Beacon> beacons, 
       Region arg1) { 
      boolean patternFound = false; 
      if (beacons.size() > 0) { 
       patternFound = true; 
       double distance = beacons.iterator().next().getDistance(); 
       Identifier beaconUUID = beacons.iterator().next().getId1(); 
       Identifier beaconMajor = beacons.iterator().next().getId2(); 
       Identifier beaconMinor = beacons.iterator().next().getId3(); 
       major = beaconMajor.toInt(); 
       minor =beaconMinor.toInt(); 

       Log.d("BEA", "The first beacon I see is "+beacons.iterator().next().toString()+"."); 
       Log.d("BEA", "The first beacon I see is about "+distance+" meters away."); 

       if(patternFound){ 
        if(distance >= MAX_DISTANCE_PERMIT_OPEN){ 
         patternFound = false; 
        }      
       } 

       if(patternFound){ 
        if(!(beaconUUID.toString().equalsIgnoreCase("5461706F-6E69-4265-6163-6F6E446F6F72"))){ 
         patternFound = false; 
        } 
       } 

       if(patternFound){ 
        if((major == 1) || (minor == 1)){ 
         patternFound = false; 
        } 
       } 

       if(!patternFound){ 
        Log.i("BEA", "The incorrect parameter is:"+beaconUUID.toString()+" & "+major+" & "+minor); 
        matchFlag = NOT_FOUND_CORRECT_TRASNMIT; 
       } 
       else{ 
        matchFlag = FOUND_CORRECT_TRASNMIT; 
       } 
      }    
     } 
    }); 
} 


class TransmitTh extends Thread{ 

    @Override 
    public void run() { 
     int waitFlagTimes = WAIT_TRN_FLAG_CHANGE_TIMES; 
     while(!transmittFlag && (waitFlagTimes > 0)){ 
      waitFlagTimes--; 
      try { 
       Thread.sleep(1); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     if(transmittFlag){ 
      transmittFlag = false; 
      Log.d("BEA","transmit flag is set, new transmit should be send!"); 
      //start transfer new iBeacon signal 
      Beacon newBeacon = new Beacon.Builder() 
        .setId1("FDA50693-A4E2-4FB1-AFCF-C6EB07647826") 
        .setId2(""+addValue) 
        .setId3(""+minusValue) 
        .setManufacturer(0x004c) 
        .setTxPower(-59)  //0xC5 
        .setDataFields(Arrays.asList(new Long[] {0l})) 
        .build(); 
      BeaconParser newBeaconParser = new BeaconParser() 
        .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"); 
      final BeaconTransmitter newBeaconTransmitter = new BeaconTransmitter(getApplicationContext(), newBeaconParser); 
      newBeaconTransmitter.startAdvertising(newBeacon, new AdvertiseCallback() { 

       @Override 
       public void onStartFailure(int errorCode) { 
        Log.e("BEA", "Advertisement start failed with code: "+errorCode); 
       } 

       @Override 
       public void onStartSuccess(AdvertiseSettings settingsInEffect) { 
        Log.i("BEA", "New Advertisement start succeeded. Major:"+addValue+", Minor:"+minusValue); 
        try { 
         Thread.sleep(TRANSMIT_MAINTAIN_TIME); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        newBeaconTransmitter.stopAdvertising(); 
        Log.i("BEA", "New Advertisement stop succeeded."); 
       } 
      }); 
     } 
     else{ 
      Log.d("BEA","after waiting, no transmit flag is set!"); 
     } 
    } 
} 
+0

Können Sie bitte Ihren Code zeigen? Ich vermute, dass dies ein einfacher Fehler sein könnte, vielleicht basierend auf der Untersuchung nur des ersten Punktes im Callback-Bereich. – davidgyoung

+0

sicher, ich werde meinen Code in meine Frage mit "bearbeiten" -Funktion einfügen. –

Antwort

0

Der Code muss statt nur Blick auf die ersten gefunden alle Baken iterieren. Dazu ändern:

if (beacons.size() > 0) { 
      patternFound = true; 
      double distance = beacons.iterator().next().getDistance(); 
      Identifier beaconUUID = beacons.iterator().next().getId1(); 
      Identifier beaconMajor = beacons.iterator().next().getId2(); 
      Identifier beaconMinor = beacons.iterator().next().getId3(); 

zu:

for (Beacon beacon : beacons) { 
      patternFound = true; 
      double distance = beacon.getDistance(); 
      Identifier beaconUUID = beacon.getId1(); 
      Identifier beaconMajor = beacon.getId2(); 
      Identifier beaconMinor = beacon.getId3(); 
+0

Ja, ich erkenne meinen Fehler ... Es tut mir leid, dass ich eine dumme Frage gestellt habe –

+0

danke an @davidgyoung, mit deinem Vorschlag aktualisiere ich meinen Code und installiere ihn auf meinem HUAWEI 7i Mobiltelefon. Wenn der Code "' für (Beacon Beacon: Beacons) "" ausgeführt wird, wird der Fehler gemeldet "** E/CycleLeScannerForLollipop (11734): Scan Failed **". Es ist in Ordnung auf meinem Nexus 5 (entfernen Sie den Sendecode). –

+0

mit Locate-App auf meinem HUAWEI 7i Mobiltelefon, wenn mehr als ein Sender, drücken Sie die Taste "Locate Beacons" wird die App neu starten. –

Verwandte Themen