Utworzenie roboczego środowiska dla programów w pythonie
W tym ćwiczeniu należy stworzyć prosty program do obsługi portów GPIO, a następnie skonfigurować serwer "message brokera MQTT" do sterowania GPIO. Ponadto należy utworzyć skrypt startowy dla własnych aplikacji.
Instalacja wirtualnego/lokalnego środowiska python:
- Przejście do katalogu z utworzonym repozytorium git (repozytorium danej grupy laboratoryjnej utworzone np. na git.pg.edu.pl lub github) dla tej części laboratorium:
cd <sciezka_do_katalogu_repozytorium>
- Utworzenie lokalnego środowiska:
virtualenv -p python3.6 virtenv
gdzie: virtenv -to nazwa katalogu, w którym zostanie utworzone lokalne środowisko python
- katalog virtenv należy dodać do pliku .gitignore
touch .gitignore
echo "virtenv" >> .gitignore
git add .gitignore
Aktywacja lokalnego środowiska python:
source virtenv/bin/activate
- Test poprawnej instalacji środowiska lokalnego:
pip -V
Sterowanie diodą LED
Instalacja biblioteki GPIO w lokalnym środowisku python:
pip install gpio
Zapisanie używanych bibliotek w pliku:
pip freeze > requirements.txt
Instalacja wymaganych bibliotek (w przypadku instalacji w nowym środowisku):
pip install -r requirements.txt
Utworzenie skryptu sterującego dioda LED:
#!/usr/bin/env python3.6
import time
import gpio
print( "Test LED@PWM0\n")
gpio.setup(504, gpio.OUT)
while(True):
gpio.set(504, 1)
time.sleep(0.5)
gpio.set(504, 0)
time.sleep(0.5)
Odczyt stanu przycisku:
- gpio.setup(488, gpio.IN)
- gpio.read(488) # I2C0_DATA@GPIO488
- zmiana ustawień poziomu loggera z gpio:
gpio.log.setLevel(logging.INFO)
Zadanie:
- Wyświetlić informacje na terminalu, tyko wtedy gdy zmieni sie stan przycisku (narastające lub opadające zbocze)
- Zaświecić diodę kiedy wykryto narastające zbocze, wygasić diodę gdy wykryto opadające zbocze na przycisku.
Uruchomienie kontenera z MQTT
- Usuniecie starego:
docker rm mosquitto
- Pobranie aktualnego obrazu kontenera:
docker pull eclipse-mosquitto
- Utworzenie nowego z domyślną konfiguracją (porty 1883, 9001):
docker create -p 1883:1883 -p 9001:9001 --name mosquitto eclipse-mosquitto
- Uruchomienie kontenera:
docker start mosquitto
- Sprawdzenie działania:
- Sprawdzenie otwartych portów w systemie
lsof -i | grep 1883
lsof -i | grep 9001
docker ps
- Podłączenie do log'ów dockera:
docker attach mosquitto
- odłączenie do log'ów dockera :
UWAGA: to nie działa w VSC: ^P^Q (hold the Ctrl, press P, press Q, release Ctrl), workaround: lnik
Komunikacja przez MQTT
- Instalacja biblioteki do MQTT w lokalnym środowisku python:
pip install paho-mqtt
- odbiorca wiadomości z MQTT:
import paho.mqtt.client as mqtt
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("led/#")
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost", 1883, 60)
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
- nadawca wiadomości w MQTT:
import paho.mqtt.client as mqtt
import time
flag_connected = 0
def on_connect(client, userdata, flags, rc):
global flag_connected
flag_connected = 1
def on_disconnect(client, userdata, rc):
global flag_connected
flag_connected = 0
client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect("localhost", 1883, 60)
while(True):
if flag_connected == 1:
# Publish message
client.publish("led/504", "1")
time.sleep(1)
client.publish("led/504", "0")
time.sleep(1)
else:
# Wait to reconnect
client.reconnect()
- Zadanie: Należy napisać oprogramowanie wg poniższego schamatu, które za pomocą serwera MQTT bedzie odbierac wiadomości z aplikacji button.py oraz odpowiednio nadwać wiadmosci do aplikacji led.py.
Autostart aplikacji
Cron -scheduler systemowy
- Edycja uruchamianych skryptów:
crontab -e
- Zawartość crontab
SHELL=/bin/bash
@reboot /root/ztb/tmux_script.sh
Skrypt tmux_script.sh
#!/bin/bash
MY_PATH=$(dirname $(realpath -s $0))
# Create a new tmux session named pmk
SESSION_NAME="pmk"
/usr/bin/tmux new-session -d -s $SESSION_NAME}
/usr/bin/tmux set-option -t ${SESSION_NAME} remain-on-exit on
/usr/bin/tmux send-keys -t ${SESSION_NAME} "source /root/.bashrc" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "source /root/.profile" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "date" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "source virtenv/bin/active" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "echo 'tutaj uruchom swoja app1'" C-m
/usr/bin/tmux split-window -t ${SESSION_NAME}
/usr/bin/tmux send-keys -t ${SESSION_NAME} "echo 'tutaj uruchom swoja app2 w drugim panelu'" C-m
- Podłączenie do sesji tmux uruchomionej podczas startu systemu
tmux a
- Skróty tmux:
- podział pionowy okna: CTR+B "
- podział poziomy okna: CTR+B %
- nowe okno: CTR+B c
- następne okno: CTR+B n
- wyjście bez zamykania okna: CTR+B d
- zamknięcie panelu: CTR+d
- zmiana panelu: CTR+b strzalki