1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-02-13 13:41:54 +00:00

miracle-wfdctl-demo: cleanup before exit

This commit is contained in:
Derek Dai 2017-02-12 13:09:04 +08:00
parent 63b5482681
commit e70a976614
No known key found for this signature in database
GPG key ID: E109CC97553EF009

View file

@ -1,7 +1,8 @@
#!/bin/bash #!/bin/bash
PS4="> ${0##*/}: " PS4="\e[34m> ${0##*/}:\e[0m "
set -x set -x
set -e set -e
trap cleanup EXIT
if (( $# < 1 )); then if (( $# < 1 )); then
echo Usage: ${0##*/} link-index peer-p2p-mac echo Usage: ${0##*/} link-index peer-p2p-mac
@ -14,6 +15,12 @@ if [[ ${#2} != 17 ]]; then
exit 1 exit 1
fi fi
# since this wfd subelement is used for device info, so no wfd subelemnt
# id needed (eg. 000600101b4400c8 vs 00000600101b4400c8)
wfd_subelems=000600101c4400c8
link_index="_3${1:0:1}${1:1}"
peer_id="${2//:/_3a}_40$1"
# $1: service # $1: service
# $2: object # $2: object
# $3: interface # $3: interface
@ -23,9 +30,9 @@ wait_prop_change()
{ {
for ((i=0; i<60; i++)); do for ((i=0; i<60; i++)); do
read -a cols < <(busctl get-property "${@:1:4}") read -a cols < <(busctl get-property "${@:1:4}")
if [[ s == "${cols[0]}" ]]; then case ${cols[0]} in
cols[1]="${cols[1]:1:${#cols[1]}-2}" s | o) cols[1]="${cols[1]:1:${#cols[1]}-2}" ;;
fi esac
if [[ "$5" == "${cols[1]}" ]]; then if [[ "$5" == "${cols[1]}" ]]; then
return 0 return 0
fi fi
@ -56,9 +63,11 @@ wait_object()
# $...: arguments # $...: arguments
invoke() invoke()
{ {
set +x
wait_object "${@:1:4}" wait_object "${@:1:4}"
busctl call "${@:1:3}" "${@:6}" busctl call "${@:1:3}" "${@:6}"
wait_prop_change "${@:1:5}" wait_prop_change "${@:1:5}"
set -x
} }
# $1: service # $1: service
@ -69,13 +78,61 @@ invoke()
# $6: property values # $6: property values
set_prop() set_prop()
{ {
set +x
busctl set-property "$@" busctl set-property "$@"
wait_prop_change "${@:1:4}" "${@:6:1}" wait_prop_change "${@:1:4}" "${@:6:1}"
set -x
} }
link_index="_3${1:0:1}${1:1}" # $1: service
p2p_mac="${2//:/_3a}_40$1" # $2: object
wfd_subelems=00000600101c4400c8 # $3: interface
# $4: member
# $5: variable name
get_prop()
{
read -a l < <(busctl get-property "${@:1:4}")
eval $5=\"${l[1]}\"
}
cleanup()
{
kill 0
set -x
for (( i=${#cleanup[@]}-1; i>=0; --i )); do
eval ${cleanup[$i]} || true
done
}
cleanup_push()
{
cleanup+=("$*")
}
link_unmanage()
{
set_prop org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/link/$link_index \
org.freedesktop.miracle.wifi.Link \
Managed b false
}
link_stop_p2pscan()
{
set_prop org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/link/$link_index \
org.freedesktop.miracle.wifi.Link \
P2PScanning b false
}
peer_disconnect()
{
invoke org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/peer/$peer_id \
org.freedesktop.miracle.wifi.Peer \
Connected false \
Disconnect
}
killall miracle-wifid &>/dev/null || true killall miracle-wifid &>/dev/null || true
killall miracle-wfwctl &>/dev/null || true killall miracle-wfwctl &>/dev/null || true
@ -88,6 +145,7 @@ set_prop org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/link/$link_index \ /org/freedesktop/miracle/wifi/link/$link_index \
org.freedesktop.miracle.wifi.Link \ org.freedesktop.miracle.wifi.Link \
Managed b true Managed b true
cleanup_push link_unmanage
set_prop org.freedesktop.miracle.wifi \ set_prop org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/link/$link_index \ /org/freedesktop/miracle/wifi/link/$link_index \
org.freedesktop.miracle.wifi.Link \ org.freedesktop.miracle.wifi.Link \
@ -95,19 +153,33 @@ set_prop org.freedesktop.miracle.wifi \
# this one is tricky, we wait for wpa_supplicant fully started then start # this one is tricky, we wait for wpa_supplicant fully started then start
# P2P scaning, or "Invalid argument" will return # P2P scaning, or "Invalid argument" will return
sleep 0.5 sleep 0.5
echo wait for peer...
set_prop org.freedesktop.miracle.wifi \ set_prop org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/link/$link_index \ /org/freedesktop/miracle/wifi/link/$link_index \
org.freedesktop.miracle.wifi.Link \ org.freedesktop.miracle.wifi.Link \
P2PScanning b true P2PScanning b true
cleanup_push link_stop_p2pscan
echo connect to peer...
invoke org.freedesktop.miracle.wifi \ invoke org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/peer/$p2p_mac \ /org/freedesktop/miracle/wifi/peer/$peer_id \
org.freedesktop.miracle.wifi.Peer \ org.freedesktop.miracle.wifi.Peer \
Connected true \ Connected true \
Connect ss auto '' Connect ss auto ''
cleanup_push peer_disconnect
get_prop org.freedesktop.miracle.wifi \
/org/freedesktop/miracle/wifi/peer/$peer_id \
org.freedesktop.miracle.wifi.Peer \
Interface p2p_iface
tcpdump -nnvvXS -s 0 -i $p2p_iface port 7236 or port 67 or port 68 &
while ! killall -0 miracle-wfdctl && [[ -z "$nocheck" ]] &>/dev/null; do
echo please run miracle-wfdctl manually
sleep 3
done
echo starting WFD session...
invoke org.freedesktop.miracle.wfd \ invoke org.freedesktop.miracle.wfd \
/org/freedesktop/miracle/wfd/sink/$p2p_mac \ /org/freedesktop/miracle/wfd/sink/$peer_id \
org.freedesktop.miracle.wfd.Sink \ org.freedesktop.miracle.wfd.Sink \
Started true \ Peer /org/freedesktop/miracle/wifi/peer/$peer_id \
StartSession StartSession
exec busctl monitor org.freedesktop.miracle.wfd wait