
These SPDX license identifiers are deprecated ([1]). Update them. [1] https://spdx.org/licenses/ sed \ -e '1 s%^/\* SPDX-License-Identifier: \(GPL-2.0\|LGPL-2.1\)+ \*/$%/* SPDX-License-Identifier: \1-or-later */%' \ -e '1,2 s%^\(--\|#\|//\) SPDX-License-Identifier: \(GPL-2.0\|LGPL-2.1\)+$%\1 SPDX-License-Identifier: \2-or-later%' \ -i \ $(git grep -l SPDX-License-Identifier -- \ ':(exclude)shared/c-*/' \ ':(exclude)shared/n-*/' \ ':(exclude)shared/systemd/src' \ ':(exclude)src/systemd/src')
118 lines
3.2 KiB
Python
Executable File
118 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
#
|
|
# Copyright (C) 2020 Red Hat, Inc.
|
|
|
|
# This example performs a scan of Wi-Fi P2P peers and connects to one
|
|
# of them.
|
|
|
|
import sys
|
|
import uuid
|
|
import gi
|
|
|
|
gi.require_version("NM", "1.0")
|
|
from gi.repository import GLib, NM
|
|
|
|
main_loop = None
|
|
client = None
|
|
|
|
|
|
def create_profile(name, peer_mac):
|
|
profile = NM.SimpleConnection.new()
|
|
|
|
s_con = NM.SettingConnection.new()
|
|
s_con.set_property(NM.SETTING_CONNECTION_ID, name)
|
|
s_con.set_property(NM.SETTING_CONNECTION_UUID, str(uuid.uuid4()))
|
|
s_con.set_property(NM.SETTING_CONNECTION_TYPE, "wifi-p2p")
|
|
s_con.set_property(NM.SETTING_CONNECTION_AUTOCONNECT, False)
|
|
|
|
s_ip4 = NM.SettingIP4Config.new()
|
|
s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
|
|
|
|
s_ip6 = NM.SettingIP6Config.new()
|
|
s_ip6.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
|
|
|
|
s_wifi_p2p = NM.SettingWifiP2P.new()
|
|
s_wifi_p2p.set_property(NM.SETTING_WIFI_P2P_PEER, peer_mac)
|
|
s_wifi_p2p.set_property(
|
|
NM.SETTING_WIFI_P2P_WFD_IES,
|
|
GLib.Bytes.new(b"\x00\x00\x06\x00\x90\x1c\x44\x00\xc8"),
|
|
)
|
|
|
|
profile.add_setting(s_con)
|
|
profile.add_setting(s_ip4)
|
|
profile.add_setting(s_ip6)
|
|
profile.add_setting(s_wifi_p2p)
|
|
|
|
return profile
|
|
|
|
|
|
def activated_cb(client, result, data):
|
|
try:
|
|
client.add_and_activate_connection2_finish(result)
|
|
print(" * Connection profile activated successfully")
|
|
except Exception as e:
|
|
sys.stderr.write("Error: %s\n" % e)
|
|
main_loop.quit()
|
|
|
|
|
|
def scan_timeout_cb(device):
|
|
peers = device.get_peers()
|
|
if len(peers) == 0:
|
|
main_loop.quit()
|
|
sys.exit("No peer found")
|
|
|
|
print("\n {:20} {:30} {:3} {:30}".format("MAC", "Name", "Sig", "Wfd-IEs"))
|
|
for p in peers:
|
|
if p.get_wfd_ies() is not None:
|
|
ies = p.get_wfd_ies().get_data().hex()
|
|
else:
|
|
ies = ""
|
|
print(
|
|
" {:20} {:30} {:3} {:30}".format(
|
|
p.get_hw_address(), p.get_name(), p.get_strength(), ies
|
|
)
|
|
)
|
|
print("")
|
|
|
|
# Connect to first peer
|
|
profile = create_profile("P2P-connection", peers[0].get_hw_address())
|
|
client.add_and_activate_connection2(
|
|
profile, device, "/", GLib.Variant("a{sv}", {}), None, activated_cb, None
|
|
)
|
|
print(
|
|
" * Connecting to peer {} using profile '{}'".format(
|
|
peers[0].get_hw_address(), profile.get_id()
|
|
)
|
|
)
|
|
|
|
|
|
def start_find_cb(device, async_result, user_data):
|
|
try:
|
|
device.start_find_finish(async_result)
|
|
except Exception as e:
|
|
sys.stderr.write("Error: %s\n" % e)
|
|
main_loop.quit()
|
|
|
|
print(" * Scanning on device {}...".format(device.get_iface()))
|
|
GLib.timeout_add(10000, scan_timeout_cb, device)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
client = NM.Client.new(None)
|
|
device = None
|
|
|
|
devices = client.get_devices()
|
|
for d in devices:
|
|
if d.get_device_type() == NM.DeviceType.WIFI_P2P:
|
|
device = d
|
|
break
|
|
|
|
if device is None:
|
|
sys.exit("No Wi-Fi P2P device found")
|
|
|
|
device.start_find(GLib.Variant("a{sv}", {}), None, start_find_cb, None)
|
|
|
|
main_loop = GLib.MainLoop()
|
|
main_loop.run()
|