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
Post a Comment