It is possible to find actual ble
txPower
of android device. So that, I can use it below Beacon builder object instead of -59 as txPower.
Beacon beacon = new Beacon.Builder()
.setId1("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6")
.setId2("1")
.setId3("2")
.setManufacturer(0x0118)
.setTxPower(-59)
.setDataFields(Arrays.asList(new Long[] {0l}))
.build();
The use case what I have is, to read distance between two android ble device.
The txPower field is supposed to be the expected signal strength in dBm at 1 meter. Every Android phone model has a slightly different BLE transmitter output power, typically measuring from -50 dBm to -70 dBm at 1 meter.
Unfortunately there is no good way to get the proper value to use for a specific Android device model unless you measure this yourself. Android has no built-in APIs to get this, and I have never seen any published specs from phone manufacturers.
There has been renewed interest in this subject as teams develop contact tracing apps. I actually went out in a field last weekend to measure the transmitter output power of a number of devices I had handy. The Google Pixel 3a, for example, I measured -60 dBm.
If you want to take your own measurements to help in this effort, I suggest this procedure:
Go to an open area several meters away from any obstructions, particularly metal ones.
Elevate the phone transmitter on a non-metal object at least one meter off the ground. The phone should be placed on end so the screen is perpindicular to the ground. (I used a camera tripod.)
Run an app that transmits a beacon at full power on the phone on the tripod.
Hold a reference phone (preferably an iPhone SE 1st Generation or old iPhone 4-5s) on meter away so that both screens are facing the same direction.
Do a "calibration" in a beacon app like Locate Beacon to get the average RSSI over ~30 seconds.
If the phone used to do the measurement is not one of the above reference models, you will need to adjust for that phone's receiver sensitivity. The spreadsheet I shared has an example of how to do that for the Pixel 3a measuring the iPhone SE. This part can be tricky as you need one other phone with a known sensitivity or transmitter power output.
Here's my spreadsheet with the calculations: https://docs.google.com/spreadsheets/d/1-voNJAeHz78AarZmfds8WiplNhUDzeYrsW0YzKfrExU/edit?usp=sharing
I also wrote a blog post that touches on the problem of the lack of a good data set, and tells you more than you ever wanted to know about beacon ranging.
Related
I'm detecting if a person enters or exits a room using iBeacon. The implementation is as follows:
1. Two beacons are placed per room. One in the door and the other is inside near the door.
2. To detect entry, the user must pass the door beacon then the one inside the room. For exit, it's the other way around.
Issue:
In case that there are rooms that are too adjacent with each other, an overlap will occur causing an error in the detection
Planned Solution:
Use RSSI to detect which one is the last nearest beacon when the inside room is detected. I'm thinking of checking the skewness of the distribution of the RSSI on a given time, say around 1 to 2 seconds since the user detected an inside beacon.
Is there other statistical analysis or any data analysis that can be used to determine or check with a probability which room the user entered?
Unless the rooms are very large (which it sounds like they are not based on the troubles you are having) I think any technique you find will have a high error rate. You might be able to get this error rate down far enough to be acceptable by recognizing cases where you simply cannot make a determination and refusing to do so in these cases to avoid false determinations.
Your best bet is to sample multiple RSSI measurements from different beacon packets (a minimum of 10 to filter out noise), then average them, perhaps throwing out the highest and lowest value before doing so. If this average RSSI is strong enough, say < -80 dB (and it is the strongest signal you have seen from all beacons) there is a high probability you are in the room indicated by the beacon.
The RSSI may drop off if you go far away from the beacon in the room so just because the criteria above are not met does not mean you are not in the room.
Keep in mind that it is impossible to determine which beacon is closest if all signals are weak -- noise becomes more important than signal. So make no conclusions unless one beacon has RSSI stronger than, say -85 dBm.
Make sure your beacons are transmitting as strongly as possible and advertising as often as possible. The latter will ensure that you get enough RSSI samples in a short time.
Finally, keep in mind that different Android phones have different Bluetooth antennas and receive the same beacon packets more or less strongly. A Huawei P9 Lite detects BLE signals at an RSSI 20 dB weaker than a similarly placed Moto G4+. Regardless of this, phones typically do not detect beacon signals weaker that -100 dBm and below -90 dBm the measurement is so weak as to become almost useless for relative distance determination.
I have followed the tutorial from RadiusNetwork to get the distance from a beacon using Android Beacon Library. I have read that it gives some fluctuations but I have three beacons in a room that is 7m x 7m one in each corner. With this, while sitting on a corner i have one in front of me (less that 0.2m) the other one at 10m (aprox, that's the diagonal of the room) and the other one at 7m. I tried to look for a solution here, but seems like everybody gets a better distance.
I did an app with that tutorial and when measuring the distance it tells me that the one that is 0,2 m away is 1.6m away, the one that is 10m says is at 70-90 m away and the other at 7m is at 40-60m.
I thought it was due to the power of the signal, which I tried to change but it wasn't the solution, since it was broadcasting the maximum power.
Anybody with the same problem that found a solution?
I made a measurements with the app with the Android Beacon Library. The phone was 1m away from the phone, and I got the following results:
I cannot specify the RSSI value at 1 meter, I can only pick one of the Transmission power (dBm and distance). The following is how the beacon's settings (in the owner app) looks like:
Beeks Toolkit App
I am using Beeks beacons from Bluvision.
According to the company:
"The txPower calibration for Eddystone broadcasts is done internally by our beacons and SDKs. When configuring Eddystone broadcasts, the picked calibration value will automatically match the advertisement's transmission power."
davidyoung is right. If you're using the Radbeacon dot, you can configure the advertised RSSI using the Radbeacon app (link is for the Android version).
With the app open, and the beacon on, hit scan. Once you see the beacon you want to calibrate, enable connections on the beacon (in the case of the Radbeacon dot, hold the button down for a couple seconds. The led will flash).
Tap on the beacon result in the app, and tap the menu icon in the top right. Select calibrate. Allow the calibrate function to run. If you are using Altbeacon or iBeacon frame types the phone should be 1 meter away. If you are using Eddystone the phone should be at 0 meters.
Note the RSSI value it returns, then tap back and enter that value in the Calibrated Power field. Save your changes, and you should be all set.
Make sure not to confuse the calibrate power value with the transmit power setting. Once you've set the calibrated power, if you change the transmit power you'll need to re-calibrate.
Also note that your distance values can vary quite a lot. Small rooms can complicate matters due to multi-pathing and other issues. You can experiment with various filtering methods, but the distances will rarely be spot-on.
I am trying to understand what exactly txPower is and how to use it, since I am planning to develop and Android app that uses Beacons.
I have seen 2 definitions online:
1.The transmitted power of the beacon.
2.The received power 1 meter away from the beacon.
How are these two definitions related?
Also, when transmitting a Beacon signal from a device using an app such as QuickBeacon, how do I determine what to set the power (txPower) to?
Most beacon formats contain a single byte in the transmission that indicates what the expected signal level should be when you are one meter away. This byte is sometimes called txPower (short for transmitted power) and sometimes measured power.
Do not confuse this with a second configuration setting on some beacon models that lets you vary how strongly the transmitter actually sends its broadcasts. This is typically called transmit power, which is why measured power is a less easily confused term.
The measured power field is used to make distance estimates. If the phone sees that its signal level is the same as the measured power field transmitted by the beacon, it knows it is exactly one meter away. If it has a stronger signal, it knows it is closer. If it has a weaker signal it knows it is further away. Using a formula, you can get a rough idea of the distance in meters.
Making this distance estimate accurate requires having the measured power field set properly to the expected signal level at one meter. It is often pre-configured into the beacon by the manufacturer, but it is typically adjustable. Why would you want to adjust it? If you place the beacon inside a cabinet, it might attenuate the signal. If you place the beacon against a metal wall, it might increase the signal due to reflections. For this reason, it is recommended that you calibrate a beacon by measuring and setting its measured power value after installation.
Calibration involves using a phone to measure the beacon signal level (using a measurement called the Received Signal Strength Indicator or RSSI, which is measured in dBm). To calibrate, you hold a phone with a typically performing bluetooth receiver (ideally an iPhone 6, but Nexus devices work well too) exactly one meter away from the beacon, and measure the average signal strength over 30 seconds. Many beacon configuration apps and tools like Locate for iOS and Android have calibration utilities.
Once you have the calibration value, you need to configure it inside your beacon per the manufacturer's instructions. This will give you more accurate distance estimates.
Check that issue maybe it helps:
Get Tx Power of BLE Beacon in Android also you could check out some devBytes from Google about BLE
https://www.youtube.com/watch?v=vUbFB1Qypg8
If you are using specific BLE beacons you need to referenced the datasheet and check how tx power is measured. As you already mentioned there is different definitions for it. During my dev I found that most suitable is that : txPower is measured in some distance from transmitter with way without obstacles. So if there is a wall for example txpower will be lower. Consider that.
txPower has defined the range of the Bluetooth signal to transmit the beacon.
I'm using my iPhone as an iBeacon device, and on the other side I have an Android 4.4.2 device scanning for the Bluetooth LE iBeacon signal from the iPhone. I searched for a good and easy way to calculate the distance between iBeacons and my Android phone, but I couldn't find anything that can help me with this.
Could you help me on this matter?
It's impossible to measure beacon distance accurately, I'm afraid, which is why Apple's own code just says "Immediate", "Near", "Far" and "Unknown". The best you can do is set up a reconstruction of the conditions you expect then do trial and error tests to map signal strength to probable distance. Trust me: I've spent a lot of time trying to do beacon distance measurement using a range of hardware.
Remember that the LE in Bluetooth LE means "Low Energy" – this stuff really is designed to use as little power as possible. That means the signal from iBeacons gets interrupted by people, walls and other objects. So, if I'm holding a beacon in my hand and put my phone next to it, I'll get a strong signal. If I move the beacon behind my back, the signal strength will collapse. If I just turn around, that has the same effect (for the same reason).
If you want to go down the "best you can do" approach, you effectively have to recreate at least partially the environment where your app will be used. So, if your app will be used in an office, find an office and place some beacons around there. Same for being in a shop.
Then get your app out and measure beacon strength at various distances to the beacon, potentially with obstacles in the way. With some averaging, you end up with something like "at 1 metre my signal strength was X, at 5 metres it was Y, at 10 metres it was Z", etc, and you then feed that into your distance calculation. It is, effectively, an educated guess.
If you find any library that claims to do beacon distancing for you, it just means they've taken their own educated guess based on their own signal strength testing.
One tip: if you're able to, stick your beacons to the ceiling. This minimises the chance of obstacles (read: people) getting between your beacon and your app.
We built a distance estimation formula into the Android Beacon Library of the form: d=A*(r/t)^B+C, where d is the distance in meters, r is the RSSI measured by the device and t is the reference RSSI at 1 meter. A, B, and C are constants. You can read more about it here. To use it with the library, you range for a beacon and then simply call:
beacon.getDistance();
This returns a distance estimate in meters. The library code is open source, so if you don't want to use the library you can copy the formula and use it directly.
As #TwoStraws notes, distance estimates are pretty rough guesses of how far a beacon is away, and the results you get vary with lots of factors:
The gain of the antenna on the receiving device. (Every Android device model is slightly different)
The noise on the A/D converter inside the phone that measures bluetooth signal strength.
The radio noise in the room.
Any obstructions between the transmitter and receiver.
Any surfaces (especially metal) that reflect radio signals.
Just be sure you set your expectations properly. Distance estimates are good for deciding if a beacon is close or far, or whether one beacon is closer than another. But they are less useful for measuring absolute distance.
I have couple of questions regarding the Radius networks Beacon.
How can we get the accurate distance between android devices and
beacon? So far the distance we're getting through
"android-beacon-library" is fluctuating.
How can we limit the beacon's transmission radius, say allowing
beacon to transmit only for 5 meters or to 20 cms ?
Please find the image with beacon distance reading for various devices (Moto g , Nexus 5 , Nexus 4 and iPhone 5s)
You will always see fluctuation on beacon distance estimates, so you have to set your expectations appropriately. Beacon distance estimating works by starting with a measurement of the radio signal strength using the bluetooth radio on the mobile device. A stronger signal means that the beacon is closer, where a weaker signal means the beacon is further away. The beacon transmits a reference value of its expected signal strength at 1 meter, saying in effect "If you are one meter away, you should see my signal level as -56 dBm". A formula inside the mobile phone then tries to make a guess of how far it is away based on the signal level at any given time. If the signal is a little bit weaker than -56dBm, such as -65dBm, the formula might estimate that the distance is 2.5 meters.
This technique is imperfect, and there are several reasons for fluctuation:
There is always background radio noise (like the static on an old AM radio) which causes individual signal strength measurements to vary.
There is error on the analog to digital converter inside the bluetooth radio, which also causes individual signal strength measurements to vary.
The bluetooth radio waves reflect off of some objects and are absorbed by others, making the actual signal strength change at different positions the same distance away, and when other objects in the vicinity move around.
The antenna pattern on both the transmitter and the receiver are not perfectly spherical. This means that when you rotate your phone or the beacon, you will see a slightly different signal level.
There are a few things you can do to minimize the error:
Use a beacon that transmits as frequently as possible, preferably at 10Hz or more. More transmissions mean more statistical samples of the signal level, which when averaged together help mitigate errors from sources 1 and 2 above.
Use as high of a transmitter power setting on your beacon as possible. The stronger the signal, the lower the noise level will be (relatively speaking) from source 1 above.
When possible, place your beacons where there is a clear line of sight to the receiving devices. Overhead often works best.
However, the best you can hope to do is reduce the variation as much as possible. You cannot eliminate it. For this reason, you must design your app so such variation is acceptable. If it helps your use case, you can also lower the beacon transmitter power so that devices only detect the beacon when they are relatively close.
Using Radius Networks' RadBeacon USB and RadBeacon Tag models, you can adjust the transmitter power using the free RadBeacon configuration app for iOS and OSX. The apps have a slider control to increase and decrease the transmitter power.
You should note, however, that by lowering the transmitter power, you will also increase the amount of variation on your distance estimates. This is because the signal to noise ratio will be lower.
Full disclosure: I am Chief Engineer for Radius Networks.
you can't really tell the distance to one beacon. That's why indoor localization is so hard.
you can't say exactly how far a beacon should transmit its signals, but on most beacons (I don't know about Radius networks) you can change the txPower / transmit power. This varies from beacon to beacon (and also depends on the environment around the beacon), so you'll have to do your own experiments to find the sweet spot.