Ici, on va expliquer comment utiliser les interfaces de configuration du wifi dans Pegasus et comment cela fonctionne finalement en interne.
Les paramètres pour le wifi
A ce jour on utilise les bases de recalbox et donc on retrouve les paramètres historiques dans le recalbox.conf (/recalbox/share/system/recalbox.conf) et plus particulièrement dans la section NETWORK:
(en gras sont ceux que l’on paramètre à ce jour dans Pegasus)
Attention: la partie en rouge semble « depreacated » parce que la clé reste en clair dans le fichier à ce jour, et rien ne semble l’utiliser dans les scripts, ni les caractères « échappés ».
# ------------ B - Network ------------ #
## Set system hostname
system.hostname=RECALBOX
## Activate wifi (0,1)
wifi.enabled=1
## Set wifi region
## More info here: https://wiki.recalbox.com/en/tutorials/network/wifi/wifi-country-code
wifi.region=JP
## Wifi SSID (string)
;wifi.ssid=new ssid
## Wifi KEY (string)
## after rebooting the recalbox, the "new key" is replace by a hidden value "enc:xxxxx"
## you can edit the "enc:xxxxx" value to replace by a clear value, it will be updated again at the following reboot
## Escape your special chars (# ; $) with a backslash : $ => \$
;wifi.key=ppppppppppppppppppppppppppppppppppppppppppppppppppppppp
## Wifi - static IP
## if you want a static IP address, you must set all 4 values (ip, netmask, gateway and nameservers)
## if any value is missing or all lines are commented out, it will fall back to the
## default of DHCP. For nameservers, you must set at least 1 nameserver.
;wifi.ip=manual ip address (ex: 192.168.1.2)
;wifi.netmask=network mask (ex: 255.255.255.0)
;wifi.gateway=ip address of gateway (ex: 192.168.1.1)
;wifi.nameservers=ip address of domain name servers, space separated (ex: 192.168.1.1 8.8.8.8)
# secondary wifi (not configurable via the user interface)
;wifi2.ssid=new ssid
;wifi2.key=new key
# third wifi (not configurable via the user interface)
;wifi3.ssid=new ssid
;wifi3.key=new key
Dans Pegasus
En fait le paramétrage pour le wifi se trouve dans la partie du menu de Pegasus appelé « Settings » :
Puis ensuite, dans la partie « Networks » :
Où on retrouve la connectivité pour la partie filaire mais aussi wifi. On a une vue rapide sur la connectivité actuelle et ses IPs.
On peut décider, d’arrêter ou démarrer la partie wifi (si un wifi est déjà configuré et disponible, l’IP/nom du wifi pourra s’afficher après quelques secondes directement dans ce menu).
Pour info, les IPs Wifi et Ethernet sont aussi affichables dans le menu « System information » :
Et on peut aller configurer le wifi via le menu « Wifi Networks » :
Ici on peut voir les wifi disponibles et certaines caractéristiques comme :
La fréquence via une icone qui s’affiche:
Type de réseau Wifi | Icone correspondante |
---|---|
Pour les réseaux Wifi 5Ghz | |
Pour les réseaux Wifi 2Ghz |
La puissance du signal via la signalétique suivante:
Atténuation du réseau Wifi en db | Etat considéré | Icone correspondante |
---|---|---|
>= -45 | Perfect | |
>= -55 | Excellent | |
>= -65 | Good | |
>= -80 | Minimum | |
< -80 | Unknown/Unstable |
Le SSID/Nom du wifi:
Les capacités/détails du wifi en question :
Ainsi que sont adresse mac qui va nous permettre de connaitre la marque de celui ci (si on a déjà du réseau de disponible, via le filaire par exemple ou après une première connexion réussie en wifi) :
Ensuite pour se connecter, on a le bouton « Connect ? » pour cela :
Une dialog box est donc proposé pour gérer les paramètre lié à la configuration de la connexion Wifi:
Le SSID ne sera pas modifiable (pour le moment, que les connections Wifi où le SSID est visible et est possible)
On pourra saisir la clé qui sera visible pendant la saisie et le clavier virtuel sera proposé si activé :
On aura aussi la possibilité de modifier la priorité mais seulement en priorité 1, on pourra se connecter directement via l’interface de pegasus :
Sinon, le bouton connect sera barré et pas selectionnable, parce que les priorités 2 & 3 ne sont pas pris en compte si la priorité 1 est active donc pas sur que l’on puisse si connecté (priorité possible de 1 à 3) :
C’est pour cela aussi que l’on propose de pouvoir sauvegarder simplement une configuration dans ce cas.
Remarque: Bien sur en priorité 1 et si on essai de se connecter, la configuration sera sauvegardé automatiquement
Quand on se connecte, cela peut prendre plusieurs secondes (max 15 secondes):
Si on est connecté, une icone supplémentaire s’affiche sur la connexion wifi concernée et le bouton devient « Connected » mais permet toujours de modifier ces paramètres :
Et dans l’OS, comment cela marche ?
Il y a un script (/etc/init.d/S09wifi) qui va agir comment un service au démarrage et que l’on pourra redémarrer ou arrêter si on ne veut pas utiliser le wifi par exemple :
#!/bin/bash
interface=wlan0
config_file=/recalbox/share/system/recalbox.conf
config_file_boot=/boot/recalbox-backup.conf
wpa_file=/etc/wpa_supplicant.conf
INIT_SCRIPT=$(basename "$0")
system_setting="recalbox_settings"
# if /recalbox/share is not yet mounted
if ! [ -f "$config_file" ]; then
# use the boot version of the file
config_file="$config_file_boot"
fi
mask2cidr() {
nbits=0
IFS=.
for dec in $1 ; do
case $dec in
255) let nbits+=8;;
254) let nbits+=7;;
252) let nbits+=6;;
248) let nbits+=5;;
240) let nbits+=4;;
224) let nbits+=3;;
192) let nbits+=2;;
128) let nbits+=1;;
0);;
*) echo "Error: $dec is not recognised"; exit 1
esac
done
echo "$nbits"
}
# Function to create wifi profiles based on user settings
rb_wifi_configure() {
[ "$1" = "1" ] && X="" || X="$1"
settings_ssid=$("$system_setting" -command load -key "wifi${X}.ssid" -source "$config_file")
settings_key=$("$system_setting" -command load -key "wifi${X}.key" -source "$config_file")
settings_ip=$("$system_setting" -command load -key "wifi${X}.ip" -source "$config_file")
settings_gateway=$("$system_setting" -command load -key "wifi${X}.gateway" -source "$config_file")
settings_netmask=$("$system_setting" -command load -key "wifi${X}.netmask" -source "$config_file")
settings_nameservers=$("$system_setting" -command load -key "wifi${X}.nameservers" -source "$config_file")
# setup wpa_supplicant network
if [[ "$settings_ssid" != "" ]] ;then
recallog -s "${INIT_SCRIPT}" -t "WIFI" "Configuring wifi for SSID: $settings_ssid"
network=`wpa_cli -i ${interface} add_network`
wpa_cli -i "$interface" set_network "$network" ssid "\"$settings_ssid\"" || exit 1
if [ -n "$settings_key" ]; then
# Connect to protected wifi
wpa_cli -i "$interface" set_network "$network" psk "\"$settings_key\"" || exit 1
wpa_cli -i "$interface" set_network "$network" key_mgmt WPA-PSK WPA-EAP WPA-PSK-SHA256 NONE SAE || exit 1
else
# Connect to open ssid
wpa_cli -i "$interface" set_network "$network" key_mgmt NONE || exit 1
fi
wpa_cli -i "$interface" set_network "$network" scan_ssid 1 || exit 1
wpa_cli -i "$interface" enable_network "$network" || exit 1
# static ip configuration in dhcpcd.conf
sed -i "/\b\($interface\|static\)\b/d" /etc/dhcpcd.conf
if [[ "$settings_ip" != "" ]] && \
[[ "$settings_gateway" != "" ]] && \
[[ "$settings_netmask" != "" ]] && \
[[ "$settings_nameservers" != "" ]]; then
recallog -s "${INIT_SCRIPT}" -t "WIFI" "static ip configuration"
settings_netmask=$(mask2cidr $settings_netmask)
recallog -s "${INIT_SCRIPT}" -t "WIFI" "static ip_address=$settings_ip/$settings_netmask"
recallog -s "${INIT_SCRIPT}" -t "WIFI" "static routers=$settings_gateway"
recallog -s "${INIT_SCRIPT}" -t "WIFI" "static domain_name_servers=$settings_nameservers"
echo "interface $interface" >> /etc/dhcpcd.conf
echo "static ip_address=$settings_ip/$settings_netmask" >> /etc/dhcpcd.conf
echo "static routers=$settings_gateway" >> /etc/dhcpcd.conf
echo "static domain_name_servers=$settings_nameservers" >> /etc/dhcpcd.conf
fi
fi
}
# function to drop all of the wpa_suppliment networks
wpa_drop_all_networks() {
# limit any infinite loop to 10 max
for i in {1..10}; do
# get the last network id
netid=`wpa_cli -i $interface list_networks | tail -n1`
netid=$(echo $netid | tr " " "\n")
# exit at the header record
if [[ $netid == network* ]]; then
break
fi
# remove network id
wpa_cli -i "$interface" remove_network "$netid" || exit 1
done
}
enable_wifi() {
# enable interface
ifconfig "$interface" up
# start wpa_supplicant
pid=$(pgrep wpa_supplicant)
while kill -0 $pid 2> /dev/null; do sleep 0.2; done; # Prevent race conditions
{
recallog -s "${INIT_SCRIPT}" -t "WIFI" "Try with default driver"
wpa_supplicant -B -i "$interface" -c "$wpa_file"
} || {
recallog -s "${INIT_SCRIPT}" -t "WIFI" "Wifi: retry with old driver"
wpa_supplicant -B -i "$interface" -c "$wpa_file" -Dwext
}
# clear wpa_supplicant configuration and rebuild
wpa_drop_all_networks
wpa_cli -i "$interface" set update_config 1
settings_region=$("$system_setting" -command load -key "wifi.region" -source "$config_file")
wpa_cli -i "$interface" set country "$settings_region"
# iterate through all network ...
for i in {1..3}; do
rb_wifi_configure $i
done
# write wpa_supplicant configuration
wpa_cli -i "$interface" save_config
}
start() {
# turn on rf signals
if [ -c /dev/rfkill ]; then
rfkill unblock all
fi
if [ -f "$config_file" ]; then
if [ "$("$system_setting" -command load -key "wifi.enabled" -source "$config_file")" -ne 0 ]; then
recallog -s "${INIT_SCRIPT}" -t "WIFI" "Wifi option enabled, trying to configure"
#sleep 2 # wait a bit to be sure tmpfs is initialized
mount -o remount,rw /
enable_wifi
mount -o remount,ro /
else
recallog -s "${INIT_SCRIPT}" -t "WIFI" "Wifi option disabled"
stop
fi
else
recallog -s "${INIT_SCRIPT}" -t "WIFI" "${config_file} not found"
fi
}
stop() {
# stop wpa_supplicant
killall -q wpa_supplicant
# disable interface
ifconfig "$interface" down
}
# Main
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo "Usage $0 {start|stop|restart}"
exit 1
esac
exit $?
Ce script va donc lire le recalbox.conf est va toujours essayer de se connecter en prenant dans l’ordre de priorité des wifi enregistrés. C’est pour cela que Pegasus est fait ainsi pour le moment et que les possibilités sont finalement limités mais suffisantes pour 95% des cas. On supporte les points d’accès wifi visibles et sécurisés pour le moment.
On verra par la suite pour rajouter le WPS, les accès points wifi ouvert ou caché en fonction de la demande de chacun.
Enjoy !!!