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れるので、コードは完全に正しいです(Xcode4.2を使用してiOS5.0.1で実行)。おそらくあなたのキャリアはいくつかのフィールドに正しく記入していませんでしたか?いずれにせよ、別のデバイスまたは別のSIMカードでテストすることを検討します。

信号強度に関して:CTGetSignalStrengthかなり文書化されていないAPIのように思われるので、値はAppleによって任意に定義される可能性があります(そして同様に再定義されます)。いずれにせよ、これはRSSI値(受信信号強度の表示)のように見えます。これは多かれ少なかれ正の数であり、1が最悪の信号強度で、上限が優れています。そのため、dBm値への事前定義された(文書化された、したがって安定した)利用可能なマッピングがないため、マッピングはおそらく実験的に作成する必要があります。

于 2011-11-24T09:54:21.277 に答える
2

信号強度の値が整数として返されることは非常に一般的です。トリッキーな点は、対応するdBm値へのマッピングです。通常、int値は、0.5、1、または2dBmの分解能を提供します。受話器/モデムによって報告されるdBm値は、通常、2G(GSM / EDGE)の場合は-115〜-51 dBm、3G(UMTS / HSxPA)の場合は-120〜-25 dBmの範囲であり、RSSI(受信信号強度インジケータ)を表します。

たとえば、Android APIはデフォルトの3GPPマッピングを使用します(Androidリファレンスを参照)。

ベースバンドモデムは、iPhone 4S(Qualcomm)とインフィニオンゴールドを使用した以前のモデルとでは異なることも考慮に入れてください。

于 2012-03-01T20:31:09.410 に答える