树莓派 Pico W 内置了英飞凌的 CYW43439 无线芯片,支持 WiFi 功能,甚至蓝牙功能。下面介绍 Pico W 和 WiFi、网络相关的用法。
扫描附近的 WiFi 热点
1 2 3 4 5 6 7 | 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
下面的代码按信号强弱将连接点排序输出:
1 2 3 4 5 6 7 8 9 10 11 12 | 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
1 2 3 4 5 6 7 8 9 10 11 12 | 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()) |
官方给出的更可靠的、考虑了一些异常情况的代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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() 返回的是连接状态,其值对应如下常量:
1 2 3 4 5 6 7 | #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 地址
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 代码内容:
1 2 3 4 | import urequests r = urequests.get( 'http://www.baidu.com/' ) print (r.content) r.close() |
注意连接使用完毕后要调用 r.close() 关闭连接。
好奇,如果把这项代码写到main.py使得开机自动连接到wifi,那能不能做到远程连接树莓派pico而不用依赖pico一直连接电脑才能用
当然可以的
扫描wifi示例报错了。提示wlan.scan()有问题,错误信息如下:
OSError: [Errno 1] EPERM