9

ATコマンドAT+KCELLを実行してセル情報を取得すると、特にPLMNPublic Land and Mobile Network)が返されます。ドキュメントからの説明は次のとおりです。

MCC(モバイル国コード)およびMNC(モバイルネットワークコード)で構成されるPLMN識別子(3バイト)。

OK、それはウィキペディアが言っていることと一致します-そこにはMCCとMNCがあります。今私が理解していないのは、前述のMCC値とMNC値をどのように抽出するかです。

これが例です。私は戻ってきます:

32f210

そして私は(私は懐疑的ですが)それが結果として生じるはずだと言われています:

MNC: 1
MCC: 232

しかし、私は一生の間、PLMNからその結果を取得する方法を理解することができないので、これをどのように解析しますか?

4

2 に答える 2

14

さて、私はこれを見つけて、これをしなければならない他の不運な魂がいる場合に備えて、ここに答えを追加すると考えました-GSM技術仕様(セクション10.2.4)と呼ばれるPDFに答えが含まれています、関連するビットは次のとおりです:

PLMNの内容:モバイル国コード(MCC)とそれに続くモバイルネットワークコード(MNC)。コーディング:TS GSM04.08[14]に準拠。

  • 最大可能数n未満のストレージが必要な場合、超過バイトは「FF」に設定されます。たとえば、MCCに246、MNCに81を使用し、これが最初で唯一のPLMNである場合、内容は次のようになります。バイト1〜3: '42''F6''18'バイト4〜6:'FF ''FF''FF'など。

だから私は懐疑的であるのは間違っていました!

左から数字を入れ替えて読み取る必要があるので、最初の2バイトはMCCに232fなり、MNCは01fを破棄するだけで、232と1になります。並べ替えられてうれしいです。

たとえば、C#では次のように実行できます。

string plmn = "whatever the plmn is";

string mcc = new string(plmn.Substring(0, 2).Reverse().ToArray())
    + new string(plmn.Substring(2, 2).Reverse().ToArray())
    .Replace('f', ' ')
    .Trim();

string mnc = new string(plmn.Substring(4, 2).Reverse().ToArray())
    .Replace('f', ' ')
    .Trim();
于 2012-04-27T17:15:15.247 に答える
2

これは、ビット演算を使用したJavaの回答です。

public static String mcc(byte[] plmnId) {
  if (plmnId == null || plmnId.length != 3)
    throw new IllegalArgumentException(String.format("Wrong plmnid %s", Arrays.toString(plmnId)));

  int a1 = plmnId[0] & 0x0F;
  int a2 = (plmnId[0] & 0xF0) >> 4;
  int a3 = plmnId[1] & 0x0F;

  return "" + a1 + a2 + a3;
}

public static String mnc(byte[] plmnId) {
  if (plmnId == null || plmnId.length != 3)
    throw new IllegalArgumentException(String.format("Wrong plmnid %s", Arrays.toString(plmnId)));

  int a1 = plmnId[2] & 0x0F;
  int a2 = (plmnId[2] & 0xF0) >> 4;
  int a3 = (plmnId[1] & 0xF0) >> 4;

  if (a3 == 15)
    return "" + a1 + a2;
  else
    return "" + a1 + a2 + a3;
}
于 2016-10-28T06:57:29.773 に答える