Olen labraprojektina rakennellut softaradiota (SDR eli Software Defined Radio) pienellä Raspberry Pi -tietokoneella.
Kuvia laitteistosta
Tavoitteena on rakentaa laite, joka osaa:
- paikantaa itsensä satelliittipaikannuksella (GPS, Glonass, Galileo)
- löytää kuuluvuusalueelta mielenkiintoiset radiosignaalit
- tunnistaa löydetyt signaalit (FM-radio, AM-radio, Wifi, Bluetooth, jne..)
- tunnistaa löydetyistä signaaleista lähettävän radion yksilöivät tiedot
- tallentaa havainnot sijaintitiedon kera kevyttietokantaan (NoSQL, GraphDB)
- nauhoittaa tietyt signaalit tarkempaa analyysiä varten
- esittää havainnot ymmärrettävästi web-selaimeen latautuvalla kartalla
Kunhan saan softan toimimaan, asennan laitteen autooni. Kirjoitan siitä sitten erillisen blogin. Tässä blogissa keskityn laitteiston ja ohjelmiston esittelyyn sekä asennusmuistiinpanoihin, joiden avulla asennuksen voi toistaa.
Laitteisto
Laite | Linkki valmistajan sivuille | Käyttötarkoitus | |||
Raspberry Pi 4 Model B 4 GB | https://www.raspberrypi.org/products/raspberry-pi-4-model-b/ | Signaalinkäsittely | |||
SanDisk Extreme Pro UHS-I microSDXC 64 GB | https://www.sandisk.com/home/memory-cards/microsd-cards/extremepro-microsd | Käyttöjärjestelmän ja ohjelmistojen tallennusmedia | |||
HackRF One | https://greatscottgadgets.com/hackrf/one/ | Radiovastaanotin | |||
LaCie Rugged USB-C 2TB | https://www.lacie.com/gb/en/support/mobile-storage/rugged-usbc/ | Signaalien tallennusmedia |
Ohjelmisto
Laitan taulukkoon vain keskeisimmät ohjelmistot. Asennusohjeesta voi halutessaan koostaa tarkan ohjelmistolistauksen.
Ohjelmisto | Linkki valmistajan sivuille | Käyttötarkoitus |
Raspberry Pi OS 32-bit Lite | https://www.raspberrypi.org/downloads/raspberry-pi-os/ Raspberry Pi OS on mukautettu jakelu Debian-käyttöjärjestelmästä, jonka versio on asennushetkellä Buster. | Käyttöjärjestelmä |
hackrf | https://github.com/mossmann/hackrf/releases/ | HackRF One -ajurit ja apuohjelmat |
gr-osmosdr | https://osmocom.org/projects/gr-osmosdr/wiki | HackRF One -ajurit GNU Radiolle |
cubicsdr | https://cubicsdr.com | Softaradio |
qspectrumanalyzer | https://pypi.org/project/QSpectrumAnalyzer/ | Spektrianalysaattori |
gnss-sdr | https://gnss-sdr.org/ | Satelliittipaikannus |
Asennusohje
Asennusta varten tarvitset wifi-yhteyden, läppärin ja SD-muistikortinlukijan sekä Raspin perusasetusten tekoa varten USB-näppäimistön, micro-HDMI-kaapelin ja näytön, johon kaapelin voi kytkeä.
Käyttöjärjestelmä
Ihan ensimmäiseksi täytyy ladata Raspberry Pi OS muistikortille.
Lataa Raspberry Pi OS (32-bit) asennuspaketti täältä: https://downloads.raspberrypi.org/raspios_lite_armhf_latest Kopioi paketin sisältö muistikortille tämän ohjeen mukaisesti: https://www.raspberrypi.org/documentation/installation/installing-images/README.md
Kun käyttöjärjestelmä on muistikortilla, voi Raspin käynnistää ensimmäistä kertaa perusasetusten tekoa varten.
Kytke Raspi näyttöön HDMI-kaapelilla ja liitä USB-näppäimistö sen USB 2.0 -porttiin. Laita SD-kortti paikoilleen, liitä LaCie USB 3.0 -porttiin ja kytke Raspi virtalähteeseen. Katso näytöltä, että käynnistyy. Kirjaudu sisään: > login: pi > password: raspberry
Tee Raspin perusasetukset. GPU:ta on tarkoitus hyödyntää signaalien käsittelyyn, joten siksi senkin asetuksiin kosketaan.
Aseta SSH-palvelin käynnistymään automaattisesti > sudo su - > echo ssh >/boot/ssh > logout Aseta muut perusasetukset > sudo raspi-config 2 Network Options N2 Wireless LAN Country: FI SSID: <wifin nimi> passphrase: <wifin salasana> N3 Network interface names enable: yes 4 Localisation Options I2 Time Zone Helsinki I3 Keyboard layout Generic 105-key PC (intl.) Finnish Right Alt (AltGr) Left Logo 7 Advanced Options A3 Memory Split GPU Memory: 256 A8 GL Driver G2 GL (Fake GMS) AA Pi 4 Video Output V1 Enable 4kp60 HDMI
Päivitä käyttöjärjestelmän ja Raspin ohjelmistot ajan tasalle.
> sudo apt update > sudo apt upgrade > sudo update-pciids > sudo rpi-update Poista turhat ohjelmistot > sudo apt autoremove Käynnistä Raspi uudelleen > sudo reboot
En kuvaa vaiheita tähän, mutta virittele Raspille vielä wifi-verkkosi DNS-palvelimeen verkkonimi ja DHCP-palvelimeen kiinteä IP-osoite. Aseta sitä ennen Raspin wifille kiinteä MAC-osoite.
> sudo nano -w /etc/NetworkManager/NetworkManager.conf Lisää loppuun seuraava osio [device] wifi.scan-rand-mac-address=no
Irroita USB-näppis ja jatka asennusta läppärillä SSH-yhteyden yli.
> ssh raspberrypi > login: pi > password: raspberry
Asenna graafinen Gnome-työpöytäympäristö, RDP-etätyöpöytäohjelmisto ja web-selain. Lähdekoodeista myöhemmin käännettävä gnuradio-companion toimii vain Gnomella, joten älä asenna muuta työpöytäympäristöä.
> sudo apt install gnome-core > sudo apt install xrdp > sudo apt install firefox-esr
Lisää vielä seuraavat loitsut, ettei Gnome kysele Administrator -salasanoja XRDP:llä kirjauduttaessa.
> sudo -w nano -w /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf polkit.addRule(function(action, subject) { if ((action.id == “org.freedesktop.color-manager.create-device” || action.id == “org.freedesktop.color-manager.create-profile” || action.id == “org.freedesktop.color-manager.delete-device” || action.id == “org.$ { return polkit.Result.YES; } });
Softaradio
Asenna HackRF-ajurit, softaradio ja spektrianalysaattori. Pythonia ja PIP:iä tarvitaan spektrianalysaattorin asentamiseen sekä myöhemmin satelliittipaikannuksen asentamiseen.
> sudo apt install hackrf gr-osmosdr soapysdr-tools soapyremote-server > sudo apt install cubicsdr > sudo apt install python3-pip python3-pyqt5 python3-numpy > sudo pip3 install qspectrumanalyzer
Käynnistä uudelleen.
> sudo reboot
Testaa, että etätyöpöytäyhteys toimii.
Kytke HackRF Raspin USB3.0 -porttiin ja testaa CubicSDR-softaradiolla, että se toimii.
Sammuta softaradio ja testaa vielä, että spektrianalysaattori QSpectrumAnalyzer toimii.
Noin. Nyt Raspi ja HackRF toimivat todistetusti yhdessä. Sammuta spektrianalysaattori. Asennetaan seuraavaksi satelliittipaikannuksen vaatimat softat.
Satelliittipaikannus
Satelliittipaikannussofta gnss-sdr löytyy käyttöjärjestelmäjakelusta, mutta se on liian vanha toimiakseen HackRF:n kanssa oikein. Uusin versio täytyy kääntää lähdekoodeista. Samalla täytyy myös kääntää uusin versio gnuradiosta. Tämä ottaa Raspilla helposti usean tunnin.
Lähdekoodeja päivitetään aika ahkeraan, joten niissä voi olla käännöksen estäviä bugeja, jotka joutuu itse korjaamaan ellei halua odotella, että kehittäjät ne korjaisivat. Tämän ohjeen laadintahetkellä tällä ohjeella saatiin toimiva käännös aikaiseksi. Mikään ei takaa, että sama onnistuisi myöhemmin.
> sudo apt install git > sudo pip3 install git+git://github.com/gnuradio/pybombs.git > sudo pybombs auto-config > sudo pybombs recipes add-defaults
Aktivoi OsmoSDR-tuki.
> sudo nano -w /root/.pybombs/recipes/gr-recipes/gnss-sdr.lwr Lisää tiedoston loppuun rivit vars: config_opt: " -DENABLE_OSMOSDR=ON"
Käynnistä käännös.
> sudo pybombs prefix init /usr/share/gnuradio-latest -a gnuradio-latest -R gnuradio-default Install gnuradio from source despite binary install available Y/[N]? Y
Jos käännös pysähtyy virheeseen UHD-moduulin kohdalla, muokkaa CMakeLists.txt -tiedostoa:
> sudo nano -w /usr/share/gnuradio-latest/src/uhd/host/lib/convert/CMakeLists.txt
Etsi tiedostosta seuraavat rivit:
LIBUHD_APPEND_SOURCES( ${CMAKE_CURRENT_SOURCE_DIR}/convert_with_neon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/convert_neon.S )
Ja lisää niiden jälkeen, riville 83, seuraava:
SET ( CMAKE_CXX_FLAGS "-mfpu=neon" )
Jatka sitten käännöstä.
> sudo pybombs prefix init /usr/share/gnuradio-latest -a gnuradio-latest -R gnuradio-default Continue using this path Y/[N]? Y Alias `gnuradio-latest' already exists, overwrite Y/[N]? Y Install gnuradio from source despite binary install available Y/[N]? Y
Käännä gnss-sdr.
> sudo pybombs -p /usr/share/gnuradio-latest install hackrf soapysdr soapyhackrf libosmocore osmo-sdr gr-fcdproplus gr-soapy gr-osmosdr gnss-sdr Install hackrf from source despite binary install available Y/[N]? Y
Jos käännös pysähtyy ”Unknown argument –parallel 2”, etsi ja poista seuraavista kolmesta tiedostosta –parallel 2 argumentit.
> sudo nano -w /usr/share/gnuradio-latest/src/gnss-sdr/build/CMakeFiles/gflags-2.2.2.dir/build.make > sudo nano -w /usr/share/gnuradio-latest/src/gnss-sdr/build/CMakeFiles/glog-0.4.0.dir/build.make > sudo nano -w /usr/share/gnuradio-latest/src/gnss-sdr/build/CMakeFiles/pugixml-1.10.dir/build.make
Jatka sitten käännöstä.
> sudo pybombs -p /usr/share/gnuradio-latest install hackrf soapysdr soapyhackrf libosmocore osmo-sdr gr-soapy gr-osmosdr gnss-sdr
Käännä vielä kaikkien riippuvaisuudet: kirjastot ja sen sellaiset.
> sudo pybombs -v -p /usr/share/gnuradio-latest fetch --all --deps > sudo pybombs -v -p /usr/share/gnuradio-latest install --update hackrf soapysdr soapyhackrf libosmocore osmo-sdr gnuradio gr-soapy gr-osmosdr gnss-sdr
Käännös ei välttämättä aina näytä edistyvän, vaikka oikeasti paljon tapahtuukin. Käännöksen edistymistä voi seurata terminaaliruudun lisäksi htop-komennolla toisessa ikkunassa.
Muodosta VOLK-profiilit (https://wiki.gnuradio.org/index.php/Volk) ja kopioi ne myös pi -käyttäjälle sekä /etc/skel -hakemistoon.
> sudo pybombs -p /usr/share/gnuradio-latest run volk_profile > sudo pybombs -p /usr/share/gnuradio-latest run volk_gnsssdr_profile > sudo cp -r /root/.volk /home/pi > sudo cp -r /root/.volk /etc/skel > sudo cp -r /root/.volk_gnsssdr /home/pi > sudo cp -r /root/.volk_gnsssdr /etc/skel > sudo chown -R pi:pi /home/pi/.volk*
Aseta gnuradion tarvitsemat ympäristömuuttujat kaikille käyttäjille. Tällä hetkellä gnuradiossa on bugi, joka jotenkin sotkee PYTHONPATH ja LD_LIBRARY_PATH -muuttujat. Nämä täytyy toistaiseksi asettaa käsin.
> sudo ln -s /usr/share/gnuradio-latest/setup_env.sh /etc/profile.d/gnuradio-latest-1.sh > sudo nano -w /etc/profile.d/gnuradio-latest-2.sh export PYTHONPATH=/usr/share/gnuradio-latest/lib/python3/dist-packages:/usr/local/lib/python3.7/dist-packages:/usr/share/gnuradio-latest/lib/python3.7/site-packages > sudo nano -w /etc/ld.so.conf.d/gnuradio-latest.conf usr/share/gnuradio-latest/lib > sudo ldconfig -v
Kirjaudu ulos etätyöpöydältä (Gnome-työpöydältä Log Out) ja sitten takaisin sisään. Kokeile toimiiko gnuradio-companion.
Nyt vielä GPS-asetukset kohdalleen.
> sudo cp /usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_LimeSDR.conf /usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_HackRF.conf > sudo nano -w /usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_HackRF.conf Etsi ja poista seuraavat rivit: ;# LimeSDR RX1 antennas: NONE,LNAH,LNAL,LNAW SignalSource.antenna=LNAW Etsi ja korvaa seuraavat rivit: ;# Next line enables the LimeSDR SignalSource.osmosdr_args=driver=lime,soapy=0 Riveillä: ;# Next line enables the HackRF One SignalSource.osmosdr_args=driver=hackrf,bias=0
Jos kaikki toimii niinkuin pitää, gnss-sdr saa vastaanotettua sijaintitietoja. HackRF:n antenni kannattaa sijoittaa niin, että vaikka ikkunasta on näkyvyys taivaalle.
> cd /tmp > gnss-sdr --config_file=/usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_HackRF.conf
Softien päivittäminen
Kannattaa määrävälein päivittää käyttöjärjestelmä ja koko softapaketti. Varaudu siihen, että päivittäminen kestää useita tunteja.
> sudo apt update > sudo apt upgrade > sudo apt full-upgrade > sudo update-pciids > sudo rpi-update > sudo pip3 install --upgrade qspectrumanalyzer
Lähdekoodeista päivittäminen on pirullista hommaa, mutta kannattaa sekin määrävälein tehdä. Joudut todennäköisesti tekemään samoja bugifiksejä, kuin tuolla aiemmin, ehkä jopa korjaamaan uusiakin bugeja.
> sudo pybombs -v -p /usr/share/gnuradio-latest fetch --all --deps Jos pysähtyy, niin korjaa bugit ja jatka päivitystä: > sudo pybombs -v -p /usr/share/gnuradio-latest fetch --all --deps > sudo pybombs -v -p /usr/share/gnuradio-latest install --update hackrf soapysdr soapyhackrf libosmocore osmo-sdr gnuradio gr-soapy gr-osmosdr gnss-sdr Jos pysähtyy, niin korjaa bugit ja jatka päivitystä: > sudo pybombs -v -p /usr/share/gnuradio-latest install --update hackrf soapysdr soapyhackrf libosmocore osmo-sdr gnuradio gr-soapy gr-osmosdr gnss-sdr
Käynnistä lopuksi Raspi uudestaan.
> sudo reboot