• 树莓派66/100 - 用Pico W访问互联网


    扫描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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我的设备输出的信息如下:

    (b'H***', b'\xfc`\x9b\xe4{\xe1', 1, -98, 7, 1)
    (b'TP-LINK***', b'\x14\xcf\x92\x91v\xbe', 8, -41, 7, 9)
    (b'TP-LINK***\xe5\xa4\xa7\xe7\xbd\x91', b'\xd0v\xe7\xb4\x07\xa6', 3, -72, 7, 1)
    (b'', b'\xfc`\x9b\xe4}\x0f', 1, -67, 0, 1)
    (b'TP-LINK***', b'0\xb4\x9e\xc7\xd1v', 4, -84, 7, 1)
    (b'', b'\xfc`\x9b\xda\xc0N', 1, -74, 0, 1)
    (b'H***', b'\xfc`\x9b\xe4}\r', 1, -62, 7, 1)
    (b'w***', b'\xcc4)\x96\x9d\x93', 8, -76, 7, 4)
    (b'ChinaNet-***', b'\xb8\xa1Jj\xf9E', 4, -83, 3, 1)
    (b'iTV-***', b'\xba\xa1JZ\xf9E', 4, -80, 3, 1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    访问点的信息由6段信息的无组构成,说明文档在这里

    6段信息为:(ssid, bssid, channel, RSSI, security, hidden)

    ssid:服务集标识,Service Set Identifier的缩写,通俗地说,是无线网热点的名称。

    bssid:48个二进制位,6个字节,可以理解为访问点的MAC地址。

    channel:通道号

    RSSI:信号强度(Received signal strength indicator),正常信号强度应为-40 dbm ~ -85 dbm之间,小于 -90 dbm 的信号则很糟糕,几乎无法连接。

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    连接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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    import network
    import time
    
    ssid = 'XXXXXXXXX'
    password = 'PPPPPPPPPPPP'
    
    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] )
    
    • 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

    连接状态的对应表:

    #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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    有时,可能需要设置WIFI的国家代码,中国的代码是CN:

    import rp2
    rp2.country('CN')
    
    • 1
    • 2

    查询网卡的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'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    获取网页内容

    获取网页内容也变得非常简单,下面的代码获取南京的天气情况:

    import urequests
    r = urequests.get('http://api.seniverse.com/v3/weather/now.json?key=SwwwfskBjB6fHVRon&location=nanjing&language=en&unit=c')
    print(r.content)
    r.close()
    
    • 1
    • 2
    • 3
    • 4

    注意连接使用完毕后要close()。

    在这里插入图片描述

  • 相关阅读:
    在webstorm中配置sass编译环境
    什么是微服务?
    CentOS安装MySQL8.0
    复现SCI文章系列教程 | 文章复现一(IF 7.3):文章讨论与文章分析套路讲解
    vue 监听页面卷去的高度,获取元素离页面顶部的距离
    迎接“全全闪”时代 星辰天合发布星海架构和星飞产品
    《Python 快速入门》一千个程序员有一千套编码规范
    transition-group过渡动画
    低代码平台中的分布式 RPC 框架 (约 3000 行代码)
    动画一:过渡(超详细!)
  • 原文地址:https://blog.csdn.net/slofslb/article/details/127612893