Radio definida por software: ¿cómo funciona? Parte 7

Hola Habr

En la parte anterior sobre la transmisión a GNU Radio , se preguntó si es posible decodificar el protocolo LoRa (transferencia de datos para dispositivos de baja potencia) utilizando SDR. Este tema me pareció interesante, especialmente porque la señal LoRa en sí misma es bastante inusual: la llamada modulación Chirp Spread Spectrum, o "modulación chirp".



Cómo funciona, continuó debajo del corte.

Por cierto, la traducción literal de la modulación Chirp habría sonado como "modulación de tweet", pero suena completamente surrealista, por lo que es mejor dejar la simple palabra "chirp" (como se sugiere en los comentarios, en ruso se llama modulación de frecuencia lineal ).

Modulación LoRa


Como se mencionó anteriormente, cuando se transmite LoRa, se utiliza un método de modulación que utiliza "chirps", patentado por Semtech. Si alguien quiere detalles de implementación con fórmulas, puede leer el PDF en el sitio web semtech o aquí , pero si es muy grosero, entonces un "chirrido" es un cambio de frecuencia, y el flujo de bits se codifica con dichos cambios, como se muestra en la imagen de arriba. Los parámetros de señal en LoRa son SF (factor de propagación, de hecho, la duración de un "chirp") y ancho de banda: ancho de banda de transmisión. El parámetro SF se establece mediante los valores predefinidos de SF7: SF12, donde 7 es el más rápido y 12 es el modo más lento (por ejemplo, puede ver una imagen con una ilustración de diferentes velocidades de canto con Researchgate ).

Obviamente, cuanto más corta es la longitud del "chirrido" y más ancha es la banda, más puede obtener la velocidad de transmisión. Todo esto está conectado por una tabla como esta:



Desde el punto de vista de la inmunidad al alcance y al ruido, es ventajoso transmitir lenta y tristemente, pero antes que nada, perdemos velocidad, en segundo lugar, perdemos tiempo y, de acuerdo con las reglas de LoRa, el dispositivo no puede transmitir más del 1% del tiempo para no molestar a los demás. dispositivos. Por lo tanto, la elección de la velocidad de transmisión óptima para dispositivos de baja potencia tampoco es una tarea fácil.

Con un principio general, espero que esté claro, ahora pasemos a SDR y decodificación.

Hierro


Para las pruebas, utilicé LoRa Click RN2483 y Arduino M0, simplemente porque estaban disponibles.



Este es un factor de forma bastante conveniente para la creación de prototipos, ya que le permite reemplazar fácilmente la placa una por otra sin soldar (en este formato, llamado MikroBUS , hay muchos periféricos diferentes disponibles).

El borrador del código, que no pretende ser producción, se ha agregado bajo el spoiler. El valor "1234" se pasa como prueba.

rn2483_tx.ino
// RN2483 Modem and LoRa Click test TX. Tested with Arduino M0 int reset = A2; int rts = 9; // CS int cts = 3; // INT // the setup routine runs once when you press reset: void setup() { Serial1.begin(57600); // Serial port to radio // output LED pin pinMode(LED_BUILTIN, OUTPUT); pinMode(cts, INPUT); pinMode(rts, OUTPUT); digitalWrite(rts, HIGH); // Reset rn2483 pinMode(reset, OUTPUT); digitalWrite(reset, LOW); delay(100); digitalWrite(reset, HIGH); delay(100); sendCommand("sys get ver\r\n"); sendCommand("sys get hweui\r\n"); sendCommand("mac pause\r\n"); sendCommand("radio set mod lora\r\n"); sendCommand("radio set pwr -3\r\n"); // the transceiver output power, from -3 to 15 sendCommand("radio set sf sf8\r\n"); // sf7..sf12, sf7 the fastest spreading factor but gives the shortest range // sendCommand("mac set dr 0\r\n"); // data rate: 0-4, 4 faster sendCommand("radio set freq 869100000\r\n"); // sendCommand("radio set afcbw 41.7\r\n"); sendCommand("radio set rxbw 125\r\n"); // sendCommand("radio set prlen 8\r\n"); sendCommand("radio set crc on\r\n"); // sendCommand("radio set iqi off\r\n"); sendCommand("radio set cr 4/8\r\n"); // sendCommand("radio set wdt 60000\r\n"); // disable for continuous reception // sendCommand("radio set sync 12\r\n"); sendCommand("radio set bw 125\r\n"); } void sendCommand(const char *cmd) { Serial1.print(cmd); String incoming = Serial1.readString(); // SerialUSB.print(cmd); // SerialUSB.println(incoming); } // the loop routine runs over and over again forever: void loop() { char data[64] = {0}; // hexadecimal value representing the data to be transmitted, from 0 to 255 bytes for LoRa modulation and from 0 to 64 bytes for FSK modulation. sprintf(data, "radio tx 1234\r\n"); sendCommand(data); if (msg_num > 10000) msg_num=0; digitalWrite(LED_BUILTIN, 1); delay(400); digitalWrite(LED_BUILTIN, 0); delay(600); } 

Por cierto, el rango de transmisión máximo declarado para RN2483 es ​​de hasta 15 km, en la práctica, en presencia de un edificio de un piso, la señal ya desaparece durante 1 km y no puede superar los 100 m en "hormigueros" urbanos.

Iniciamos el módem y procedemos a la decodificación.

Decodificación


No hay soporte LoRa en la propia Radio GNU, por lo que debe usar componentes de terceros. Solo había dos de ellos, y desafortunadamente, ambos autores no mostraron ninguna imaginación en el nombre, y los llamaron exactamente igual: gr-lora ( https://github.com/rpp0/gr-lora y https://github.com/ BastilleResearch / gr-lora respectivamente). Desafortunadamente, debido a que GNU Radio no puede tener ambos componentes a la vez, el instalador de un componente sobrescribe los archivos del otro.

rpp0 / gr-lora

Puede descargar las fuentes del decodificador desde github , el ensamblaje es estándar y no causa dificultades:

 git clone https://github.com/rpp0/gr-lora.git cd gr-lora mkdir build cd build cmake .. make && sudo make install && sudo ldconfig 

Después de la instalación, aparecen bloques adicionales en GNU Radio, desde donde es fácil ensamblar un decodificador. Como parámetros del decodificador, debe especificar el ancho de banda de transmisión, el factor de dispersión, la frecuencia central del SDR y la frecuencia de recepción.



Las unidades de GNU Radio están estandarizadas para poder utilizar cualquier receptor, como RTL-SDR. Usé SDRPlay. Se usó un programa simple de Python para enviar datos a la consola.

udp_receive.py
 import socket UDP_IP = "127.0.0.1" UDP_PORT = 40868 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((UDP_IP, UDP_PORT)) sock.settimeout(0.5) while True: try: data, addr = sock.recvfrom(128) # buffer size is 1024 bytes print("Msg:", ' '.join('{:02x}'.format(x) for x in data)) except socket.timeout: pass 

El resultado del trabajo se muestra en la figura.



Como puede ver, la fila contiene el encabezado y los bloques finales de la transmisión, y en el medio vemos nuestros datos "1234".

BastilleResearch / gr-lora

Este módulo es notable porque puede funcionar no solo en recepción, sino también en transmisión. La instalación es aproximadamente la misma: el componente debe ensamblarse desde la fuente.

 git clone git://github.com/BastilleResearch/gr-lora.git cd gr-lora mkdir build cd build cmake .. make && sudo make install && sudo ldconfig 

El gráfico de conexión para este decodificador se muestra en la figura.



Como puede ver, hay más bloques. Rotator y Polyphase Resampler seleccionan la frecuencia deseada y cortan el exceso, el Demodulador convierte los "chirps" en un código binario (la salida es una secuencia como "17 00 3e 00 38 00 2f 00 01 00 39 00 2c 00 30 00 c6 00 18 00 7e 00 d5 00 85 00 e9 00 d8 00 67 00 c4 00 ”), y Decoder forma el paquete final.

Lamentablemente, nunca funcionó correctamente. La decodificación definitivamente funciona, mientras el módem funciona, aparecen los datos, pero los mensajes recibidos no tienen nada que ver con los transmitidos.



No entendí la razón, o cometí un error en la configuración en alguna parte, o este decodificador es compatible solo con mi propio codificador. Aquellos que lo deseen pueden verificar por su cuenta utilizando el modelo de canal.

LoRaWAN


Como puede ver, la capa física inferior de transmisión se consideró aquí. En el protocolo LoRaWAN de nivel superior, se coloca otra capa lógica en la parte superior, con cifrado, claves y otros servicios. Aquellos que quieran ver cómo funciona la codificación pueden probar el decodificador en línea aquí .

Por cierto, se deduce que incluso si recibimos una señal LoRaWAN usando SDR, sin la presencia de claves de cifrado (una de las cuales está almacenada en el servidor del proveedor), aún no reconocemos el contenido del paquete.

Conclusión


Como puede ver, decodificar LoRa usando SDR es bastante posible. Por supuesto, no es aconsejable hacer una puerta de enlace real basada en SDR: su sensibilidad será peor que la sensibilidad de los módems "reales", que están especialmente diseñados para recibir señales débiles y tienen más filtros de banda estrecha y LNA. Pero para pruebas o investigaciones, esto puede ser bastante interesante.

Para aquellos que quieran probarlo por su cuenta, los archivos fuente de GNU Radio grc están bajo el spoiler.

recibir1.grc
 <?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Mon Jun 3 09:39:45 2019</timestamp> <block> <key>options</key> <param> <key>author</key> <value></value> </param> <param> <key>window_size</key> <value></value> </param> <param> <key>category</key> <value>[GRC Hier Blocks]</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(8, 8)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>wx_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>top_block</value> </param> <param> <key>max_nouts</key> <value>0</value> </param> <param> <key>qt_qss_theme</key> <value></value> </param> <param> <key>realtime_scheduling</key> <value></value> </param> <param> <key>run_command</key> <value>{python} -u {filename}</value> </param> <param> <key>run_options</key> <value>prompt</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value></value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(760, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>bw</value> </param> <param> <key>value</key> <value>125000.0</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(936, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>code_rate</value> </param> <param> <key>value</key> <value>4</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(848, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>header</value> </param> <param> <key>value</key> <value>True</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(680, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>ldr</value> </param> <param> <key>value</key> <value>True</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(400, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>offset</value> </param> <param> <key>value</key> <value>-100000.0</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(8, 76)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>samp_rate</value> </param> <param> <key>value</key> <value>1000000</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(544, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>spreading_factor</value> </param> <param> <key>value</key> <value>8</value> </param> </block> <block> <key>blocks_rotator_cc</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(416, 252)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_rotator_cc_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>phase_inc</key> <value>(2 * math.pi * offset) / samp_rate</value> </param> </block> <block> <key>blocks_socket_pdu</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(944, 452)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>host</key> <value>127.0.0.1</value> </param> <param> <key>id</key> <value>blocks_socket_pdu_0</value> </param> <param> <key>mtu</key> <value>10000</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>port</key> <value>40868</value> </param> <param> <key>tcp_no_delay</key> <value>False</value> </param> <param> <key>type</key> <value>"UDP_CLIENT"</value> </param> </block> <block> <key>import</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(296, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>import_0</value> </param> <param> <key>import</key> <value>import math</value> </param> </block> <block> <key>lora_decode</key> <param> <key>alias</key> <value></value> </param> <param> <key>code_rate</key> <value>code_rate</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>header</key> <value>header</value> </param> <param> <key>_coordinate</key> <value>(648, 452)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_decode_0</value> </param> <param> <key>low_data_rate</key> <value>ldr</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>spreading_factor</key> <value>spreading_factor</value> </param> </block> <block> <key>lora_demod</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>fft_factor</key> <value>2</value> </param> <param> <key>beta</key> <value>25.0</value> </param> <param> <key>_coordinate</key> <value>(384, 452)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_demod_0</value> </param> <param> <key>low_data_rate</key> <value>ldr</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>spreading_factor</key> <value>spreading_factor</value> </param> </block> <block> <key>pfb_arb_resampler_xxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(656, 292)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>pfb_arb_resampler_xxx_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>nfilts</key> <value>32</value> </param> <param> <key>rrate</key> <value>bw/samp_rate</value> </param> <param> <key>samp_delay</key> <value>0</value> </param> <param> <key>atten</key> <value>100</value> </param> <param> <key>taps</key> <value></value> </param> <param> <key>type</key> <value>ccf</value> </param> </block> <block> <key>sdrplay_rsp2_source</key> <param> <key>agc_enabled</key> <value>False</value> </param> <param> <key>antenna</key> <value>'A'</value> </param> <param> <key>bw</key> <value>400</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>dc_offset_mode</key> <value>True</value> </param> <param> <key>debug_enabled</key> <value>False</value> </param> <param> <key>device_serial</key> <value>'0'</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(144, 196)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sdrplay_rsp2_source_0</value> </param> <param> <key>if_atten_db</key> <value>30</value> </param> <param> <key>ifType</key> <value>0</value> </param> <param> <key>iq_balance_mode</key> <value>True</value> </param> <param> <key>lna_atten_step</key> <value>3</value> </param> <param> <key>lo_mode</key> <value>1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>rf_freq</key> <value>869.0e6</value> </param> <param> <key>sample_rate</key> <value>samp_rate</value> </param> </block> <block> <key>wxgui_fftsink2</key> <param> <key>avg_alpha</key> <value>0</value> </param> <param> <key>average</key> <value>False</value> </param> <param> <key>baseband_freq</key> <value>0</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fft_size</key> <value>1024</value> </param> <param> <key>freqvar</key> <value>None</value> </param> <param> <key>_coordinate</key> <value>(1000, 116)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>grid_pos</key> <value></value> </param> <param> <key>id</key> <value>wxgui_fftsink2_0</value> </param> <param> <key>notebook</key> <value></value> </param> <param> <key>peak_hold</key> <value>False</value> </param> <param> <key>ref_level</key> <value>0</value> </param> <param> <key>ref_scale</key> <value>2.0</value> </param> <param> <key>fft_rate</key> <value>15</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> <key>title</key> <value>FFT Plot</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>win_size</key> <value></value> </param> <param> <key>win</key> <value>None</value> </param> <param> <key>y_divs</key> <value>10</value> </param> <param> <key>y_per_div</key> <value>10</value> </param> </block> <connection> <source_block_id>blocks_rotator_cc_0</source_block_id> <sink_block_id>pfb_arb_resampler_xxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_rotator_cc_0</source_block_id> <sink_block_id>wxgui_fftsink2_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>lora_decode_0</source_block_id> <sink_block_id>blocks_socket_pdu_0</sink_block_id> <source_key>out</source_key> <sink_key>pdus</sink_key> </connection> <connection> <source_block_id>lora_demod_0</source_block_id> <sink_block_id>lora_decode_0</sink_block_id> <source_key>out</source_key> <sink_key>in</sink_key> </connection> <connection> <source_block_id>pfb_arb_resampler_xxx_0</source_block_id> <sink_block_id>lora_demod_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>sdrplay_rsp2_source_0</source_block_id> <sink_block_id>blocks_rotator_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph> 


recibir2.grc
 <?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Mon Jun 3 09:39:45 2019</timestamp> <block> <key>options</key> <param> <key>author</key> <value></value> </param> <param> <key>window_size</key> <value></value> </param> <param> <key>category</key> <value>[GRC Hier Blocks]</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(8, 8)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>wx_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>top_block</value> </param> <param> <key>max_nouts</key> <value>0</value> </param> <param> <key>qt_qss_theme</key> <value></value> </param> <param> <key>realtime_scheduling</key> <value></value> </param> <param> <key>run_command</key> <value>{python} -u {filename}</value> </param> <param> <key>run_options</key> <value>prompt</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value></value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(184, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>samp_rate</value> </param> <param> <key>value</key> <value>1000000</value> </param> </block> <block> <key>lora_lora_receiver</key> <param> <key>bandwidth</key> <value>125000</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>crc</key> <value>True</value> </param> <param> <key>center_freq</key> <value>869e6</value> </param> <param> <key>channel_list</key> <value>[869.1e6]</value> </param> <param> <key>cr</key> <value>4</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>conj</key> <value>False</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>decimation</key> <value>1</value> </param> <param> <key>disable_channelization</key> <value>False</value> </param> <param> <key>disable_drift_correction</key> <value>False</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(456, 332)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_lora_receiver_0</value> </param> <param> <key>implicit</key> <value>False</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>reduced_rate</key> <value>False</value> </param> <param> <key>samp_rate</key> <value>1e6</value> </param> <param> <key>sf</key> <value>8</value> </param> </block> <block> <key>lora_message_socket_sink</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(696, 364)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_message_socket_sink_0</value> </param> <param> <key>ip</key> <value>127.0.0.1</value> </param> <param> <key>layer</key> <value>1</value> </param> <param> <key>port</key> <value>40868</value> </param> </block> <block> <key>sdrplay_rsp2_source</key> <param> <key>agc_enabled</key> <value>False</value> </param> <param> <key>antenna</key> <value>'A'</value> </param> <param> <key>bw</key> <value>400</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>dc_offset_mode</key> <value>True</value> </param> <param> <key>debug_enabled</key> <value>False</value> </param> <param> <key>device_serial</key> <value>'0'</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(72, 148)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sdrplay_rsp2_source_0</value> </param> <param> <key>if_atten_db</key> <value>30</value> </param> <param> <key>ifType</key> <value>0</value> </param> <param> <key>iq_balance_mode</key> <value>True</value> </param> <param> <key>lna_atten_step</key> <value>3</value> </param> <param> <key>lo_mode</key> <value>1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>rf_freq</key> <value>869.0e6</value> </param> <param> <key>sample_rate</key> <value>samp_rate</value> </param> </block> <block> <key>wxgui_fftsink2</key> <param> <key>avg_alpha</key> <value>0</value> </param> <param> <key>average</key> <value>True</value> </param> <param> <key>baseband_freq</key> <value>0</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fft_size</key> <value>1024</value> </param> <param> <key>freqvar</key> <value>None</value> </param> <param> <key>_coordinate</key> <value>(688, 108)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>grid_pos</key> <value></value> </param> <param> <key>id</key> <value>wxgui_fftsink2_0</value> </param> <param> <key>notebook</key> <value></value> </param> <param> <key>peak_hold</key> <value>True</value> </param> <param> <key>ref_level</key> <value>0</value> </param> <param> <key>ref_scale</key> <value>2.0</value> </param> <param> <key>fft_rate</key> <value>15</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> <key>title</key> <value>FFT Plot</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>win_size</key> <value></value> </param> <param> <key>win</key> <value>None</value> </param> <param> <key>y_divs</key> <value>10</value> </param> <param> <key>y_per_div</key> <value>10</value> </param> </block> <connection> <source_block_id>lora_lora_receiver_0</source_block_id> <sink_block_id>lora_message_socket_sink_0</sink_block_id> <source_key>frames</source_key> <sink_key>in</sink_key> </connection> <connection> <source_block_id>sdrplay_rsp2_source_0</source_block_id> <sink_block_id>lora_lora_receiver_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>sdrplay_rsp2_source_0</source_block_id> <sink_block_id>wxgui_fftsink2_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph> 


Todos los experimentos exitosos.

Source: https://habr.com/ru/post/454666/


All Articles