por - Cómo funciona el código de Modem con el código de Android
como escanear un codigo qr para conectarse a una red wifi (2)
Me gustaría saber la idea de alto nivel de cómo el código Modem de Android llamará / pasará el mensaje a la capa de aplicación de Android. Digamos que tomamos SMS por ejemplo. Si la red envía SMS y módem (digamos que el código de Qualcomm C lo analiza) ¿cómo se transmite a la capa de la aplicación Android?
¿Siempre hay una llamada JNI pasando? como interfaz entre el módem y Android? ¿Puedes compartir la información con nosotros? Gracias
Continuando con la explicación de t0mm13b, cuando hablamos de un teléfono inteligente, piense en las operaciones de 3 capas para SMS / Llamadas.
RIL (nivel de usuario) <-> AP <-> CP
AP: Procesador de aplicaciones (donde se ejecuta tu sistema operativo Android. Piense en juegos, canciones, videos, cámaras, etc. ejecutándose en este procesador)
CP: Procesador celular (que en realidad se ocupa de la interfaz aérea para llamadas / sms entrantes / salientes, interactúa con Network Tower, etc.)
Ahora, digamos que se reciben algunos datos en el lado del CP (podrían ser datos de Internet / sms / llamada). Ahora hay ciertos canales lógicos entre AP y CP. Entonces CP enviará los datos recibidos a un canal correspondiente según el tipo de datos. Esta información será recibida por AP. AP enviará esta información a RIL / App. RIL decodificará estos datos (especialmente los datos de llamada / SMS). En base a eso, se notifica al usuario sobre SMS / llamada.
En casi toda la base de origen de Android como se encuentra en la fuente AOSP / CAF / CM (Android Open Source Project, CodeAurora Forum, Cyanogenmod respectivamente), tendrá un código C llamado rild , (Radio Interface Layer Daemon). Esto se encuentra comúnmente dentro del /hardware/ril
del árbol fuente.
Este daemon se ejecuta desde el momento en que se inicia Android y crea un socket llamado /dev/socket/rild
y /dev/socket/rild-debug
. Habrá una biblioteca propietaria procedente de Qualcomm, HTC, que se cargará dinámicamente en el momento de la ejecución al arrancar. Es esa biblioteca propietaria que, a su vez, se comunica con el firmware de la radio. Y los enlaces del rild para los call-backs en la biblioteca propietaria se establecen allí mismo.
En la capa de rild , a través del socket antes mencionado, es cómo se comunica la capa de Android (que se encuentra en el árbol de fuentes, frameworks/base/telephony/com/android/internal/telephony/RIL.java
).
En el lado de Java, abre el socket para leer / escribir, junto con establecer intenciones y configurar delegados para transmitir / recibir eventos a través de este socket.
Por ejemplo, una llamada entrante, la biblioteca propietaria, invoca un enlace de devolución de llamada tal como lo configuró rild . El rild escribe los comandos del módem AT Hayes estándar genérico en el socket, en el lado Java, lee e interpreta los comandos del módem, y desde allí, el PhoneManager difunde CALL_STATE_RINGING
, en qué aplicación del teléfono (se encuentra en los packages/apps/Phone
fuente packages/apps/Phone
) ha registrado un receptor y reinicia la interfaz de usuario, y así es como puede contestar la llamada.
Otro ejemplo, hacer una llamada saliente, marcar un número en Android, se crea la intención y que a su vez el PhoneManager ( Esta es la raíz de todo , aquí, no puedo recordarlo, creo que es en frameworks/base/core/java
en algún lugar del árbol de fuentes) recibe el intento, lo convierte en una secuencia de comandos de módem AT Hayes, lo escribe en el socket, el rild invoca una devolución de llamada a la biblioteca propietaria, la biblioteca propietaria a su vez delega en el firmware de la radio.
Ejemplo final, enviando mensajes de texto, desde la aplicación Mensajería (encontrada en packages/apps/Mms
árbol de fuentes de packages/apps/Mms
), el texto que escribe se inserta en un intento, PhoneManager recibe la intención, convierte el texto en codificado GSM usando 7- las letras bit GSM (IIRC), se escriben en el socket, el rild a su vez invoca una devolución de llamada a la biblioteca propietaria, la biblioteca patentada a su vez delega en el firmware de la radio y el texto ha dejado el dominio del teléfono y está en las ondas de radio en alguna parte ... :) Junto con el envío de un mensaje de difusión dentro de Android, siempre que se use y especifique el permiso READ_PHONE_STATE
en AndroidManifest.xml .
Del mismo modo, al recibir un mensaje de texto, está en el reverso, el firmware de la radio recibe algunos bytes, la biblioteca patentada invoca la devolución de llamada al rild y, por lo tanto, escribe los bytes en el socket. En el lado de Java, lee de él y decodifica la secuencia de bytes, la convierte en texto como sabemos, activa una difusión con un mensaje recibido. La aplicación Messaging , a su vez, tiene receptores registrados para dicha transmisión y envía un intento a la barra de notificaciones para decir algo como " Nuevo mensaje recibido de + xxxxxx ".
Los intentos se encuentran en frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java
Esa es la esencia de cómo funciona el sistema de telefonía, la verdadera belleza es que utiliza comandos de módem AT Hayes genéricos, por lo tanto, simplifica y oculta los mecanismos propietarios reales.
En cuanto a los gustos de Qualcomm, HTC, olvídalo pensando que alguna vez abrirán la biblioteca en cuestión porque la capa de telefonía de radio está integrada en el circuito de SoC (System on a Chip).
Que también es, como una nota al margen, por qué es riesgoso para flashear el firmware de radio, algunos teléfonos ofrecen la capacidad de hacerlo, flashear el firmware incorrecto (como un incompatible o no apto para el teléfono), despedirse del teléfono y usarlo eso como un tapón de puerta o papel de peso! :)
Cabe señalar que no hay mecanismos implicados JNI.
Esto es lo que yo entiendo de cómo funciona, por lo que puedo decir es que el firmware de la radio se carga en una dirección de memoria en algún lugar donde el kernel de Linux ha reservado el espacio de direcciones y no lo toca, algo así como volver a la vieja PC días en que arrancó el DOS, había direcciones reservadas usadas por el BIOS, creo que es similar aquí, las direcciones marcadas como reservadas están ocupadas por el firmware, en el que la biblioteca de radio propietaria se comunica con él, y dado que la biblioteca se está ejecutando el espacio de direcciones propiedad del kernel, una propiedad de root con privilegios de root, puede "hablar" con él, si piensas en usar el viejo dialecto BASIC de peek and poke, supongo que no estarías lejos del marque allí, escribiendo una cierta secuencia de bytes en esa dirección, el firmware de la radio actúa sobre ella, casi como si tuviera una tabla de vectores de interrupción ... esto supongo aquí cómo funciona exactamente. :)