1

我很好奇为什么我得到错误的值来获取运营商名称和信号强度。这里是代码。

CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *car = [netinfo subscriberCellularProvider];
NSLog(@"Carrier Name: %@", car.carrierName);
[netinfo release];

为什么我得到价值“运营商”而不是我使用的运营商?

这是获取信号强度的代码

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();
NSLog(@"Signal strength: %d", result);
dlclose(libHandle);

据我所知,信号强度以 dBm 值(负值)为单位,但为什么上面的值显示正值而现在显示信号强度?是否有任何值映射来表示 dBm 上的信号强度

PS 我在真正的 iphone 设备上运行该程序,但仍然得到错误的值。

任何帮助将不胜感激。

谢谢。

4

2 回答 2

3

关于运营商:在模拟器上运行你的代码给了我nil在设备上运行时正确的说法2011-11-24 10:49:05.182 testapp[12579:707] Carrier Name: Vodafone.de,所以代码是绝对正确的(使用 Xcode 4.2 在 iOS 5.0.1 上运行)。也许您的运营商没有正确填写某些字段?无论如何,我都会考虑在另一台设备或另一张 SIM 卡上进行测试。

关于信号强度:由于CTGetSignalStrength似乎是一个相当无证的 API,Apple 可以任意定义这些值(也可以重新定义)。在任何情况下,这似乎是一个 RSSI 值(接收到的信号强度指示),它或多或少是一个正数,其中 1 是最差的信号强度,较高的信号强度更好。因此,没有预定义(记录在案,因此稳定)到 dBm 值的可用映射,可能必须通过实验创建映射。

于 2011-11-24T09:54:21.277 回答
2

信号强度值以整数形式返回是很常见的。棘手的一点是映射到相应的 dBm 值。通常 int 值提供 0.5、1 或 2 dBm 的分辨率。手机/调制解调器报告的 dBm 值通常在 2G (GSM/EDGE) 的 -115 到 -51 dBm 和 3G (UMTS/HSxPA) 的 -120 到 -25 dBm 之间,代表 RSSI(接收信号强度指标)。

例如,Android API 使用默认的 3GPP 映射(参见 Android 参考)。

另请注意,iPhone 4S (Qualcomm) 和使用 Infineon Gold 的早期型号之间的基带调制解调器不同。

于 2012-03-01T20:31:09.410 回答