怎样通过蓝牙仅使用Android手机为树莓派配置Wi-Fi网络

电子说

1.3w人已加入

描述

如果你已经使用Raspberry Pi一段时间了,你可能会遇到几个您需要连接并重新连接Pi的Wi-Fi网络的情况。这样做可能需要您将Pi连接到显示器,键盘和整个设备,或者使用其他设备直接在存储卡上进行配置。

在本教程中,我想向您展示一种通过蓝牙仅使用Android手机为Raspberry Pi配置Wi-Fi网络的简便方法。

使用此技术,您不再需要担心在无头Raspberry Pi上切换Wi-Fi网络。

必备材料

首先,您需要:

Raspberry Pi 3

Raspbian加载到microSD

Android手机

APK文件和Python运行脚本

在Raspbian上安装Bluez

在Raspbian终端中逐步输入以下命令,从安装Bluez(Python蓝牙库)开始:

$ sudo apt-get install python-bluez

Android

启动蓝牙守护程序兼容模式,编辑/etc/systemd/system/dbus-org.bluez.service ,输入以下命令:

$ sudo nano /etc/systemd/system/dbus-org.bluez.service

并修改ExecStart参数

ExecStart =/usr/lib/bluetooth/bluetoothd -C

Android

Android

加载串口配置文件:

$ sudo sdptool add SP

Android

重新启动你的Pi:

$ sudo reboot

Android

将Pi的蓝牙与Android配对

重启后,将Pi的蓝牙与Android手机配对。

配对蓝牙:

Android

打开手机的蓝牙,将手机与Raspberry Pi配对。接下来,在您的Pi上输入:

$ bluetoothctl

power on

discoverable on

scan on

您的手机将显示在可用设备列表中。记下您手机的地址。

信任

Android

要退出蓝牙ctl,请输入退出命令:

退出

您也可以跳过以上设置如果您发现可以使用Raspbian的UI轻松设置蓝牙。

Android

Android

Android

在配对蓝牙后,通过输入nano命令并复制/粘贴源代码,将Python脚本直接添加到Raspbian中:

$ sudo python run.py

你也可以在这里直接复制run.py文件。

Android

接下来,您可以运行该脚本。但首先使脚本可执行:

$ chmod +x run.py

运行:

$ sudo 。/run.py

执行此操作后,现在需要打开Android应用程序。为此,请使用此处的.apk文件下载并安装应用程序。

在蓝牙配对设备中选择Raspberry Pi。输入SSID,PSK并点击开始配置按钮。在几秒钟内,您的Raspberry Pi的Wi-Fi应该连接,如下图所示。

Android

Android

Android

要在启动时运行此脚本,请编辑/etc/rc.local 并添加:

(睡10;/path/to/script/。/run.py)&

Android

源代码(run.py)

#!/usr/bin/env python

import os

from bluetooth import *

from wifi import Cell, Scheme

import subprocess

import time

wpa_supplicant_conf = “/etc/wpa_supplicant/wpa_supplicant.conf”

sudo_mode = “sudo ”

def wifi_connect(ssid, psk):

# write wifi config to file

cmd = ‘wpa_passphrase {ssid} {psk} | sudo tee -a {conf} 》 /dev/null’.format(

ssid=str(ssid).replace(‘!’, ‘\!’),

psk=str(psk).replace(‘!’, ‘\!’),

conf=wpa_supplicant_conf

cmd_result = “”

cmd_result = os.system(cmd)

print cmd + “ - ” + str(cmd_result)

# reconfigure wifi

cmd = sudo_mode + ‘wpa_cli -i wlan0 reconfigure’

cmd_result = os.system(cmd)

print cmd + “ - ” + str(cmd_result)

time.sleep(10)

cmd = ‘iwconfig wlan0’

cmd_result = os.system(cmd)

print cmd + “ - ” + str(cmd_result)

cmd = ‘ifconfig wlan0’

cmd_result = os.system(cmd)

print cmd + “ - ” + str(cmd_result)

p = subprocess.Popen([‘hostname’, ‘-I’], stdout=subprocess.PIPE,

stderr=subprocess.PIPE)

out, err = p.communicate()

if out:

ip_address = out

else:

ip_address = “”

return ip_address

def ssid_discovered():

Cells = Cell.all(‘wlan0’)

wifi_info = ‘Found ssid : ’

for current in range(len(Cells)):

wifi_info += Cells[current].ssid + “ ”

wifi_info+=“!”

print wifi_info

return wifi_info

def handle_client(client_sock) :

# get ssid

client_sock.send(ssid_discovered())

print “Waiting for SSID.。.”

ssid = client_sock.recv(1024)

if ssid == ‘’ :

return

print “ssid received”

print ssid

# get psk

client_sock.send(“waiting-psk!”)

print “Waiting for PSK.。.”

psk = client_sock.recv(1024)

if psk == ‘’ :

return

print “psk received”

print psk

ip_address = wifi_connect(ssid, psk)

print “ip address: ” + ip_address

client_sock.send(“ip-address:” + ip_address + “!”)

return

try:

while True:

server_sock=BluetoothSocket( RFCOMM )

server_sock.bind((“”,PORT_ANY))

server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = “815425a5-bfac-47bf-9321-c5ff980b5e11”

advertise_service( server_sock, “RPi Wifi config”,

service_id = uuid,

service_classes = [ uuid, SERIAL_PORT_CLASS ],

profiles = [ SERIAL_PORT_PROFILE ])

print “Waiting for connection on RFCOMM channel %d” % port

client_sock, client_info = server_sock.accept()

print “Accepted connection from ”, client_info

handle_client(client_sock)

client_sock.close()

server_sock.close()

# finished config

print ‘Finished configuration ’

except (KeyboardInterrupt, SystemExit):

print ‘ Exiting ’

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分