Hai, Habr.
Pada bagian sebelumnya tentang
transmisi ke Radio GNU , pertanyaan diajukan tentang apakah mungkin untuk memecahkan kode protokol
LoRa (transfer data untuk perangkat berdaya rendah) menggunakan SDR. Topik ini tampak menarik bagi saya, terutama karena sinyal LoRa sendiri agak tidak biasa - yang disebut modulasi Spektrum Kicauan Kicauan, atau "modulasi kicauan".

Cara kerjanya, dilanjutkan di bawah luka.
Ngomong-ngomong, terjemahan harfiah modulasi Kicauan akan terdengar seperti "modulasi tweet", tetapi kedengarannya benar-benar nyata, jadi saya lebih baik meninggalkan kata sederhana "kicauan" (seperti yang disarankan dalam komentar, dalam bahasa Rusia ini disebut
modulasi frekuensi linear ).
Modulasi LoRa
Seperti disebutkan di atas, ketika mentransmisikan LoRa, metode modulasi menggunakan "celetuk" digunakan, dengan cara dipatenkan oleh Semtech. Jika ada yang menginginkan detail implementasi dengan formula, Anda dapat membaca PDF
di situs web semtech atau di
sini , tetapi jika itu sangat kasar, maka satu "kicauan" adalah satu perubahan frekuensi, dan bit stream dikodekan dengan perubahan seperti itu, seperti yang ditunjukkan pada gambar di atas. Parameter sinyal dalam LoRa adalah SF (faktor penyebaran - pada kenyataannya, durasi satu "kicauan") dan bandwidth - bandwidth transmisi. Parameter SF diatur oleh nilai SF7 yang telah ditentukan sebelumnya - SF12, di mana 7 adalah yang tercepat dan 12 adalah mode paling lambat (misalnya, Anda dapat melihat gambar dengan ilustrasi kecepatan berkicau yang berbeda
dengan riset kembali ).
Jelas, semakin pendek panjang βkicauanβ dan semakin lebar band, semakin Anda bisa mendapatkan kecepatan transmisi. Semua ini terhubung oleh tabel seperti ini:

Dari sudut pandang jangkauan dan kekebalan noise, menguntungkan untuk mentransmisikan secara lambat dan sedih, tetapi pertama-tama, kita kehilangan kecepatan, kedua, kita kehilangan waktu, dan menurut aturan LoRa, perangkat dapat mentransmisikan tidak lebih dari 1% dari waktu agar tidak mengganggu orang lain perangkat. Jadi pilihan kecepatan transmisi optimal untuk perangkat berdaya rendah juga bukan tugas yang mudah.
Dengan prinsip umum, saya harap ini jelas, sekarang mari kita beralih ke SDR dan decoding.
Besi
Untuk pengujian, saya menggunakan LoRa Click RN2483 dan Arduino M0, hanya karena tersedia.

Ini adalah faktor bentuk yang cukup nyaman untuk prototipe, seperti itu memungkinkan Anda untuk dengan mudah mengganti papan dengan yang lain tanpa menyolder (dalam format ini, disebut
MikroBUS , banyak periferal berbeda tersedia).
Kode konsep, bukan berpura-pura menjadi produksi, telah ditambahkan di bawah spoiler. Nilai "1234" dilewatkan sebagai tes.
Omong-omong, jangkauan transmisi maksimum yang dinyatakan untuk RN2483 adalah hingga 15 km, dalam praktiknya, di hadapan bangunan satu lantai, sinyalnya sudah hilang untuk 1 km, dan bisa tidak lebih dari 100 m di "anthills" perkotaan.
Kami memulai modem, dan melanjutkan ke decoding.
Decoding
Tidak ada dukungan LoRa di GNU Radio itu sendiri, jadi Anda harus menggunakan komponen pihak ketiga. Hanya ada dua, dan sayangnya, kedua penulis tidak menunjukkan imajinasi dalam nama, dan mereka menyebut mereka persis sama - gr-lora (
https://github.com/rpp0/gr-lora dan
https://github.com/ BastilleResearch / gr-lora masing
- masing). Sayangnya, karena GNU Radio tidak dapat memiliki kedua komponen sekaligus, penginstal satu komponen menimpa file yang lain.
rpp0 / gr-loraAnda dapat mengunduh sumber decoder
dari github , perakitannya standar dan tidak menyebabkan kesulitan:
git clone https://github.com/rpp0/gr-lora.git cd gr-lora mkdir build cd build cmake .. make && sudo make install && sudo ldconfig
Setelah instalasi, blok tambahan muncul di GNU Radio, dari mana mudah untuk merakit decoder. Sebagai parameter dekoder, Anda harus menentukan bandwidth transmisi, faktor penyebaran, frekuensi tengah SDR dan frekuensi penerimaan.

Unit-unit di Radio GNU distandarisasi sehingga setiap penerima, seperti RTL-SDR, dapat digunakan. Saya menggunakan SDRPlay. Program Python sederhana digunakan untuk menampilkan data ke konsol.
udp_receive.py import socket UDP_IP = "127.0.0.1" UDP_PORT = 40868 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Hasil pekerjaan ditunjukkan pada gambar.

Seperti yang Anda lihat, baris berisi header dan blok akhir dari transmisi, dan di tengah kita melihat data kami "1234".
BastilleResearch / gr-loraModul ini patut diperhatikan karena dapat bekerja tidak hanya pada penerimaan, tetapi juga pada transmisi. Instalasi hampir sama: komponen perlu dirakit dari sumber.
git clone git://github.com/BastilleResearch/gr-lora.git cd gr-lora mkdir build cd build cmake .. make && sudo make install && sudo ldconfig
Grafik Koneksi untuk dekoder ini ditunjukkan pada gambar.

Seperti yang Anda lihat, ada lebih banyak blok. Rotator dan Polyphase Resampler memilih frekuensi yang diinginkan dan memotong kelebihannya, Demodulator mengubah "celetuk" menjadi kode biner (outputnya berurutan seperti "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 "), dan Decoder membentuk paket akhir.
Sayangnya, itu tidak pernah berfungsi dengan baik. Decoding pasti berfungsi, ketika modem berfungsi, data muncul, tetapi pesan yang diterima tidak ada hubungannya dengan yang dikirim.

Saya tidak mengerti alasannya, apakah saya membuat kesalahan dalam pengaturan di suatu tempat, atau decoder ini hanya kompatibel dengan encoder saya sendiri. Mereka yang ingin dapat memeriksa secara mandiri menggunakan Model Saluran.
LoRaWAN
Seperti yang Anda lihat, lapisan transmisi fisik yang lebih rendah dipertimbangkan di sini. Dalam protokol LoRaWAN tingkat yang lebih tinggi, lapisan logis lain ditempatkan di atas - dengan enkripsi, kunci dan layanan lainnya. Mereka yang ingin melihat bagaimana penyandian berfungsi dapat mencoba dekoder online di
sini .
Ngomong-ngomong, itu terjadi bahwa meskipun kita menerima sinyal LoRaWAN menggunakan SDR, tanpa kehadiran kunci enkripsi (salah satunya disimpan di server penyedia), kita masih tidak mengenali isi paket.
Kesimpulan
Seperti yang Anda lihat, decoding LoRa menggunakan SDR sangat mungkin. Tentu saja, membuat gateway nyata berdasarkan SDR hampir tidak dianjurkan - sensitivitasnya akan lebih buruk daripada sensitivitas modem "nyata", yang dirancang khusus untuk menerima sinyal lemah, dan memiliki lebih banyak band filter sempit dan LNA. Tetapi untuk pengujian atau penelitian, ini bisa sangat menarik.
Bagi mereka yang ingin mencobanya sendiri, file grc sumber GNU Radio berada di bawah spoiler.
accept1.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>
accept2.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>
Semua percobaan berhasil.