{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "ticKEoFJjcQw" }, "source": [ "##Introducción##\n", "**Mode S**\n", "\n", "Es el protocolo utilizado por los transponders (se denomina transponder a un transmisor y receptor de radio frecuencia) de aviones comerciales modernos. \n", "Un avión equipado con un transponder Mode S contesta a la interrogación de un radar ya sea de tierra o de otro avión.\n", "\n", "**Automatic Dependent Surveillance-Broadcast (ADS-B)**\n", " \n", "Es una tecnología de vigilancia en la que un avión determina su posición y la emite periódicamente, lo que permite realizar su seguimiento. La información puede ser recibida por las estaciones terrestres de control de tráfico aéreo. Puede reemplazar a los sistemas anteriores basados en un radar secundario que contesta a una señal recibida desde tierra. Este sistema no necesita recibir una señal desde tierra para emitir. La señal con la posición enviada también puede ser recibida por otras aeronaves para proporcionar conocimiento de la situación y permitir la auto-separación.\n", "\n", "El ADS-B es un elemento de última generación de sistemas de transporte aéreo de los Estados Unidos (NextGen) y de la Single European Sky ATM Research (SESAR). Los equipos ADS-B actualmente son obligatorios en partes del espacio aéreo de Australia, en Estados Unidos una parte de los aviones lo utilizan y el equipo es obligatorio para algunos aviones en Europa desde 2020.\n", "\n", "El protocolo ADS-B utiliza el modo “Extended Squitter” (como veremos más adelante esto refiere a un paquete más largo que el normal) del protocolo Mode-S. Este protocolo es:\n", "Automatic: no requiere de la intervención del piloto.\n", "Dependent: depende del altímetro, GPS, y otros instrumentos del avión para brindar información.\n", "Surveillance: provee información actual acerca del avión que transmite la información. \n", "Broadcast: es en un sentido, el avión lo envía a todos los receptores en su rango de alcance.\n", "\n", "Un avión equipado con ADS-B transmite su posición, velocidad, número de vuelo y otra información adicional. Los reportes de posición se generan habitualmente una vez por segundo y la identificación del vuelo una vez cada 5 segundos. \n", "\n", "Los paquetes con la información son enviados a una frecuencia de 1090 MHz (1.09 GHz) y utilizando una técnica de modulación denominada PPM (Pulse Position Modulation, modulación por posición del pulso). La tasa de envío de bits es de 1Mbit por segundo. \n" ] }, { "cell_type": "markdown", "metadata": { "id": "rC7XTjGekVxM" }, "source": [ "La modulación utilizada está diseñada para que pueda ser recibida/transmitida por hardware simple. \n", "\n", "La modulación por posición de pulso es una modulación que pertenece a una clase de modulación denominado amplitude-shift-keying (ASK) y en particular a la clase on-off-keying (OOK). En OOK, los bits (0, 1) son enviados prendiendo o apagando la portadora como se ve en la Figura 1.\n", "\n", "![alt text](https://www.rfwireless-world.com/images/OOK-modulation.jpg)\n", "\n", "Figura 1. imgen obtenida de https://www.rfwireless-world.com/images/OOK-modulation.jpg\n", "\n", "PPM utiliza una variante de OOK. La idea es que en cada intervalo de bit exista siempre una transición entre encendido y apagado y esa transición ocurra en el medio del intervalo de bit. Por ejemplo, típicamente, una transición de apagado a encendido representa un uno y una transición de encendido a apagado representa un cero. Esta técnica se conoce también como Manchester encoding. El hecho de que siempre exista una transición ayuda a que sea más fácil sincronizarse ya que en OOK si vienen muchos ceros o muchos unos seguidos no se sabe donde se dan las transiciones de bits hasta que no haya un cambio. Ver Figura 2.\n", "\n", "![alt text](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcSbub9qEsDO-7X27em7R8FRK3kr--odQNoPQVZAYGCFfk1CCMyj&usqp=CAU\n", ")\n", "\n", "Figura 2. Imagen obtenida de https://wiki.eecs.yorku.ca/course_archive/2009-10/W/3213/_media/cse3213_08_digitalsignals_w2010.pdf\n", "\n", "Un paquete ADS-B modo S consiste de un preámbulo de 8μs seguido por un bloque de datos 56 o 112 μs (este último es el que se denomina “Extended Squitter” y es el que utilizaremos nosotros). En la Figura 3 se muestra la forma del preámbulo.\n", "\n", "\n", "![alt text](https://www.mdpi.com/aerospace/aerospace-07-00030/article_deploy/html/images/aerospace-07-00030-g002.png)\n", "\n", "\n", "Figura 3. Imagen obtenida de https://www.mdpi.com/2226-4310/7/3/30/htm\n", "\n", "Un preámbulo es una señal que se usa para sincronizar un transmisor y un receptor y en particular para detectar que arribó un paquete nuevo y sincronizar al receptor. Se debe observar que el preámbulo a diferencia de los datos no sigue la misma regla de modulación. No es PPM ya que no en todo bit hay una transición. Es una señal particular que trataremos de identificar en lo que recibe el rtl-sdr. El preámbulo es una señal que si los pulsos son de altura A y nosotros la muestreamos idealmente a 2 Mega muestras/s tendríamos las siguientes muestras: A,0,A,0,0,0,0,A,0,A,0,0,0,0,0,0. Si nosotros podemos identificar esta secuencia estaremos ante un candidato a tener un paquete ADS-B.\n", "\n", "Luego del preámbulo, en los paquetes que nos interesan, siguen 112 bits. Nosotros tomaremos dos muestras por cada bit es decir que luego del preámbulo se tendrán 112*2 muestras.\n", "\n", "Como la tasa del protocolo ADSB es de 1 Mbit por segundo, si muestreamos a 2 Mega muestras por segundo (que es casi el límite de lo que podremos muestrear con los rtl-sdr) en principio sería suficiente para tener dos muestras por bit y poder observar las transición de ON a OFF o de OFF a ON en cada bit, y decidir si es un cero o un uno. \n", "\n", "**Procesando las señales ADS-B**\n", "\n", "Trabajar con estas señales y testear el código que nosotros escribamos para detectar y obtener información de los aviones tiene una dificultad. Debemos esperar que pase un avión para poder probar el código, y si hay errores debemos esperar otro avión para ver las correcciones que hagamos. Para solucionar este problema les suministraremos un archivo con las muestras obtenidas con un rtl-sdr tras recibir en la banda de 1090 MHz durante 1 segundo. Leer de este archivo es similar a leer del rtl-sdr pero lo podemos correr en cualquier momento y probar nuestro código.\n", "\n", "Luego que depuremos nuestro código se podrá a probar con el rtl-sdr.\n", "\n", "\n", "**Ejercicio 1:**\n", "\n", "Cargue al ambiente el archivo suministrado adsb.npy y luego utilice el siguiente código para levantar las muestras del archivo:\n", " \n" ] }, { "cell_type": "code", "metadata": { "id": "8St2wkgfsswN" }, "source": [ "import numpy as np\n", "\n", "y = np.load(\"adsb_cmp.npy\")\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "jq7IHDS8tBI_" }, "source": [ "Modifique la escala de la señal para verla entre 0 y 1 y grafique la señal obtenida del archivo en esta escala. Estas muestras fueron obtenidas a 2 Mega muestras por segundo.\n", "\n", "A simple vista ¿le parece que puede haber potenciales paquetes ADS-B? ¿por qué le parece que pueden ser paquetes ADS-B? ¿qué son las oscilaciones en el nivel más bajo de la señal que se ve en la gráfica todo el tiempo? \n", "\n", "Amplíe la señal recibida en alguno de los potenciales paquetes ADS-B. ¿Puede detectar el preámbulo ADS-B en alguno de los pulsos que identificó como candidatos? Muestre la gráfica ampliada donde se vean todas las muestras de un paquete que según ustedes por el preámbulo sería ADS-B y uno que no consideren ADS-B. Teniendo en cuenta la frecuencia de muestreo cuanto tiempo dura el preámbulo para el paquete que identificó como ADS-B. \n", "En los casos que le parece que hay un preámbulo ADS-B ¿Ud. ve un nivel constante A cuando hay un pulso y un cero cuando no hay un pulso? ¿por qué le parece sucede esto?\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "BnS9BP5XtFbS" }, "source": [ "\n", "**Un sistema de comunicación**\n", "\n", "En los sistemas de comunicaciones hay tres elementos fundamentales. El transmisor, el receptor y el medio de comunicación. En los sistemas de comunicación inalámbrico el medio de comunicación es el aire. En grandes líneas en el transmisor y el receptor de un sistema de comunicación inalámbrico podemos distinguir tres grandes bloques: \n", "\n", "El sistema en banda base, el sistema de radio frecuencia y la antena.\n", "\n", "En el sistema banda base se reciben por ejemplo los bits a transmitir y se transforman estos en símbolos que se van a enviar para representar estos bits. Por ejemplo en nuestro sistema ads-b se reciben los bits y se genera el paquete con el formato ads-b. Esto quiere decir que se le agrega el preámbulo y se codifican en PPM los bits de datos. Esta etapa se hace habitualmente en digital. En el receptor se hace el proceso inverso, es decir se transforma el paquete ads-b a los bits de datos originales.\n", "\n", "Pero para alimentar a la antena, se debe llegar con una señal analógica y de frecuencia 1090 MHz en nuestro caso. Para eso, luego de esta etapa, la señal se pasa de digital a analógica y se modula a la frecuencia de 1090 MHz. En el receptor se hace al revés, se baja de 1090 MHz a banda base y se convierte de analógico a digital.\n", "\n", "La antena en el transmisor recibe una señal de voltaje y la transforma en un campo electromagnético que se emite. En el receptor ese campo electromagnético se transforma en un voltaje.\n", "\n", "![alt text](https://iie.fing.edu.uy/~belza/tallerinefiguras/siscomadsb_fbl.png)\n", "\n", "En todo este proceso, los pulsos PPM ideales generados por el sistema en banda base en el transmisor se ven “modificados” por el conversor digital/analógico del transmisor, el conversor analógico/digital del receptor, los filtros que se ponen en diferentes etapas, las antenas y el medio de comunicación. Estos bloques actúan sobre la señal que contiene el mensaje y si bien se busca que no modifiquen el mensaje, la señal enviada en cierto grado se ve alterada. Evidentemente, si el sistema de comunicaciones está bien diseñado se logra que a pesar de estos efectos el receptor logre interpretar correctamente el mensaje. Todos estos efectos, los podemos interpretar en una primera aproximación como un filtro que actúa sobre la señal banda base enviada. \n", "\n", "Otro fenómeno importante que afecta los sistemas de comunicaciones en general pero particularmente los inalámbricos es el ruido. El ruido se refiere a cualquier perturbación o interferencia indeseable a una señal y que no está directamente relacionada con ella. En general son perturbaciones aleatorias. El ruido puede darse en el aire o en los propios circuitos de receptor y transmisor. El ruido puede provenir de muchas fuentes: otras señales interferentes, señales espurias que se generan en los aparatos eléctricos o electrónicos, ruido térmico (campo generado por la vibración térmica de las partículas subatómicas), ruido atmosférico, ruido cósmico, etc. El ruido habitualmente se modela como una señal totalmente aleatoria y en particular con una distribución de probabilidad denominada distribución normal o Gaussiana.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "x8lplb0xt3ua" }, "source": [ "**Ejercicio 2**\n", "\n", "Para entender alguno de los fenómenos que hacen que el preámbulo no tenga la forma “ideal” haremos algunos experimentos. La siguiente función genera un tren de de pulsos cuadrados en python de frecuencia de muestreo 20000 muestras por segundo, y con un largo total de la señal 1s y con 100 pulsos en ese 1s . La amplitud de los pulsos es 1 unidad. \n", "La función ruido genera ruido con una amplitud que puede ajustarse por la variable amplitud.\n", " \n", "\n", "\n", "\n", "Grafique en el tiempo la onda cuadrada (puede graficar una parte del tiempo para verla mejor), el ruido y vea el espectro de frecuencia de ambos.\n", "\n", "Sume las señales ruido y onda cuadrada.\n", "\n", "Posteriormente pase por un filtro pasabajo de frecuencia de corte 2000 Hz y otro de 5 kHz la suma y vea lo que obtiene.\n", "Para la señal que pasó por el filtro de 2 kHz quédese con una muestra cada 10 muestras de la señal filtrada, es decir, vea qué sucede si toma z[n::10] con n entre 0 y 9, siendo z la señal filtrada. \n", "Para analizar lo que obtiene observe y calcule cuál es la frecuencia de la onda cuadrada que generó.\n", "Vea esa misma señal con menos ruido y con más ruido.\n", "Esta es una aproximación de lo que sucede a los pulsos que envía el avión y que Uds. reciben y por eso es más difícil detectar el preámbulo y los bits de información.\n", "Si bien la señal que se envía en ADS-B es una señal con dos niveles, al pasar por el sistema de transmisión, el aire y el sistema de recepción esa señal se filtra y deja de ser cuadrada y además se le agrega ruido. Por otra parte, con la tasa de muestreo usada se está tomando una muestra en el valor alto y una en el valor bajo. \n", "Para el informe muestre lo observado con distintas figuras.\n", "\n" ] }, { "cell_type": "code", "metadata": { "id": "twYqrQYxCwz_" }, "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from scipy import signal\n", "\n", "def onda_cuadrada(fs,largo_senal,cantidad_pulsos,amplitud): \n", " t = np.linspace(0, largo_senal, int(fs*largo_senal), endpoint=False) \n", " y = amplitud*signal.square(2 * np.pi *cantidad_pulsos * t/largo_senal)\n", " return y\n", "\n", "def ruido(fs,largo_senal,amplitud): \n", " t = np.linspace(0, largo_senal,int(fs*largo_senal), endpoint=False) \n", " noise = np.random.normal(0, amplitud, t.shape) \n", " return noise\n", "\n", "def plot_frec(x,fs,fmax,m): #esta función permite graficar las frecuencias de una señal x muestreada a tasa fs, el rango que grafica va hasta fmax, y m la cantidad de puntos que toma para calcular la FFT .\n", " puntos = int(fmax/fs*m)\n", " lx = len(x)\n", " nt = (lx + m - 1)//m\n", " xp = np.append(x,np.zeros(-lx+nt*m))\n", " xmw = np.reshape( xp, (m,nt), order='F')\n", " xmf = np.fft.fft(xmw,len(xmw),axis=0)/m\n", " xf = np.linspace(0, int(fs/2.0), int(m/2))\n", " plt.plot(xf[0:puntos],np.abs(xmf[0:int(m/2),0:int(lx/m-1)]).mean(1)[0:puntos])\n", " plt.show()\n", "\n", "oc = onda_cuadrada(20000,1,100,1)\n", "rw = ruido(20000,1,1)\n", "\n", "def filtro_pasabajo(x,f_corte,fs):\n", "\ttaps = signal.firwin(151,f_corte,nyq=fs/2.0)\n", "\tfiltered_x = signal.lfilter(taps, 1.0, x)\n", "\treturn(filtered_x)\n", "\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "bAQirX9hCxc_" }, "source": [ "\n", "# Detección automática del preámbulo\n", "**Ejercicio 3:**\n", "\n", "Muchas veces va a ser útil salvar una parte del archivo anterior para no tener que levantar y procesar todo el archivo cada vez. Para esto por ejemplo le proponemos que salve la señal entre las muestras 504365 y 504600 como se muestra en el código siguiente.\n", "\n", "Luego levante el archivo que salvó adsb_pulso.npy y grafíquelo. Analice la figura y explique si este es un potencial paquete ads-b o no y justifique su respuesta.\n", "\n", "Hasta ahora hemos detectado por simple observación los paquetes que para nosotros son potenciales candidatos a paquetes ads-b. La idea es que esto pueda ser detectado automáticamente por un programa.\n", "\n" ] }, { "cell_type": "code", "metadata": { "id": "7nBF4pLFu4if" }, "source": [ "from google.colab import files\n", "uploaded = files.upload()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "zTtxxi8Mttsr" }, "source": [ "y = np.load(\"adsb_cmp.npy\")\n", "np.save(\"adsb_pulso.npy\", y[504365:504500])\n", "plt.figure(figsize=(15,7))\n", "y = np.load(\"adsb_pulso.npy\")\n", "plt.plot(y,\"*\")\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "nnbhwq3Qt_TF" }, "source": [ "**Ejercicio 4:**\n", "Escriba una función detectar_preambulo que reciba un array de muestras como el que se cargó del archivo adsb.npy y devuelva un array que indique en qué muestras comienza un potencial paquete adsb en ese vector. Debe devolver una lista esa función con todos los inicios donde se detectó un preámbulo adsb.\n", " \n", " def detectar_preambulo(y):\n", " # la función acepta muestras obtenids del sdr-rtl \n", " # devuelve una lista de índices conteniendo el comienzo de cada preámbulo detectado.\n", "\n", "**Ejercicio 5:**\n", "\n", "Corra la función que realizó pasándole lo que lea del archivo adsn.npy\n", "¿Cuántos pulsos candidatos a paquete ads-b encontró en el archivo asdb.npy. Revise algunos y vea si le parecen o no paquetes ads-b. Muestre alguno que le parezca que sea y otro que no.\n", "\n", "\n", "#Extracción de los bits recibidos\n", "Una vez que detectó un paquete es relativamente fácil extraer los bits del paquete. Recuerde que cada bit es codificado en dos muestras y la transición define el valor del bit.\n", "\n", "**Ejercicio 6:**\n", "\n", "Implementar una función bit = datosAbits(msg) que toma un paquete de largo 16 + 112 x 2, remueva el preámbulo y compute los bits de datos y devuelva un vector con 112 bits.\n", "\n", " def datosAbits( msg ):\n", " # La función recibe un paquete de datos de 16 + 112 * 2,\n", " # remueve el preámbulo de 16 bits\n", " # y convierte el resto a bits\n", " # retorna un vector con los 112 bits de datos.\n", "\n", "\n", " \n", "**Ejercicio 7:**\n", "\n", "Cree una matriz de bits donde cada fila contiene los bits de un paquete. Cada fila debe tener largo 112. Si se recibe un “short squitter” que son de 56 bits, los últimos bits serán “basura”. El decodificador posteriormente podrá de todas formas distinguir un long squitter de un short squitter ya que los long squitter siempre comienzan con 10001.\n", "Usando la siguiente función (display_image) despliegue la matriz con los bits de todos los candidatos a paquetes como una imagen. Trate de ver si puede detectar en la imagen paquetes falsos chequeando el 10001 al comienzo de cada fila en la imágen. \n" ] }, { "cell_type": "code", "metadata": { "id": "TSe6dTg6x9nZ", "outputId": "d1fa6421-94eb-4e0e-963b-1ec8636625fe", "colab": { "base_uri": "https://localhost:8080/", "height": 279 } }, "source": [ "import matplotlib.pyplot as plt \n", "\n", "def display_image(bits):\n", " \twidth, height = plt.figaspect(0.3)\n", " \tfig = plt.figure(figsize=(width,height))\n", " \tplt.imshow(bits, aspect='auto', cmap=\"gray\")\n", " \tplt.ylabel(\"Incoming message\")\n", " \tplt.xlabel(\"The Received bits\")\n", " \tplt.show()\n", "\n", "\n", "codigo de prueba de la función anterior\n", "bits = np.array([[0,1,1,0,1,0,1,1,0,0,0,1],[1,0,0,1,0,1,0,1,1,1,1,0],[0,1,1,0,1,1,1,1,0,0,1,1],[0,1,0,0,1,0,1,0,0,0,1,1]])\n", "display_image(bits)\n", "\n" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxEAAAEGCAYAAAAaKxhsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAaVUlEQVR4nO3deZSsdX3n8feHe0EWUVyuRgEFlegQ57DcDuLgEMQNN0jUuDJRdGSSccGMjgGT0ZiZnDM5OrhM1PGCKC5xQzTEcBBEFD0non0FZZORwQWQ5TKKLEYQ+M4f9TTTaW9111PUU/U0/X6d0+dWPfU8v9+3nv7V0/W5z5aqQpIkSZJGtc2sC5AkSZK0uhgiJEmSJLViiJAkSZLUiiFCkiRJUiuGCEmSJEmtrJ91AYslGXqpqI0bN251+ubNm4e2N2yZcQ3ra7l+lqtv0sZ5v32ob5o1jGPS63XS42XS47wPxll/446jaW1bJv2eprnd6cM6mpZxP099qL0P+vD3sA+fjS76Wq3W2jpard91VnBDVW1YOjF9usTrciFiWJ1JhrY36fc2rK/l+lmuvkkb5/32ob5p1jCOSa/XSY+XPn2GJ2Wc9TfuOJrWtmXS72ma250+rKNpGffz1Ifa+6APfw/78Nnooq/Vaq2to9X6XWcFm6tqbulED2eSJEmS1IohQpIkSVIrhghJkiRJrRgiJEmSJLViiJAkSZLUiiFCkiRJUiuGCEmSJEmtGCIkSZIktWKIkCRJktSKIUKSJElSK4YISZIkSa10GiKSHJbksiSXJzm2y74kSZIkTUdnISLJOuB9wDOBvYGXJNm7q/4kSZIkTUeXeyIOAC6vqiuq6nbgU8ARHfYnSZIkaQq6DBG7Alcuen5VM+1fSHJ0kvkk8x3WIkmSJGlC1s+6gKraBGwCSFIzLkeSJEnSCrrcE3E1sPui57s10yRJkiStYl2GiG8DeyXZM8l2wIuB0zrsT5IkSdIUdHY4U1XdkeS1wJeAdcBJVXVxV/1JkiRJmo5Oz4moqtOB07vsQ5IkSdJ0ecdqSZIkSa0YIiRJkiS1YoiQJEmS1IohQpIkSVIrhghJkiRJrRgiJEmSJLViiJAkSZLUiiFCkiRJUiuGCEmSJEmtdHrH6rY2btzI/Pz8Vl9L0rq95ZapqtbtSavNsM/AcuN/nGXGqWFck25vmHHW0bjtTXKZcU16TEx6HU3r976cSdcwzu933BqG9dWHz+ekx/mk19Gk+5rm53rS2/O2/XShD5+bSfc16X6mtT13T4QkSZKkVgwRkiRJkloxREiSJElqxRAhSZIkqRVDhCRJkqRWDBGSJEmSWjFESJIkSWrFECFJkiSpFUOEJEmSpFYMEZIkSZJaMURIkiRJasUQIUmSJKmVzkJEkpOSXJ/koq76kCRJkjR9Xe6J+AhwWIftS5IkSZqBzkJEVZ0L/Kyr9iVJkiTNxszPiUhydJL5JPNbtmyZdTmSJEmSVjDzEFFVm6pqrqrmNmzYMOtyJEmSJK1g5iFCkiRJ0upiiJAkSZLUSpeXeP0k8E/AY5NcleRVXfUlSZIkaXrWd9VwVb2kq7YlSZIkzY6HM0mSJElqxRAhSZIkqRVDhCRJkqRWDBGSJEmSWjFESJIkSWrFECFJkiSpFUOEJEmSpFYMEZIkSZJaMURIkiRJaqWzO1ZLmr2q2ur0JFOupJ1hdcP0al+un3HqG7e9tv0s195yy4yzXif9u5j0Ou9DDX0Yy130NekxO8llxjXO73CS/XRh0rVPup++/40aZ0xM+j314W/eMO6JkCRJktTKSCEiyZOSHNU83pBkz27LkiRJktRXK4aIJG8D/gw4rpm0LfDxLouSJEmS1F+j7In4A+Bw4FaAqvopsHOXRUmSJEnqr1FCxO01OEukAJLs1G1JkiRJkvpslBDxmSQfBHZJ8mrgy8AJ3ZYlSZIkqa9WvMRrVb0zydOAm4DHAm+tqrM6r0ySJElSL410n4gmNBgcJEmSJK0cIpLcTHM+xCK/AOaBN1bVFV0UJkmSJKmfRtkT8W7gKuDvgAAvBh4NfAc4CTikq+IkSZIk9c8oJ1YfXlUfrKqbq+qmqtoEPKOqPg08oOP6JEmSJPXMKCHil0lemGSb5ueFwK+a15Ye5iRJkiTpXm6UEPEy4N8B1wPXNY+PTLID8NphCyXZPck5SS5JcnGSYyZSsSRJkqSZGuUSr1cAzx3y8jeWWfQOBidefyfJzsDmJGdV1SVj1ClJkiSpJ0a5OtP2wKuA3wG2X5heVa9cbrmquga4pnl8c5JLgV0BQ4QkSZK0io1yONPHgN8CngF8DdgNuLlNJ0n2APYDztvKa0cnmU8yv2XLljbNSpIkSZqBUULEY6rqvwC3VtXJwLOBJ4zaQZL7Ap8D3lBVNy19vao2VdVcVc1t2LBh1GYlSZIkzcgoIeLXzb83Jnk8cH/gIaM0nmRbBgHiE1V16nglSpIkSeqTUW42tynJA4C/AE4D7gu8daWFkgT4EHBpVR1/j6qUJEmS1BujXJ3pxObhucCjWrR9EIPLwV6Y5IJm2luq6vR2JUqSJEnqk1GuznQM8GEGJ1OfAOwPHFtVZy63XFV9A8gkipQkSZLUH6OcE/HK5oTopwMPYrB34b93WpUkSZKk3holRCzsTXgW8NGquhj3MEiSJElr1ighYnOSMxmEiC81d5++q9uyJEmSJPXVKFdnehWwL3BFVf0yyQOBo7otS5IkSVJfjbIn4onAZVV1Y5IjGVzq9RfdliVJkiSpr0YJER8AfplkH+CNwP8BPtppVZIkSZJ6a5QQcUdVFXAE8LdV9T5g527LkiRJktRXo5wTcXOS4xhc2vXfJtkG2LbbsiRJkiT11Sh7Il4E3MbgfhHXArsB7+i0KkmSJEm9lcGRSivMlDwS2KuqvpxkR2BdVd088WKSlYuZoWHrKhl+24zl1u9yy/XBKGNjqT68pz7UPU4N4xqn9nHG5bhjeVrrYpo19GGcL6cP63w5a21b2gdr7TMwzKTH0TT/3ozzuVE3+rA9muZYTrK5quaWTl9xT0SSVwOnAB9sJu0KfKF1dZIkSZLuFUY5nOk1wEHATQBV9QPgIV0WJUmSJKm/RgkRt1XV7QtPkqwHen3YkSRJkqTujBIivpbkLcAOSZ4GfBb4h27LkiRJktRXo4SIY4EtwIXAfwBOZ3DXakmSJElr0Ir3iaiqu4ATmh9JkiRJa9woV2d6TpLzk/wsyU1Jbk5y0zSKkyRJktQ/o9yx+t3A84ALa5oXv5ckSZLUS6OcE3ElcJEBQpIkSRKMtifizcDpSb4G3LYwsaqO76wqSZIkSb01Soj4a+AWYHtgu27LkSRJktR3o4SIh1fV4zuvRJIkSdKqMMo5EacneXrbhpNsn+RbSb6b5OIkbx+jPkmSJEk9M0qI+BPgjCT/3PISr7cBh1bVPsC+wGFJDrwnxUqSJEmavVFuNrfzOA03V3O6pXm6bfPjFZ4kSZKkVW6UPRFjS7IuyQXA9cBZVXXeVuY5Osl8kvkua5EkSZI0GZ2GiKq6s6r2BXYDDkjyGydoV9Wmqpqrqrkua5EkSZI0GZ2GiAVVdSNwDnDYNPqTJEmS1J0VQ0SSB27lZ9sRltuQZJfm8Q7A04Dv3/OSJUmSJM3SKPeJ+A6wO/BzIMAuwLVJrgNeXVWbhyz3MODkJOsYhJXPVNUXJ1CzJEmSpBkaJUScBZxSVV8CaO4Z8Xzgw8D7gSdsbaGq+h6w34TqlCRJktQTo5wTceBCgACoqjOBJ1bVN4H7dFaZJEmSpF4aZU/ENUn+DPhU8/xFwHXNYUp3dVaZJEmSpF4aZU/ESxlcovULzc8jmmnrgBd2V5okSZKkPhrljtU3AK8b8vLlky1HkiRJUt+tGCKS/DbwJmCPxfNX1aHdlSVJkiSpr0Y5J+KzwP8CTgTu7LYcSZIkSX03Soi4o6o+0HklkiRJklaFUU6s/ock/zHJwxbftbrzyiRJkiT10ih7Il7e/PufF00r4FGTL0eSJElS341ydaY9p1GIJEmSpNVhaIhIcmhVfSXJ87b2elWdOuliNm7cyPz8/LB6JtpXVbVeZlgNy7U16bqXM8n3tNJr4xhW36T76fNYWam9cWofp71x6ht3vU7zMzDJGpZbr9P8HU6yn2mOy3HqGGc9jGtafY27zqfV3rh9TbKGaW4jJr3t68P2bRzjjpU+vN9pjvNpfW9ZzjS3i20ttyfi94CvAM/dymsFTDxESJIkSeq/oSGiqt7W/HvU9MqRJEmS1Hej3GxuF+CP+M2bzb2+u7IkSZIk9dUoV2c6HfgmcCFwV7flSJIkSeq7UULE9lX1nzqvRJIkSdKqMMrN5j6W5NXebE6SJEkSjLYn4nbgHcCfM7gqE3izOUmSJGnNGiVEvBF4TFXd0HUxkiRJkvpvlMOZLgd+2XUhkiRJklaHUfZE3ApckOQc4LaFiV7iVZIkSVqbRgkRX2h+JEmSJGnlEFFVJyfZDvjtZtJlVfXrUTtIsg6YB66uqueMV6YkSZKkvhjljtWHACcDPwIC7J7k5VV17oh9HANcCtxvzBolSZIk9cgoJ1b/D+DpVfV7VXUw8AzgXaM0nmQ34NnAieOXKEmSJKlPRgkR21bVZQtPqup/A9uO2P67gTcDdw2bIcnRSeaTzG/ZsmXEZiVJkiTNyighYj7JiUkOaX5OYHCOw7KSPAe4vqo2LzdfVW2qqrmqmtuwYcOIZUuSJEmalVGuzvQnwGuAhUu6fh14/wjLHQQcnuRZwPbA/ZJ8vKqOHKtSSZIkSb0wSohYD7ynqo6Hu6+2dJ+VFqqq44DjmmUOAd5kgJAkSZJWv1EOZzob2GHR8x2AL3dTjiRJkqS+G2VPxPZVdcvCk6q6JcmObTqpqq8CX21XmiRJkqQ+GmVPxK1J9l94kmQj8M/dlSRJkiSpz0bZE/EG4LNJfsrgZnO/Bbyo06okSZIk9daKIaKqvp3kccBjm0mXVdWvuy1LkiRJUl+NsicC4HeBPZr5909CVX20s6okSZIk9daKISLJx4BHAxcAdzaTCzBESJIkSWvQKHsi5oC9q6q6LkaSJElS/41ydaaLGJxMLUmSJEkj7Yl4MHBJkm8Bty1MrKrDO6tKkiRJUm+NEiL+susiJEmSJK0eo1zi9WvTKESSJEnS6jA0RCS5mcFVmH7jJaCq6n6dVSWpU8tdJyFJ62WWM6y9vhjnfY3zniZ9bYpxfofLmfTvadL1jdtX2xr68nsattyk1+u477fP63yc9brScuO012fjfgaHvd9ptjfO73eaf4fGqWHSf5On9XdtaIioqp1btyZJkiTpXm+UqzNJkiRJ0t0MEZIkSZJaMURIkiRJasUQIUmSJKkVQ4QkSZKkVgwRkiRJkloxREiSJElqxRAhSZIkqRVDhCRJkqRWDBGSJEmSWlnfZeNJfgTcDNwJ3FFVc132J0mSJKl7nYaIxpOr6oYp9CNJkiRpCjycSZIkSVIrXYeIAs5MsjnJ0VubIcnRSeaTzG/ZsqXjciRJkiTdU12HiCdV1f7AM4HXJDl46QxVtamq5qpqbsOGDR2XI0mSJOme6jREVNXVzb/XA58HDuiyP0mSJEnd6yxEJNkpyc4Lj4GnAxd11Z8kSZKk6ejy6kwPBT6fZKGfv6uqMzrsT5IkSdIUdBYiquoKYJ+u2pckSZI0G17iVZIkSVIrhghJkiRJrRgiJEmSJLViiJAkSZLUiiFCkiRJUiuGCEmSJEmtGCIkSZIktWKIkCRJktSKIUKSJElSK4YISZIkSa2sn3UBkrpTVVudnmTKlbQzrG6YXu3L9TNOfeO217af5YzTz7h9TXqZPoyJcYxbWx/G+bRMs4ZJf26mWfuwOvpQ3zS3LeO833Hrm2QNk9aH7aV7IiRJkiS1YoiQJEmS1IohQpIkSVIrhghJkiRJrRgiJEmSJLViiJAkSZLUiiFCkiRJUiuGCEmSJEmtGCIkSZIktWKIkCRJktSKIUKSJElSK52GiCS7JDklyfeTXJrkiV32J0mSJKl76ztu/z3AGVX1giTbATt23J8kSZKkjnUWIpLcHzgYeAVAVd0O3N5Vf5IkSZKmo8vDmfYEtgAfTnJ+khOT7LR0piRHJ5lPMr9ly5YOy5EkSZI0CV2GiPXA/sAHqmo/4Fbg2KUzVdWmqpqrqrkNGzZ0WI4kSZKkSegyRFwFXFVV5zXPT2EQKiRJkiStYp2FiKq6FrgyyWObSU8BLumqP0mSJEnT0fXVmV4HfKK5MtMVwFEd9ydJkiSpY52GiKq6AJjrsg9JkiRJ0+UdqyVJkiS1YoiQJEmS1IohQpIkSVIrhghJkiRJrRgiJEmSJLViiJAkSZLUiiFCkiRJUiuGCEmSJEmtGCIkSZIktWKIkCRJktRKqmrWNdwtyRbgx83TBwM3zLAc9Y9jQks5JrSY40FLOSa0lGOivUdW1YalE3sVIhZLMl9Vc7OuQ/3hmNBSjgkt5njQUo4JLeWYmBwPZ5IkSZLUiiFCkiRJUit9DhGbZl2AescxoaUcE1rM8aClHBNayjExIb09J0KSJElSP/V5T4QkSZKkHjJESJIkSWqldyEiyWFJLktyeZJjZ12Ppi/J7knOSXJJkouTHNNMf2CSs5L8oPn3AbOuVdOVZF2S85N8sXm+Z5Lzmu3Fp5NsN+saNT1JdklySpLvJ7k0yRPdTqxtSf60+btxUZJPJtne7cTakuSkJNcnuWjRtK1uFzLw3mZsfC/J/rOrfPXpVYhIsg54H/BMYG/gJUn2nm1VmoE7gDdW1d7AgcBrmnFwLHB2Ve0FnN0819pyDHDpoud/A7yrqh4D/Bx41Uyq0qy8Bzijqh4H7MNgbLidWKOS7Aq8HpirqscD64AX43ZirfkIcNiSacO2C88E9mp+jgY+MKUa7xV6FSKAA4DLq+qKqrod+BRwxIxr0pRV1TVV9Z3m8c0MvhjsymAsnNzMdjLw+7OpULOQZDfg2cCJzfMAhwKnNLM4JtaQJPcHDgY+BFBVt1fVjbidWOvWAzskWQ/sCFyD24k1parOBX62ZPKw7cIRwEdr4JvALkkeNp1KV7++hYhdgSsXPb+qmaY1KskewH7AecBDq+qa5qVrgYfOqCzNxruBNwN3Nc8fBNxYVXc0z91erC17AluADzeHuJ2YZCfcTqxZVXU18E7gJwzCwy+Azbid0PDtgt8774G+hQjpbknuC3wOeENV3bT4tRpcm9jrE68RSZ4DXF9Vm2ddi3pjPbA/8IGq2g+4lSWHLrmdWFua49yPYBAwHw7sxG8e1qI1zu3C5PQtRFwN7L7o+W7NNK0xSbZlECA+UVWnNpOvW9jN2Px7/azq09QdBBye5EcMDnM8lMHx8Ls0hy2A24u15irgqqo6r3l+CoNQ4XZi7Xoq8MOq2lJVvwZOZbDtcDuhYdsFv3feA30LEd8G9mqupLAdgxOiTptxTZqy5lj3DwGXVtXxi146DXh58/jlwN9PuzbNRlUdV1W7VdUeDLYLX6mqlwHnAC9oZnNMrCFVdS1wZZLHNpOeAlyC24m17CfAgUl2bP6OLIwJtxMatl04Dfij5ipNBwK/WHTYk1bQuztWJ3kWg2Of1wEnVdVfz7gkTVmSJwFfBy7k/x///hYG50V8BngE8GPghVW19OQp3cslOQR4U1U9J8mjGOyZeCBwPnBkVd02y/o0PUn2ZXCi/XbAFcBRDP5zzO3EGpXk7cCLGFzl73zg3zM4xt3txBqR5JPAIcCDgeuAtwFfYCvbhSZs/i2Dw95+CRxVVfOzqHs16l2IkCRJktRvfTucSZIkSVLPGSIkSZIktWKIkCRJktSKIUKSJElSK4YISZIkSa0YIiSp55I8KMkFzc+1Sa5uHt+Y5JJ70O4rkmxp2vp+kj+dcN1zSd47obZ+lOTBW5l+y5D5/yrJU5vHb0iy4yTqkCQNeIlXSVpFkvwlcEtVvTPJHsAXq+rxY7b1CmCuql6b5EHAZcB+VXXlhMqdmOZu5XNVdcOS6bdU1X3HWVaSND73REjS6rYuyQlJLk5yZpIdAJI8OskZSTYn+XqSxy3XSFX9X+By4GHN8kcm+Vazl+KDSdY10w9L8p0k301ydjNtpyQnNfOfn+SIZvohSb6YZJtmT8IuC/0l+UGShybZkORzSb7d/BzUvP6g5v1cnOREIMNqT/KuZr6zk2xopn0kyQuSvB54OHBOknOSrGteuyjJhZPe+yJJa4UhQpJWt72A91XV7wA3As9vpm8CXldVG4E3Ae9frpEkjwC2B76X5F8xuOvvQVW1L3An8LLmC/oJwPOrah/gD5vF/xz4SlUdADwZeEeSnRbarqq7gL8H/qDp6wnAj6vqOuA9wLuq6neb2k9sFnsb8I3mfX2ewZ1mt2YnYL6Z72vNcnerqvcCPwWeXFVPBvYFdq2qx1fVvwY+vNx6kSRt3fpZFyBJukd+WFUXNI83A3skuS/wb4DPJnf/B/59hiz/oiQHA48DXltVv0ryFGAj8O1m+R2A64EDgXOr6ocAVfWzpo2nA4cneVPzfHt+80v/p4G3MvjS/uLmOcBTgb0X1Xm/pv6Dgec1/fxjkp8Pqf+uRW19HDh1yHwLrgAeleR/Av8InLnC/JKkrTBESNLqdtuix3cy+MK/DXBjsxdhJZ9uzomYA85MchqDQ4dOrqrjFs+Y5LlD2giDvROXLZn/oYue/hPwmGZvxu8D/62Zvg1wYFX9asmyI5S+Vcue6FdVP0+yD/AM4I+BFwKvHLczSVqrPJxJku5lquom4IdJ/hAgA/ussMw88DHgGOBs4AVJHtIs/8AkjwS+CRycZM+F6c3iXwJel+abf5L9ttJ+MTgs6Xjg0uYcDBjsCXjdwnxJFoLPucBLm2nPBB4wpPRtgBc0j18KfGMr89wM7Ny09WBgm6r6HPAXwP5D2pUkLcMQIUn3Ti8DXpXku8DFwBEjLPM3wFHAlQy+YJ+Z5HvAWcDDqmoLcDRwatPuwmFE/xXYlsH5FBc3z7fm08CRi5YDeD0wl+R7zeVq/7iZ/nYGgeViBoc1/WRIm7cCByS5CDgU+KutzLMJOCPJOcCuwFeTXMDg8KfjtjK/JGkFXuJVkiRJUivuiZAkSZLUiiFCkiRJUiuGCEmSJEmtGCIkSZIktWKIkCRJktSKIUKSJElSK4YISZIkSa38P/hGrm37H3dMAAAAAElFTkSuQmCC\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "9z59nCTex93n" }, "source": [ "\n", "\n", "\n", "**Ejercicio 8:**\n", "\n", "Para uno de los paquetes identificados como long squitter, decodificar a mano el mensaje recibido (alcanza solo con indicar el código ICAO en hexadecimal). Para ello, estudiar: http://mode-s.org/decode/adsb/introduction.html\n", "Con el ICAO obtenido ver detalles del avion en http://www.airframes.org\n", " \n", "##Informe\n", "Entregue un informe que explique cómo funciona ADS-B, responda a todo lo que se pregunta a lo largo de este tutorial, haciendo todo lo que se le indica a lo largo del mismo, mostrando resultados, gráficas y explicando en el informe lo hecho y los resultados. Finalice el informe con el código de la función detectar_preambulo, y datosAbits (que debe estar comentado) y en el informe se debe explicar cómo diseñaron dichos códigos y por qué lo diseñaron de esa forma. Muestre la matriz de bits obtenida como imágen.\n" ] } ] }