2012-04-27 25 views
7

Tôi đang chạy các lệnh AT AT+KCELL để có được thông tin di động và nó sẽ trả về, trong số những thứ khác, một PLMN (Public Land and Mobile Network) - mô tả điều này từ các tài liệu là:Tôi có thể trích xuất MCC và MNC từ một PLMN bằng cách nào?

định danh PLMN (3 byte), được thực hiện của MCC (Mã quốc gia di động) và MNC (Mã mạng di động).

OK, phù hợp với những gì Wikipedia nói - trong đó có MCC và MNC. Bây giờ những gì tôi không hiểu là làm thế nào để trích xuất các giá trị MCC và MNC nói trên?

Đây là một ví dụ. Tôi quay trở lại:

32f210 

và tôi nói (mặc dù tôi hoài nghi) rằng nên kết quả trong:

MNC: 1 
MCC: 232 

nhưng tôi không thể cho cuộc sống của tôi làm việc ra làm thế nào để có được điều đó kết quả từ PLMN vì vậy làm cách nào để phân tích cú pháp này?

+0

nếu bạn đang ở trên unix, bạn có thể thử các lệnh cắt – Satya

+0

Tôi đang ở trên một cửa sổ máy nhưng tôi sẽ đọc lên trên nhờ lệnh cắt. – kmp

Trả lời

11

Vâng, tôi đã tìm ra điều này và tôi sẽ thêm câu trả lời ở đây trong trường hợp có một số linh hồn không may mắn khác phải làm điều này - PDF có tên GSM Technical Specification (phần 10.2.4) chứa câu trả lời, bit liên quan là:

Nội dung PLMN: Mã quốc gia di động (MCC) theo sau là mã mạng di động (MNC). Mã hóa: theo TS GSM 04.08 [14].

  • Nếu lưu trữ cho ít hơn số có thể n tối đa là cần thiết, thừa byte sẽ được thiết lập để 'FF'. Ví dụ, sử dụng 246 cho MCC và 81 cho MNC và nếu đây là PLMN đầu tiên và duy nhất, nội dung đọc như sau: Bytes 1-3: '42' 'F6' '18' byte 4-6: 'FF' 'FF' 'FF', v.v.

Vì vậy, tôi đã sai lầm khi hoài nghi!

Tôi cần phải đọc từ bên trái trao đổi các chữ số xung quanh để hai byte đầu tiên sẽ là MCC để có thể là 232f và MNC sẽ là 01 thì tôi chỉ loại bỏ f và tôi có 232 và 1! Vui mừng rằng một được sắp xếp.

Ví dụ, trong C# bạn có thể làm điều đó như thế này:

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(); 
+4

Trong thực tế, MCC có 3 nibbles và MNC mất 3 nibbles (các toán tử của Hoa Kỳ có MNC 3 chữ số). Và nó không phải là một ý tưởng tốt để lưu MCC/MNC dưới dạng các con số, như các số 0 quan trọng. Vì vậy, trước tiên chúng ta phải hoán đổi các nibbles của PLMN, '32f210 => 232f01', sau đó chúng ta gán' MCC = 232' và 'MNC = 01' (' f' bị bỏ qua). Nhưng nếu chúng ta có toán tử có MNC 3 chữ số, thì chúng ta sẽ có những điều sau đây: 'PLMN = 130203 => 312030 => MCC = 312, MNC = 030'. –

0

Đây là một câu trả lời java với các hoạt động Bitwise:

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; 
} 
Các vấn đề liên quan