2012-04-27 31 views
7

estoy corriendo el comando AT AT+KCELL para obtener información de la célula y se devuelve, entre otras cosas, un PLMN (Public Land and Mobile Network) - la descripción de este de la documentación es:¿Cómo puedo extraer el MCC y MNC de una PLMN?

identificadores PLMN (3 bytes), hechos de MCC (código de país móvil) y MNC (código de red móvil).

Bueno, eso coincide con lo que dice la Wikipedia: ahí está el MCC y el MNC. Ahora lo que no entiendo es ¿cómo puedo extraer los valores de MCC y MNC antes mencionados?

Aquí hay un ejemplo. Regrese:

32f210 

y me han dicho (aunque soy escéptico) que eso debería resultar en:

MNC: 1 
MCC: 232 

pero no puedo por la vida de mí encontrar la manera de conseguir que la resultado de la PLMN, ¿cómo puedo analizar esto?

+0

si está en UNIX, puede intentar el comando de corte – Satya

+0

Estoy en una máquina de Windows, pero voy a leer el comando de corte gracias. – kmp

Respuesta

11

Bueno, he encontrado esto y pensé que volvería a añadir una respuesta aquí en caso de que haya alguna otra alma mala suerte que tiene que hacer esto - el PDF llamado GSM Technical Specification (sección 10.2.4) contiene la respuesta, el bit correspondiente es:

PLMN Contenido: Mobile Country Code (MCC) seguido del Mobile Network Code (MNC). Codificación: según TS GSM 04.08 [14].

  • Si se requiere almacenamiento para menos que el número máximo posible de n, el exceso de bytes se pondrá a 'FF'. Por ejemplo, usando 246 para el MCC y 81 para el MNC y si esta es la primera y única PLMN, el contenido lee de la siguiente manera: Bytes 1-3: '42' 'F6' '18' Bytes 4-6: 'FF' 'FF' 'FF', etc.

Así que estaba mal para ser escépticos!

tengo que leer desde la izquierda intercambiando los dígitos alrededor por lo que los primeros dos bytes sería el MCC por lo que sería 232f y el MNC habría 01 entonces sólo descarto la f y tengo 232 y 1! Me alegra que uno esté ordenado.

Por ejemplo, en C# puede hacerlo de esta manera:

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

De hecho, MCC toma 3 nibbles, y MNC toma 3 nibbles (los operadores de EE. UU. Tienen MNC de 3 dígitos). Y no es una buena idea guardar MCC/MNC como números, ya que los ceros a la izquierda importan. Así que primero tenemos que intercambiar nibbles de PLMN, '32f210 => 232f01', luego asignamos' MCC = 232' y 'MNC = 01' (' f' se ignora). Pero si tuviéramos un operador que tuviera MNC de 3 dígitos, tendríamos lo siguiente: 'PLMN = 130203 => 312030 => MCC = 312, MNC = 030'. –

0

Aquí es una respuesta java con operaciones bit a bit:

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; 
} 
Cuestiones relacionadas