저는 라즈베리 사용이 처음이고 칠리파이 키오스크를 사용하여 라즈베리 파이에서 키오스크를 개발 중입니다. 아이디어는 Raspberry Pi가 부팅되면 Chromium 브라우저가 Apache 서버(localhost)의 페이지에서 시작된다는 것입니다. 다음 구성(.xsession)을 사용하여 이를 달성합니다.
#!/bin/bash
## Establece la variable de entorno DISPLAY para que los programas X11 sepan dónde mostrar su interfaz gráfica. En este caso, :0.0 indica que el servidor de visualización X11 local está en la pantalla 0.
export DISPLAY=:0.0
# Start cursor at the top-left corner, as opposed to the default of dead-center
# (so it doesn't accidentally trigger hover styles on elements on the page)
xdotool mousemove 0 0
# Set some useful X preferences
xset s off # don't activate screensaver
xset -dpms # disable DPMS (Energy Star) features.
xset s noblank # don't blank the video device
# Set X screen background: Unicornio
sudo nitrogen --set-centered background.png
# Hide cursor afer 5 seconds of inactivity
unclutter -idle 5 -root &
# Make sure Chromium profile is marked clean, even if it crashed
# Verifica si el archivo de preferencias de chromium existe: .config/chromium/Default/
if [ -f .config/chromium/Default/Preferences ]; then
# Existe: cat .config/chromium/Default/Preferences (en la .5 existe este archivo)
# jq procesa el json de preferencias y se cambian exit_type y exited_cleanly
# Se redirige la salida del comando jq a .config/chromium/Default/Preferences-clean
cat .config/chromium/Default/Preferences \
| jq '.profile.exit_type = "SessionEnded" | .profile.exited_cleanly = true' \
> .config/chromium/Default/Preferences-clean
# Se renombra el archivo eliminando la extension -clean del nombre del archivo
mv .config/chromium/Default/Preferences{-clean,}
fi
# Remove notes of previous sessions, if any
# Busca y elimina cualquier archivo dentro del directorio .config/chromium/ cuyo nombre comience con "Last
find .config/chromium/ -name "Last *" -exec rm {} +
# Get URL from file (if set)
URL=""
# no parece que exista en .5: /boot/chilipie_url.txt
if [ -f /boot/chilipie_url.txt ]; then
URL="$(head -n 1 /boot/chilipie_url.txt)"
elif [ -f /home/pi/chilipie_url.txt ]; then
# Extrae la primera linea
URL="$(head -n 1 /home/pi/chilipie_url.txt)"
fi
if [ -n "$URL" ]; then
# URL no vacia: Obtiene el numero de serie de la raspberry pi
SERIAL="$(cat /proc/cpuinfo | grep Serial | cut -d ' ' -f 2 | xargs)" # Get serial number
# Reemplaza la variable SERIAL en la URL (si está presente) con el número de serie del dispositivo: http://example.com/?serial=$SERIAL deberia cambiar por http://example.com/?serial=10000000f9f937b8
URL="$(echo $URL | SERIAL=$SERIAL envsubst '$SERIAL')"
fi
# Start and detach Chromium
# http://peter.sh/experiments/chromium-command-line-switches/
# Note that under matchbox, starting in full-screen without a window size doesn't behave well when you try to exit full screen (see https://unix.stackexchange.com/q/273989)
chromium-browser \
--start-fullscreen \
--window-position=9000,9000 \
--disable-infobars \
--kiosk\
--overscroll-history-navigation=0 \
--check-for-update-interval=1 --simulate-critical-update \ $URL &
# See https://github.com/futurice/chilipie-kiosk/issues/99#issuecomment-597119842 for
# the need for the fishy-sounding "--check-for-update-interval=1
# --simulate-critical-update" switches; TODO: remove when not needed
# Hide Chromium while it's starting/loading the page
wid=`xdotool search --sync --onlyvisible --class chromium`
xdotool windowunmap $wid
sleep 10 # give the web page time to load
xdotool windowmap $wid
# Finally, switch process to our window manager
exec matchbox-window-manager -use_titlebar no
지금까지는 잘 작동하는 것 같습니다.
실행 시 표시된 로컬 웹사이트를 변경하고 google.es를 표시하려는 Java 코드가 있습니다.
String url = "https://www.google.com/?hl=es";
// Comando para abrir Chromium en modo kiosco con la URL de Google
String command = "chromium-browser --start-fullscreen --kiosk --new-window --no-sandbox " + url;
// Ejecutar el comando en el sistema operativo
Process process = Runtime.getRuntime().exec(command);
LogManager.getInstance().println(LogManager.INFO, "intenta ejecutar la llamada a google.es");
// Capturar la salida de Chromium
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
// Capturar la salida de error de Chromium
InputStream errorStream = process.getErrorStream();
BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));
String line = "";
while ((line = reader.readLine()) != null) {
LogManager.getInstance().println(LogManager.INFO, "Salida estándar: " + line);
}
while ((line = errorReader.readLine()) != null) {
LogManager.getInstance().println(LogManager.ERROR, "Salida de error: " + line);
}
그러나 항상 오류가 발생합니다.
[2099:2099:0322/164415.631324:ERROR:ozone_platform_x11.cc(243)] Missing X server or $DISPLAY
03/22/2024 16:44:15 --> ERROR: [2099:2099:0322/164415.631658:ERROR:env.cc(257)] The platform failed to initialize. Exiting.
사용자 pi를 사용하여 SSH를 통해 라즈베리 파이에 연결하고 있습니다. /etc/environment를 수정하고 DISPLAY=:0을 추가했습니다. /etc/environment.d/90qt-a11y.conf에서도 수행했습니다.
존재하다/etc/X11/Xwrapper.configallowed_users=anybody로 설정했습니다.
내가 달리면주인나는 가지고있다:
access control enabled, only authorized clients can connect
YES:localuser:pi
내 무지로 인해 모든 것이 괜찮아 보입니다.
누군가 이 오류를 해결하도록 도와주세요.