Android - SignalStrength Terminology Explanation - android

I am looking through the documentation on the SignalStrength class for an app I plan to make, but there is a lot of telecommunications terminology that I'm not very familiar with. I was wondering if anyone could briefly shed some light on some of the methods in this class, specifically these:
int getCdmaDbm()
Get the CDMA RSSI value in dBm
int getCdmaEcio()
Get the CDMA Ec/Io value in dB*10
int getEvdoDbm()
Get the EVDO RSSI value in dBm
int getEvdoEcio()
Get the EVDO Ec/Io value in dB*10
int getEvdoSnr()
Get the signal to noise ratio.
int getGsmBitErrorRate()
Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5
int getGsmSignalStrength()
Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS 27.007 8.5
As I understand it, GSM and CDMA are two different protocols for mobile cellular networks, EVDO is the standard by which data is moved through CDMA, and HSPA is the equivalent data standard on GSM. Why then, are there no corresponding HSPA methods, as well as no getCDMASignalStrength() or getCDMABitErrorRate()? I'm also not too clear on what RSSI or Ec/Io are.

Ok, Here we go.
You got the part that GSM is different than CDMA correctly.
Also The part that EVDO is the data transport protocols on CDMA while HSPA is the equivalent in GSM.
The Modulation (data representation in the signal) is completely different between CDMA and GSM. That is why you can't use equivalent units (B.E.R) to calculate the quality of a signal sent by those different protocols.
Now for the measurement values we got:
DBM is a pure signal power measurement unit (in decibel) the more you get the higher reception you have. This covers (getCdmaDbm() and getGsmSignalStrength())
Bit Error Rate: Is a simple quality measurement unit for GSM link, the lower it is the higher the quality of the received signal (independent of signal strength).
EC/IO Represents the ration of Power of signal received to the power of interference signal. the higher this value the higher the quality of the signal you are getting (Regardless of its strength) . in details
RSSI is a signal power measurement unit also.
Now the reason there is two APIS for RSSI and ECIO is that EVDO is carried on part of the CDMA signal so it makes sense that it may have different quality figures than the whole CDMA signal.
hope that helps

RSSI is the raw power measured in the channel. Ec/Io is the Energy of the Carrier relative to the Interference and Noise, so it is a measure of the quality of the signal. dBm is the unit of RF power relative to 1 milliwatt, on the dB (Decibel) scale. EVDO SNR is the Signal to Noise Ratio, which is another representation of the quality of the signal in the presence of interference.

RSSI- received signal strength indicator. It's the amount of power in the signal.
ECIO- it's another ratio of power density.
Why CDMA doesn't have signal strength- my guess is that Dbm is a good enough measure of it, but I can't swear to that.
If you need to use signal strength, you're going to need to do serious research. Unless all you're doing is the equivalent of showing how many bars of signal you have. Even that's non-trivial, the iphone got it wrong for years.

Related

How to detect slow internet connection in android app

I want to detect if a phone has a slow internet connection or high-speed internet.
Now they have deprecated NetworkInfo and suggesting that we should use ConnectivityManager#getNetworkCapabilities using this I am able to get the signal strength but not able to figure out how to use integer value returned by networkCapabilities.getSignalStrength()
It is returning an Integer value I am getting these values (-39, -71, -31).
My question is how should we define that signal strength is good/poor.
Here is my code to get Signal Strength:
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
Network activeNetwork = cm.getActiveNetwork();
NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(activeNetwork);
int signalStrength = networkCapabilities.getSignalStrength();
First this is a directive approach rather than being a direct answer to the question.
int signalStrength = networkCapabilities.getSignalStrength();
Doc:
This is a signed integer, with higher values indicating a stronger signal. The exact units are bearer-dependent. For example, Wi-Fi uses the same RSSI units reported by wifi code.
This means that signalStrength holds a value that is relevant to the signal bearer; for instance if the bearer is WiFi, then the signalStrength will reflect the same WiFi RSSI units.
RSSI, or “Received Signal Strength Indicator,” is a measurement of how well your device can hear a signal from an access point or router. It’s a value that is useful for determining if you have enough signal to get a good wireless connection.
So, you need to map those units to some quality gauge to know whether the signal is weak/strong. This is communication/signal dependent rather than a programming point of view... This thread and also this one may help you for that in case of WiFi bearer.
But you need to customize this quality level for other types of signal bearers the same-wise according to their RSSI units.
GSM signal for instance you may use CellSignalStrengthGsm which has getRssi()
CellSignalStrengthLte is for LTE and so on.
You may also get the level of signal strength from the android.telephony API's SignalStrength class... there is a getLevel() method which returns an integer from 0 to 4 representing the general signal quality. Here you can find a listener to that.

Get the overall signal strength in Android

I would like to get the overall signal strenght received with the mobile antenna. Ideally, I would love to get the electric field measured with my phone antenna.
I did found a lot of methods to get the signal strength but they all give a specific signal strenth (either GSM, Wifi, GPRS ...) but not the overall signal. Moreover, if there are no SIM card in the phone, the GSMsignalStrength will return 0 or null and even if there is a SIM card, I will only get the strength of the signal of that operator only.
Could you please help me?

Android - How to find if device is receiving GSM signals or not?

I simply want to check if my device is receiving GSM signals or not. I know about SignalStrength class and its getGsmSignalStrength(). I have worked with PhoneStateListener and onSignalStrengthsChanged().
But even where I am not receiving any signals, I still get greater than 0 GSM signals strength, as shown in the screenshot:
See the signals level, its not even low, its red crossed. And the getGsmSignalStrength() returned me 16. (Current is a different number, please ignore it.)
If you are only interested in the GSM signal from your operator then use getMnc() from CellIdentityGsm to establish if the signal you are measuring is valid.
If you want the GSM signal only when the device is in service (ie successfully connected to a network) then use the ServiceState checker to establish what state the device is in.
As per above comments, the symptoms indicate that you are measuring other operators' GSM signals.

WiFi readings unstable in android

I am building an application that collects the RSSI levels of APs around me and do some calculations based on that.
The problem is that the readings are unstable even if the device is still. For example, signals from an access point fluctuates between -71, -68,-75 and so on....
Is there a way to stabilize the signals?
In telecommunications, received signal strength indicator (RSSI) is a measurement of the power present in a received radio signal.
I think the best you can do is count them al together and devide them after a x amount of measssure time. (since you would never get an 100% accurate acces point because of al kinds of components).
source:
http://en.wikipedia.org/wiki/Received_signal_strength_indication
"The problem is that the readings are unstable even if the device is still. For example, signals from an access point fluctuates between -71, -68,-75 and so on...."
This is the nature of the wireless signal. Even if the device is still, the environment is "moving", so, the signal is suffering from small scale fading mostly due to the environment scatterers. So, it is normal to obtain these fluctuations in the device measurements.
The accurancy of each Android device Wi-Fi measurement is another story.
Moreover, keep in mind that the values returned are in dBm which means that is in mWatt but expressed in the log scale. So, as Thealon proposed the averaging, you have to be careful because you cannot devide dBm values.
one solution would be to convert the dBm values back to mWatt and then perform the averaging. like below
Convert dBm to mWatt: mWatt = 10^(dBm/10)
When getting the RSSI, Google recommends to:
Use calculateSignalLevel(int, int) to convert this number into an absolute signal level which can be displayed to a user.
Official Docs

Android - cdma snr or ber

Would like to determine via code whether the voice channel on an Android is experiencing noise.
There is a list of functions at http://developer.android.com/reference/android/telephony/SignalStrength.html
I see a function getGsmBitErrorRate() and that will be useful when I switch to GSM.
I see the function getEvdoSnr() but I think that is only for the "data channel."
The only other function with CDMA is getCdmaEci0(). How can one derive SNR from Eci0()?
Is there some other way of deriving this value?
Review: I'm looking for a function that returns something like Bit Error Rate OR a Signal to Noise Ratio. I find one link that implies that ec/i0 is exactly the same thing as SNR.
But other pages have indicated that ec/i0 is the amount of signal that is available.
Ec refers to the pilot signal energy. Io refers to the noise energy. Thus, Ec/Io is the "pilot-to-noise ratio", instead of the "signal-to-noise ratio" (i.e. SNR). While, strictly speaking, the PNR is not the same as the SNR, as a practical matter you should be able to use the PNR as a proxy for the SNR. The whole point of the pilot is to give the receiver information about the signal and allow it to estimate channel effects.
This web page looks useful- Ec/Io.
Edit: I forgot that there is a parameter set by the network provider that specifies what the power of the pilot should be as compared to the actual signal. For instance, they could be the same power, in which case Ec/Io would be equal to the SNR, or the pilot could be half the power of the signal, in which case the SNR would always be 3 dB higher than Ec/Io. The pilot to signal ratio can be any of a number of different values and is, as mentioned earlier, set by the network. I don't recall what the parameter is called.

Categories

Resources