树莓派 Pico W 连接 WiFi 网络相关的操作介绍

树莓派 Pico W 内置了英飞凌的 CYW43439 无线芯片,支持 WiFi 功能,甚至蓝牙功能。下面介绍 Pico W 和 WiFi、网络相关的用法。

扫描附近的 WiFi 热点

import network

wlan = network.WLAN(network.STA_IF) 
wlan.active(True) 
access_points = wlan.scan() 
for ap in access_points:
    print(ap)

设备输出的信息如下:

访问点的信息由 6 段信息的格式构成,可以参考 MicroPython 的文档

具体信息为:(ssid, bssid, channel, RSSI, security, hidden)
– ssid:服务集标识,Service Set Identifier 的缩写,通俗地说,是无线网热点的名称
– bssid:48 个二进制位,6 个字节,可以理解为访问点的 MAC 地址
– channel:通道号
– RSSI:信号强度(Received signal strength indicator),正常信号强度应为 -40dbm ~ -85dbm之间,小于 -90dbm 的信号则很糟糕,几乎无法连接
– security:安全连接方式,包含以下几种:
0 – open
1 – WEP
2 – WPA-PSK
3 – WPA2-PSK
4 – WPA/WPA2-PSK

– 可见还是隐藏:
0 – visible
1 – hidden

下面的代码按信号强弱将连接点排序输出:

import network
import binascii

wlan = network.WLAN(network.STA_IF) 
wlan.active(True) 
access_points = wlan.scan()

# 按信号强弱排序
access_points.sort(key=lambda x:x[3], reverse=True)

for ssid, bssid, channel, RSSI, security, hidden in access_points:
    print(ssid, binascii.hexlify(bssid), channel, RSSI, security, hidden)

连接到 WiFi

import network
import time

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('你的WIFI名称', '你的WIFI密码')

while not wlan.isconnected() and wlan.status() >= 0:
    print("Waiting to connect:")
    time.sleep(1)
    
print(wlan.ifconfig())

官方给出的更可靠的、考虑了一些异常情况的代码是:

import network
import time
import rp2

# 设置 WiFi 的国家代码,中国的代码是 CN
rp2.country('CN')

ssid = 'SSID'
password = 'PASSWORD'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# Wait for connect or fail
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)

# Handle connection error
if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print( 'ip = ' + status[0] )

其中,ssid 和 password 需要替换成你要连接到 WiFi 信息。

wlan.status() 返回的是连接状态,其值对应如下常量:

#define CYW43_LINK_DOWN (0)
#define CYW43_LINK_JOIN (1)
#define CYW43_LINK_NOIP (2)
#define CYW43_LINK_UP (3)
#define CYW43_LINK_FAIL (-1)
#define CYW43_LINK_NONET (-2)
#define CYW43_LINK_BADAUTH (-3)

查询网卡的 MAC 地址

import network
import ubinascii

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print(mac)

# Other things you can query
print(wlan.config('channel'))
print(wlan.config('essid'))
print(wlan.config('txpower'))

获取网页内容

获取网页内容也变得非常简单,下面的代码获取百度首页的 html 代码内容:

import urequests
r = urequests.get('http://www.baidu.com/')
print(r.content)
r.close()

注意连接使用完毕后要调用 r.close() 关闭连接。

你还可以:
查看系列教程中的其他文章
购买本教程所用到的 Pico 套件



2 评论

  1. 好奇,如果把这项代码写到main.py使得开机自动连接到wifi,那能不能做到远程连接树莓派pico而不用依赖pico一直连接电脑才能用

发表评论

你的邮件地址不会公开


*