所以我有一个树莓派,我已经将它设置为带有 hostapd 和 isc-dhcp-server 的接入点。它广播一个 SSID,我用我的手机或笔记本电脑连接到它,转到 192.168.42.1,它会提供一个页面,其中我有一个用于 SSID、PSK 和设备 ID 的表单。这个想法是,然后它应该通过调用一堆子进程调用来使用我给它的信息连接到网络,事实上,它没有。
这是 index.html:
<html>
<body>
<form enctype="multipart/form-data" action="/cgi-bin/set_wifi.py" method="POST">
ssid: <input type="text" size="70" name="ssid" value=""><br>
pass: <input type="text" size="70" name="pass" value=""><br>
devid: <input type="text" size="70" name="devid" value=""><br>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</form>
</body>
</html>
start_wifi.py 的内容如下:
#!/usr/bin/python
import cgi
import cgitb
import subprocess
cgitb.enable()
print "Content-type: text/html\n\n"
form=cgi.FieldStorage()
ssid_val=form['ssid'].value
pass_val=form['pass'].value
devid=form['devid'].value
#Write Device ID to devid.text
myfile= open("/home/pi/project/devid.txt","w")
myfile.write(form['devid'].value)
myfile.close()
#Write SSID and PSK to wpa_supplicant.conf
file = open('/etc/wpa_supplicant/wpa_supplicant.conf','a')
file.write('\n\nnetwork={\n ssid="')
file.write(ssid_val)
file.write('"\n psk="')
file.write(pass_val)
file.write('"\n}')
file.close()
subprocess.call("sudo service hostapd stop", shell=True)
subprocess.call("sudo service isc-dhcp-server stop",shell=True)
subprocess.call("sudo ifdown wlan0",shell=True)
subprocess.call("sudo /etc/init.d/networking stop",shell=True)
subprocess.call("cp /etc/network/interfaces-manual /etc/network/interfaces",shell=True)
subprocess.call("sudo /etc/init.d/networking start",shell=True)
subprocess.call("sudo ifup wlan0",shell=True)
我有另一个名为 stopapd.py 的 python 脚本,它基本上是上面 set_wifi.py 脚本中 file.close() 之后的所有内容。当我通过终端运行它时,它工作正常。如果网络已经保存在 wpa_supplicant.conf 中,则停止网络、重写接口、重新启动网络并重新建立 wlan0
问题是当 set_wifi.py 通过 cgi 执行时,脚本的前半部分有效,它写入 devid.txt 和 wpa_supplicant.conf,但我认为唯一正常工作的 subproccess.call 是
cp /etc/network/interfaces-manual /etc/network/interfaces
它将接口文件从静态更改为 dhcp ...
其他命令似乎都没有运行......但是当我从终端运行与 stopapd.py 相同的代码时,它可以工作......我不知道为什么......任何帮助将不胜感激。