How to find out carrier signal strength programatically

Here is the code that I have used to find out carrier signal strength:

int getSignalStrength()
{
    void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
    int (*CTGetSignalStrength)();
    CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength");
    if( CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength");
    int result = CTGetSignalStrength();
    dlclose(libHandle);
    return result;
}

It is giving me values between 60 to 100, but when I test the signal strength in device by calling to this *3001#12345#* number it showed me as -65. Below I have attached the screenshot. Is the value coming from getSignalStrength() accurate? Then why is it returning positive values always?

  • Why can I send messages to a deallocated instance of NSArray?
  • iTunes Connect upload rejected with invalid binary because of missing NSCalendarsUsageDescription
  • Reload section without reloading section header
  • NSDateFormatter Trouble?
  • How to convert AnyObject type to Int in Swift
  • IOS8 get fingerprint data
  • enter image description here

    5 Solutions Collect From Internet About “How to find out carrier signal strength programatically”

    getSignalStrength() is showing negated dB attenuation, e.g. -(-60) == 60. The call in is displaying it more conventionally as a measurement less than zero. Yes, these kinds of variations are typical. Even in strictly controlled conditions you can get +/- 20 decibels. One way you can fix it is to take a series of measurements over time, say every second, and keep a running list of the last 10 or so measurements. Then report the mean or median or some other statistic. In my experience this cuts down the variation a lot. You can also do standard deviation to provide a measure of reliability.

    My observation on CTGetSignalStrength() in CoreTelephony is that, it returns the
    RSSI(Received Signal Strength Indication) value of carrier’s signal strength. My experiments with this returns values between the range 0 – 100, which I believe is the “percent signal strength” of the carrier according to this .

    Also iOS does not measure signal strength in a linear manner according to this

    I also noticed that, even when we have 5 bars in status bar, RSSI value may not be 100.

    getSignalStrength() provides the result in negative scale. The difference can be controlled using high pass filter.

    You should gather the results of last 10 observations. At the time of adding new observation, take the average of last 10 observations. Multiply it by 0.1. Take the current reading and multiply it by 0.9. Add both. If total observations are greater than 10, remove the oldest observation for next calculation.

    It will make your result more reliable and you can also handle sudden changes in the signal strength effectively.

    I would recommend reading up on decibel measure. The following link should help.
    How to Read Signal Strength

    As for many signals getSignalStrength() should be used cojointly with a high-pass filter algorithm.

    Also make sure to have an average measurement over some time (10-15 successive measurements).
    And it’s normal that it gives negative result, dB signals for telephony are like that 😉