1

愿意从 kivy 应用程序添加 wifi 连接,我正在使用一个简单的函数来编辑 wpa_supplicant.conf 文件,添加新的网络。

我的函数在那里正确写入了配置,并且似乎与通过 raspbian GUI 添加的配置相同...

但是当我重新启动树莓时,它说没有找到网络接口,但是如果我从 wpa_supplicant.conf 文件中删除最后添加的行,它就会得到解决。由于某些原因,raspbian 在编辑后无法正确读取此文件,但我看不出我在这里做错了什么,这与默认配置不同。

希望有人能给我一些提示......我以sudo运行脚本,所以不可能有任何权限问题,我试图调查我编写配置的方式和raspbian提供的配置的任何差异,但没有线索...

在这里你可以看到代码:

def CreateWifiConfig(SSID, password):
        config = (
                '\nnetwork={{\n' +
                '\tssid="{}"\n' +
                '\tpsk="{}"\n' + '}}').format(SSID, password)
        print(config)
        with open("/etc/wpa_supplicant/wpa_supplicant.conf", "a+") as wifi:
            wifi.write(config)
        wifi.close()
        print("Wifi config added")```
4

3 回答 3

1

这只是一条路过的评论——我没有运行你的代码,我只是根据我正在阅读的内容来解释它——但这里有几件事让我印象深刻:

1)我key_mgmt在您的配置中看不到值。通常是这样,但您可以在这里WPA-PSK看到一些额外的可能值

2)因为您使用的是“with”语句,所以文件应该为您自动关闭(您不需要再次调用close()它)。

3)你构建配置字符串的方式对我来说有点奇怪,像这样的东西怎么样(完全主观,对我来说更具可读性):

def CreateWifiConfig(SSID, password):
  config_lines = [
    '\n',
    'network={',
    '\tssid="{}"'.format(SSID),
    '\tpsk="{}"'.format(password),
    '\tkey_mgmt=WPA-PSK',
    '}'
  ]

  config = '\n'.join(config_lines)
  print(config)

  with open("/etc/wpa_supplicant/wpa_supplicant.conf", "a+") as wifi:
    wifi.write(config)

  print("Wifi config added")

4) 这里要注意的另一件事是,这段代码不是幂等的——你不能在不影响文件内容完整性的情况下多次运行它。您可能已经意识到这一点并且可能并不特别在意,但无论如何都只是指出来。

希望失踪key_mgmt就是一切。

于 2020-04-28T19:16:56.870 回答
0

我尝试使用 Python 脚本重写“wpa_supplicant.conf”文件,但整个 Wi-Fi 系统刚刚崩溃,我必须重新格式化并重新在 SD 卡上重新安装 Raspbian OS。在 SD 卡的引导驱动器中创建新的“wpa_supplicant.conf”文件也不起作用。幸运的是,我找到了使用 Python 脚本连接到新网络的解决方案,但在此之前,您需要先执行这些步骤。

解决方案:不要使用 重写“wpa_supplicant.conf” ,而是从路径with open('/etc/wpa_supplicant/wpa_supplicant.conf', 'w') as file:中重写“interfaces”文件。/etc/network/interfaces

source-directory /etc/network/interfaces.d在“interfaces”文件的行下方添加此代码:

auto wlan0
iface wlan0 inet dhcp
wpa-ssid "WIFI NETWORK NAME HERE"
wpa-psk "WIFI NETWORK PASSWORD HERE"

保存“interfaces”文件并打开“wpa_supplicant.conf”文件。

update_config=1在 和的行ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev之间添加network={...。根据我的观察,这有点忽略了文件的内容,network={...并将其对 Wi-Fi 信息的检索转移到/etc/network/interfaces文件中。

保存文件并重新启动。

重新启动后,您可以在想要更改到新网络时通过执行 Python 脚本来重写/etc/network/interfaces文件(该脚本必须在最后导致系统重新启动才能使新的 Wi-Fi 更改生效)。(我不知道'interfaces'文件是否允许添加多个网络,到目前为止我一次只测试了一个网络,因为这已经实现了我的项目目标。)这是一个Python代码示例来更改“interfaces”文件中的网络信息:

import os
import time

SSID = input('Enter SSID: ')
password = input("Enter password: ")

with open('/etc/network/interfaces', 'w') as file:
    content = \
        '# interfaces(5) file used by ifup(8) and ifdown(8)\n\n' + \
        '# Please note that this file is written to be used with dhcpcd\n' + \
        "# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'\n" + \
        '# Include files from /etc/network/interfaces.d:\n' + \
        'source-directory /etc/network/interfaces.d\n' + \
        'auto wlan0\n' + \
        'iface wlan0 inet dhcp\n' + \
        'wpa-ssid "' + SSID + '"\n' + \
        'wpa-psk "' + password + '"\n'

    file.write(content)

print("Write successful. Rebooting now.")
time.sleep(2)
os.system('sudo reboot now')
于 2021-09-30T14:18:14.867 回答
0

这是我添加或更新 wifi 的解决方案。该json方法中的参数是具有值的字典: {"ssid": "wifi_name", "psk": "password"}。可以轻松修改此脚本以添加id_str或添加priority到网络。

def command_add_wifi(json):
  print("-> Adding wifi")
  
  # Read file WPA suppliant
  networks = []
  with open("/etc/wpa_supplicant/wpa_supplicant.conf", "r") as f:
    in_lines = f.readlines()  

  # Discover networks
  out_lines = []
  networks = []
  i = 0
  isInside = False
  for line in in_lines:
    if "network={" == line.strip().replace(" ", ""):
      networks.append({})
      isInside = True
    elif "}" == line.strip().replace(" ", ""):
      i += 1
      isInside = False
    elif isInside:      
      key_value = line.strip().split("=")
      networks[i][key_value[0]] = key_value[1]
    else:
      out_lines.append(line)

  # Update password or add new
  isFound = False
  for network in networks:
    if network["ssid"] == f"\"{json['ssid']}\"":
      network["psk"] = f"\"{json['psk']}\""
      isFound = True
      break
  if not isFound:
    networks.append({
      'ssid': f"\"{json['ssid']}\"",
      'psk': f"\"{json['psk']}\"",
      'key_mgmt': "WPA-PSK"
    })

  # Generate new WPA Supplicant
  for network in networks:
    out_lines.append("network={\n")
    for key, value in network.items():
      out_lines.append(f"    {key}={value}\n")      
    out_lines.append("}\n\n")

  # Write to WPA Supplicant
  with open('/etc/wpa_supplicant/wpa_supplicant.conf', 'w') as f:
    for line in out_lines:
      f.write(line)

  print("-> Wifi added !")

于 2021-09-07T01:56:33.520 回答