Detta VS Code projekt använder en Dev Container med byggverktyg för Yocto. För att ladda ner Yocto och allt som behövs används git verktyget repo. Repo använder ett manifest som beskriver git repon som ska hämtas.
I detta project hämtas:
- poky: Grundläggande mall för Linux skapade med Yocto
- OpenEmbedded: meta_openembedded, Byggsystemet för Yocto, ungefär som West är för Zephyr OS.
- RaspberryPi: meta_raspberrupy, Hårdvarulager för RPI enheter
Yocto använder lager och detta project har meta-lager.
Kör endast detta steg första gången.
Öppna bash i dev-containern och kör dessa kommandon rad för rad:
# Gå till yocto mappen
cd /yocto
# Använd repo för att lägga till git dependancies från manifestet
repo init -u /yocto/project -m /yocto/project/default.xml
# Ladda ner git dependancies
repo sync
Detta steg måste göras varje gång man öppnar en ny terminal.
# Starta byggmiljön
source /yocto/sources/poky/oe-init-build-env /yocto/project
Detta tar långt tid. Bitbake cachar bra så det gåt att avbryta med ctrl+c.
# Bygg en minimal Linux med Bitbake
bitbake -k core-image-minimal
QEMU finns med i Yocto: runqemu
nographic argumentent gör att qemu körs direkt i terminalen. För att avsluta tryck Ctrl + A följt av X. Alternativt Ctrl + A och C för att köra kommandot quit.
Utan nographic kan man öppna /dev/ttyS1 med Ctrl + Alt 2 på samma sätt som om man skulle ha anslutit via serie port: YouTube.
Lösenordet vid inloggning är root
# Kör bygget emulerat med Qemu
runqemu qemux86-64 nographic
Enligt: meta-raspberrypi
# Bygg för rpi5 64bit
MACHINE=raspberrypi5 bitbake -k core-image-baseFör att skriva till ett sdkort:
- Skaffa programmet BalenaEtcher
- Spara image från /yocto/tmp/deploy/images/raspberrypi5/core-image-base-raspberrypi5.rootfs.wic.bz2
- Använd balenaEtcher för att skriva imagen till ett SDKort
Receptet hello-world läggs till custom-distro och byggs när DISTRO=custom-distro.
Receptet har två filer:
- hello-world.c som är ett hello world program i c.
- hello-world.service som kör c programmet en gång vid uppstart.
I QEMU eller på en RPI kan du köra programmet:
# Kör programmet
hello-world
# Se information om tjänsten
systemctl status hello-world
# Starta tjänsten igen
systemctl start hell-world
# Se loggen för tjänsten
journalctl -u hello-worldTesta köra menukonfig för att konfigurera kärnan enligt: https://github.com/bluez/bluez/wiki/test%E2%80%90runner
bitbake -c menuconfig virtual/kernel Skapa en egen SystemD som skickar http post anrop till t.ex webhook.site eller annan webhook testsida. Vill du använda någon mer avanserad tjänst för att koppla upp enheten t.ex. Leshan eller en MQTT broker direkt i docker-compose.yml så går det också utmärkt.
Skapa projekt på github med receptet och skicka in adressen som inlämning.
Kopiera receptet hello-world till hello-internet
Ta bort c programmet hello-world och ändra systemD tjänsten så den heter hello-internet.service och postar data direkt med wget.
Bygg yocto igen för att få med BlueZ stacken och kernel konfigurationen för att köra bluetooth.
Kör scripter rad för rad. Kopiera inte hela script.
Det finns två alternativ för att köra detta.
Funkar inte detta så ladda ner en imagefil från Nackadmin och kör Alternativ 2.
# Bygg för custom-distro om det inte redan är satt i konfigurationen
DISTRO=custom-distro bitbake -k core-image-baseKör igång med egen image
# Kör qemu
runqemu qemux86-64 nographicLadda ner image och packa up i projektets mapp.
# Kör qemu med imagen
runqemu qemux86-64 nographic /yocto/project/core-image-base-qemux86-64.rootfs.ext4Du ska nu vara inne i QEMU emulatorn. Lösenord för inloggning är root.
För att avsluta QEMU tryck först CTRL + A sen X eller Forsätt med nästa steg.
Du ska nu vara inne i QEMU emulatorn efter Steg 1.
Använd systemd:
# Kolla att "bluetooth" körs
systemctl status bluetooth
# Om inte, starta
systemctl start bluetoothForsätt inne i QEMU efter Steg 2. Detta steg gör inget. Det bara kollar att allt fungerar.
# Kika i loggen för systemd tjänsten "bluetooth" med -u
journalctl -u bluetooth
# Kolla även i systemets logg med dmesg
# För att inte visa allt, pipa dmesg till grep med "-i bluetooth"
dmesg | grep -i bluetoothDet bör inte ha funnits några fel i loggarna.
Forsätt inne i QEMU efter Steg 2 eller Steg 3
btvirt startar virtuella bluetoothenheter.
Vi kör med BLE (Bluetooth LE (Low Energy)) som med i Bluetooth 4.
Det finns också Bluetooth classic.
# btvirt är blockande och kommer att köras i "foreground"
btvirt -U2
# Stoppa btvirt processen och flytta den bakgrunden
# Tryck: CTRL + Z
# Kolla att processen finns i bakgrunden
jobs
# Forsätt btvirt processen i bakgrunden
bg
# Kolla att btvirt körs i bakgrunden
jobsDet är även möjligt att starta en process direkt i bakgrunden med t.ex: btvirt -U2 &.
I detta steg ska vi ansluta bluetooth enhterna till varandra. Kör vidare i QEMU
# Starta tmux
tmux
# Dela skärmen i två "panes"
# Tryck CTRL + B and then %
# Kör igång bluetoothCTL consollen
bluetoothctl
# Visa bluetooth enheterna
list
# Notera MAC adressen för enheten som inte är default
# Byt till andra sidan i tmux
# Tryck CTRL + B och sen →
# Öppna bluetoothctl på högra sidan
bluetoothctl
# Välj den andra MAC addressen (byt ut på raden nedan)
select 00:AA:01:00:00:01
# Visa egenskaperna
show
# Hoppa tillbaka till första panelen
# Tryck CTRL + B och sen ←
# Visa egenskaperna i första panelen också
showDu bör nu köra tmux med två paneler som kör bluetoothctl med en default BT controller var.
Fortsätt från steg 5.
Du kommer behöva hoppa mellan panelerna i tmux.
- Starta båda BT enheterna
power on - Starta den ena som discoverable (advertising) med
discoverable on- Detta är peripheral enheten. Den än är even servern.
- Sök efter enheter med den andra:
scan on- Detta är central enheten. Den är även klienten.
- Enheterna hittar varandra. Kan behövas omstart av systemet annars.
- Parkoppla med central enheten. Den som scannade. Kör:
pair(MAC adress) - Verifera parkopplingen. En fråga ska dyka upp.
- Lita på enheten med central enheten:
trust(MAC adress) - Anslut med central till peripheral:
connect(MAC adress)
Här tar tyvärr linux delen av övningen slut då jag inte lyckas få de virtuella btvirt enheterna att ansluta till varandra. Någon som har någon idè varför?
Fortsätt gärna i python med Bleak på egna datorn om möjligt. Testa skapa en peripheral och en central.
Alternativt, hoppa över till Zephyr och Renode och gå igenom denna guide Developing and testing BLE products on nRF52840 in Renode and Zephyr. Använd gärna ZephyrDevContainer som bas för att bygga Zephyr samplen som föreslås i guiden.