android - when several iBeacon transmitter, startRangingBeaconsInRegion function only get one UUID -


when use startrangingbeaconsinregion(new region("myranginguniqueid", null, null, null);) range ibeacon signal in area, code can 1 ibeacon signal, set 2 or 3 ibeacon transmitters in room. there mistake in code? or before stoprangingbeaconsinregion ranging can 1 ibeacon signal?

my 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 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 door ibeacon signal , generate output. it's 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 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 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 see "+beacons.iterator().next().tostring()+".");                 log.d("bea", "the first beacon see "+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 set, new transmit should 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 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 set!");         }     } } 

the code must iterate on beacons found instead of looking @ first. this, change:

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(); 

to:

for (beacon beacon : beacons) {             patternfound = true;             double distance = beacon.getdistance();             identifier beaconuuid = beacon.getid1();             identifier beaconmajor = beacon.getid2();             identifier beaconminor = beacon.getid3(); 

Comments

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -