我正在运行AT命令AT+KCELL来获取单元格信息,然后返回PLMN
(Public Land and Mobile Network) - 文档中的描述如下:< / p>
PLMN标识符(3个字节),由MCC(移动国家代码)和MNC组成 (移动网络代码)。
好的,这与维基百科所说的相符 - 有MCC和MNC。现在我不明白的是如何提取上述MCC和MNC值?
这是一个例子。我回来了:
32f210
我被告知(虽然我持怀疑态度),这应该导致:
MNC: 1
MCC: 232
但我不能为我的生活找出如何从PLMN获得结果,那么我该如何解析呢?
答案 0 :(得分:12)
嗯,我已经发现了这一点,并且我想在这里添加一个答案,以防有其他不幸的灵魂必须这样做 - 名为GSM Technical Specification的PDF(第10.2.4节)包含答案,相关的一点是:
PLMN内容:移动国家代码(MCC),后跟移动网络代码(MNC)。编码:根据TS GSM 04.08 [14]。
- 如果存储 如果需要的数量少于最大可能数量n,则超出 字节应设置为'FF'。例如,使用246作为MCC和81 对于MNC,如果这是第一个也是唯一的PLMN,则内容读取 如下:字节1-3:'42''F6''18'字节4-6:'FF''FF''FF'等。
所以我持怀疑态度是错误的!
我需要从左侧读取数字周围的数字,所以前两个字节将是MCC,因此它将是232f
而MNC将是01
然后我只丢弃f和I有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();
答案 1 :(得分:0)
这是一个带有按位运算的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;
}