Esta pagina se ve mejor con JavaScript habilitado

Ribbit/RattleGram

 ·  🎃 kr0m

RattleGram es un software para Android/iOS que mediante el protocolo Ribbit convierte texto a tonos de audio para posteriormente modularlos y transmitirlos por radio.

Los detalles técnicos de este sistema son:

  • Velocidad de transferencia en crudo: 2800bps
  • Modulación OFDM, utilizado en Wifi, 4G y 5G
  • Ancho de banda: 256 streams de 6.25Hz -> BW: 1600Hz

Algo que cabe destacar es que estos mensajes no están cifrados de ninguna manera, si queremos cifrado quizás la mejor opción sea reflashear el walkie con NUNU .

Si eres nuevo en el mundo de la radioafición te recomiendo este artículo anterior donde se explican los fundamentos.

El artículo se compone las siguientes secciones:


Consideraciones:

Antes de nada aclarar:

  • Los mensajes de texto se codifican en una señal de audio.
  • Las señales de audio se convierten a datos digitales mediante un muestreo.
  • Dependiendo del muestreo la señal digital tendrá mas o menos puntos muestreados lo que implica una mayor resistencia a pérdida/daño de datos ya que para poder reconstruir la señal solo hace falta un mínimo de muestras.

Parámetros de configuración:

Los parámetros de configuración son:
Encoder Settings:

Parámetro Descripción
Sample Rate Cuántas muestras por segundo tendrá la señal de audio enviada desde el teléfono(por el altavoz o puerto USB) a la radio, debe coincidir con el sample rate utilizado en el Decoder. Si hay interferencias en el ambiente una mayor tasa de muestreo puede ayudar ya que aunque algún bit llegue mal habrán mas muestras próximas haciendo que la señal de audio pueda ser reconstruida.
Channel Select Si la señal se envía por cable(no altavoz), podemos seleccionar que canal de la señal de audio a enviar, a veces depende del tipo de cable que utilicemos hasta la radio. En caso de duda utilizar Analytical que envía la misma señal idéntica en ambos canales, sea el canal que sea el que le llegue a la radio lo recibirá y si el conector de la radio es estéreo obtendremos una mayor robustez ya que se envía el mismo dato dos veces. En caso de utilizar el altavoz, dejarlo en Analytical también.
Leading Noise Añade ruido blanco al principio del sonido transmitido (antes del mensaje real). Sirve para “despertar” el VOX(Tlfn-USB->K1-Radio) en caso de que utilicemos dicho modo.
Fancy Header Hace que tu indicativo aparezca “dibujado” en el analizador de espectro. Útil para pruebas.
Carrier Frequency Frecuencia central del sonido.
Por defecto ~1500 Hz (mayoría de radios: 700-2300 Hz).
Muy alta (>18000). Solo debe utilizarse con:
Danger Zone -> Ultrasonic: ON.
Encoder Settings -> Sample rate: 48000.

Decoder Settings:

Parámetro Descripción
Sample Rate Cuántas veces por segundo se muestrea la señal de audio recibida en el teléfono(por el micrófono o puerto USB), debe coincidir con el sample rate utilizado en el Encoder.
Channel Selec Si la señal se recibe por cable(no altavoz), podemos seleccionar que canal de la señal de audio decodificar, a veces depende del tipo de cable que utilicemos hasta la radio. En caso de duda utilizar Analytical que lee ambos canales, sea el canal que sea el que le llegue a la radio lo recibirá y si el conector de la radio es estéreo obtendremos una mayor robustez ya que se leerá el mismo dato dos veces. En caso de utilizar el altavoz, dejarlo en Analytical también.
Audio Source Selección de fuente de audio para recepción.
Micrófono: Android suele aplicar automáticamente cancelación de eco y reducción de ruido. Para el oído humano esto es bueno, pero para Rattlegram estos filtros pueden “borrar” parte de los datos digitales, causando errores en la recepción.
Videocámara: Utiliza el micrófono que está configurado para la grabación de video, útil si estás apuntando el teléfono hacia la fuente del sonido (una radio externa) y quieres usar un micrófono más direccional que ignore el ruido que viene de los lados.
Reconocimiento de voz: Configura el micrófono para que sea más sensible a las frecuencias del habla humana. Intenta minimizar el procesamiento agresivo de la voz, pero a veces aplica filtros de frecuencias altas y bajas que pueden distorsionar la señal de Rattlegram.
Sin procesar: La mejor opción para Rattlegram, le pide a Android que entregue el audio completamente en crudo, sin cancelación de ruido, sin control automático de ganancia (AGC) y sin filtros de eco. Al no haber filtros que “limpien” el sonido, la forma de la onda digital llega intacta a la app, lo que permite una decodificación óptima.
Comunicación de voz: Optimiza el audio para aplicaciones tipo VoIP (como llamadas de WhatsApp o Skype), la peor opción para Rattlegram. Aplica una cancelación de eco muy agresiva y ajustes de volumen constantes que destruyen la modulación COFDM. Solo debe usarse si ninguna otra opción funciona.
Spectrum Analyzer Muestra una gráfica en tiempo real del audio entrante, también permite visualizar el Encoder Settings -> Fancy header .

Parrot Mode:
El modo repetidor nos permite repetir la señal recibida y de este modo aumentar el alcance. Si ponemos mas de un repetidor se formarán bucles, para evitarlo tendremos que configurar el Debounce, pero esto hará que solo podamos enviar mensajes con el mismo contenido cada X tiempo(el Debounce configurado).

Parámetro Descripción
Enable/Disable ON/OFF
Delay Retraso antes de retransmitir un mensaje recibido.
Debounce Tiempo mínimo entre retransmisiones de mensajes idénticos.

Night Mode:
Tema oscuro para no deslumbrar de noche.

Danger Zone:

Parámetro Descripción
Delete Messages Borra el historial de mensajes.
Enable Ultrasonic Permite Encoder Settings -> Carrier Frequency >18 kHz (casi inaudible). Requiere Encoder Settings -> Sample rate 48000 Hz.
Force Quit Apagado total para garantizar que la aplicación no siga escuchando ni transmitiendo nada en segundo plano.

Call Sign:
CallSign para poder identificarnos en una conversación.

Privacy Policy
Política de privacidad sobre el acceso al micrófono y lo que se hace con ese audio.

About Rattlegram
Información sobre la versión de software, librerías, recursos empleados y descarga de responsabilidad.


Configuración Quansheng-k6:

En mi Quansheng UV-K6 debo configurar.

Uso normal:

  • Encoder/Decoder Settings -> Sample Rate: XX
  • Encoder/Decoder Settings -> Channel Select: First/Analytical ya que es mono.
  • Encoder -> Leading Noise: Si utilizamos VOX(Tlfn-USB->K1-Radio) 1-2s.
  • Encoder -> Fancy Header : Opcional.
  • Encoder/Decoder Settings -> Carrier Frequency: 1500 Hz
  • Danger Zone -> Enable Ultrasonic: OFF

Pruebas silenciosas:

  • Encoder/Decoder Settings -> Sample Rate: 48000 Hz
  • Encoder/Decoder Settings -> Channel Select: First/Analytical ya que es mono.
  • Encoder -> Leading Noise: Si utilizamos VOX(Tlfn-USB->K1-Radio) 1-2s.
  • Encoder -> Fancy Header : Opcional.
  • Encoder/Decoder Settings -> Carrier Frequency: >= 18000 Hz
  • Danger Zone -> Enable Ultrasonic: ON

Modo APP:

La aplicación puede funcionar de forma independiente sin necesidad de ninguna radio pero con un alcance muy limitado(hasta donde llegue el sonido), los pasos son:

  • Se codifica el texto a una señal acústica.
  • Se reproduce por el altavoz.
  • El micrófono del teléfono receptor la capta.
  • La decodifica a texto de nuevo.

En el video podemos ver su funcionamiento:


Modo APP/Radio:

Ahora vamos a combinar una radio con cada teléfono para aumentar el alcance, el proceso es muy similar:

  • Se codifica el texto a una señal acústica.
  • Se reproduce por el altavoz.
  • El micrófono de la radio la capta.
  • La envía por radio.
  • La radio receptora recibe la señal de radio.
  • La reproduce por el altavoz.
  • El micrófono del teléfono receptor la capta.
  • La decodifica a texto de nuevo.

En el video podemos ver su funcionamiento:

Emisor Receptor

Modo VOX(Tlfn-USB->K1-Radio):

Para probar el modo VOX debemos habilitar las siguientes opciones:

  • En el teléfono Ajustes -> Accesibilidad y comodidad -> Conexión OTG.
  • En el teléfono, asegurarse de que el nivel de volumen es suficientemente alto.
  • En la radio VOXSen: 1.
  • Rattlegram Encoder -> Leading Noise: 1-2s.
  • Rattlegram Decoder -> Audio Source: Microphone.

En mis pruebas he testeado tres cables distintos, obteniendo resultados satisfactorios tan solo con uno de ellos, los cables que no han funcionado son:

APRS-Audio APRS-K1

Con el cable APRS-Audio no he podido recibir ni enviar, con APRS-K1 he podido enviar pero no recibir.

Con un DigiRig mobile ha funcionado todo como la seda:

En el video podemos ver su funcionamiento:

Emisor Receptor

Repeater mode:

Como ya explicamos, el modo repetidor nos permite repetir la señal recibida y de este modo aumentar el alcance. El único inconveniente es que si ponemos mas de un repetidor se formarán bucles, para evitarlo tendremos que configurar el Debounce, pero esto hará que solo podamos enviar mensajes idénticos cada X tiempo(el Debounce configurado).

Primero veamos como funciona con un solo repetidor, el teléfono-walkie de la derecha envía el mensaje, el teléfono de la izquierda que está configurado en modo Parrot lo recibe y al Delay segundos lo repite, recibiéndolo el propio equipo emisor y cualquiera que pudiese estar en el area de cobertura del repetidor.

Cuando veamos mensajes con el mismo texto y nuestro CallSign debemos deducir que nuestro mensaje ha sido reenviado por un repetidor y estamos escuchando nuestro mensaje pero repetido.

Ahora veamos que pasa cuando se forma un bucle con dos repetidores sin Debounce configurado, en las pruebas utilizo los altavoces porque no tengo dos DigiRigs que sería la manera correcta de enviar la señal de radio cuando se está en modo repetidor:

Y veamos también como evitar los bucles mediante Debounce, el mensaje llega al walkie de la izquierda, lo repite, llega al de la derecha que también lo repite ya que está configurado como repetidor, pero el de la izquierda al volver a escuchar el mensaje idéntico antes de los 15s(Debounce: Quarter of a min), no lo repite si no que lo ignora(parte baja de Rattlegram) logrando contener el bucle:

Los bucles entre repetidores ahora están contenidos pero con la restricción de que solo podremos enviar mensajes idénticos cada Debounce segundos.

En el siguiente video podemos ver la restricción comentada en acción:

  • El teléfono derecho envía el mensaje aa.
  • El teléfono izquierdo lo recibe y lo reenvía.
  • El teléfono derecho recibe y lo reenvía también ya que está configurado como repetidor.
  • Pero el telefono izquierdo detecta que en los 2 últimos minutos(Debounce) ya a visto el mismo mensaje, por lo tanto lo ignora(parte baja de Rattlegram), evitando el bucle.

Si enviamos un segundo mensaje bb el proceso se repetirá, pero si intentamos enviar un mensaje idéntico dentro de los Debounce segundos vemos que se ignora directamente sin ser reenviado. Si esperamos los 2 minutos del Debounce configurado ya nos permitirá enviar el mensaje sin problemas.

El Debounce en conversaciones normales no suele ser un problema ya que no se suelen repetir mensajes idénticos, además podemos dejar la vantana en un valor bajo de 15s. Pero si todavía así nos causa problemas un pequeño truco es añadir un espacio en blanco al final del mensaje para que no sean idénticos.


Ultrasonic mode:

El modo ultrasónico nos permitirá codificar los mensajes a una frecuencia inaudible para el oído humano, esto puede resultar útil si no tenemos un DigiRig y estamos haciendo pruebas a altas horas de la madrugada o en un entorno en el que no queremos ser detectados por el ruido producido. Pero debemos tener en cuenta que puede dañar nuestra audición si nos exponemos a ultrasonidos durante largos períodos de tiempo.

Primero configuramos Danger Zone -> Enable Ultrasonic, Encoder Settings -> Sample rate 48000 Hz, Decoder Settings -> Sample rate 48000 Hz y Encoder Settings -> Carrier Frequency >= 18000. El funcionamiento es exactamente igual, solo que no escucharemos el molesto ruido:


Fancy header:

Como explicamos en la sección Parámetros de configuración , la opción Fancy Header hace que el indicativo aparezca “dibujado” en el analizador de espectro.

Tan solo debemos configurar en el receptor Decoder Settings -> Spectrum Analyzer y en el emisor CallSign, Encoder Settings -> Fancy Header -> Enable y darle a la campanita o enviar mensaje.

Esta funcionalidad parece ser algo del propio Rattlegram ya que si emitimos por la radio mediante el DigiRig, en el SDR no se consigue visualizar el CallSign. Además podemos ver que incluso visualizándolo en el propio Rattlegram pasando por radio, el CallSign queda menos claro:


Otras implementaciones:

Existen otras implementaciones del protocolo Ribbit , como esta .

Pero las pruebas han sido decepcionantes cuanto menos, no tengo claro si es porque el proyecto experimenta cambios continúos que rompen el código, porque los teléfonos aplican filtros de audio o si el sistema de audio/browser en Linux es penoso.

Incluso las pruebas de Badkangaroo a Badkangaroo dán error de decodificación y demás problemas:

Message received but could not be decoded
Failed to encode message: Cannot read properties of null (reading 'state')
Failed to access microphone: NotFoundError: Requested device not found
Failed to access microphone: NotSupportedError: AudioContext.createMediaStreamSource: Connecting AudioNodes from AudioContexts with different sample-rate is currently not supported. 

Por supuesto la comunicación entre Rattlegram y Badkangaroo ha resultado completamente imposible.

Se ha probado el envío de mensajes tanto por sonido como utilizando la radio y utilizando varios móviles en los que uno de ellos si que ha sido capaz de enviar mensajes pero no recibirlos.

En definitiva, un completo desastre.