如何使用 Socket 网络编程

    大佬鼠 2020-11-26 编辑,截止目前 MaixPy 的 socket 模块还未能实现 listen / bind / accept 等接口。

    如何使用 TCP 和 UDP 客户端连接服务器

    假设已知 如何给 MaixPy 连接网络 的基础内容,直接运行示例代码。

    • 警告:不准问:“没联网为什么不能访问网络的问题!”

    请确认 地址 和 端口后再使用以下客户端代码。

    准备客户端代码

    有如下几类典型客户端代码:

    准备调试工具(服务端代码)

    常见于网络调试助手,或者自己在电脑上运行提供的 Python3 服务端脚本。

    先起一个已知 IP 地址和端口的网络服务,等待 MaixPy 作为客户端发送数据过来服务器。

    典型客户端代码举例

    • TCP
    import socket
    ADDR = ("192.168.0.107", 60000)
    sock = socket.socket()
    sock.connect(ADDR)
    sock.settimeout(1)
    while 1:
        sock.send("hello\n")
        #data = sock.recv(10) # old maxipy have bug (recv timeout no return last data)
        #print(data) # fix
        try:
          data = b""
          while True:
            tmp = sock.recv(1)
            print(tmp)
            if len(tmp) == 0:
                raise Exception('timeout or disconnected')
            data += tmp
        except Exception as e:
          print("rcv:", len(data), data)
        #time.sleep(2)
    
    sock.close()
    
    • UDP
    import socket
    ADDR = ("192.168.0.107", 60000)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.settimeout(1)
    while 1:
        try:
            sock.sendto("hello\n", ADDR)
            data, addr = sock.recvfrom(1024)
        except Exception as e:
            print("receive error:", e)
            continue
        print("addr:", addr, "data:", data)
        time.sleep(2)
    sock.close()
    '''
    >>>
    raw REPL; CTRL-B to exit
    >OK
    network state: True ('192.168.0.186', '255.255.255.0', '192.168.0.1')
    addr: ('192.168.0.107', 60000) data: b'HELLO\n'
    addr: ('192.168.0.107', 60000) data: b'HELLO\n'
    addr: ('192.168.0.107', 60000) data: b'HELLO\n'
    '''
    

    其他网络功能

    以下为特殊功能代码。

    esp32 的 ping

        ESP32_SPI firmware version: 1.4.0
        try AT connect wifi...
        network state: True ('192.168.0.180', '255.255.255.0', '192.168.0.1')
        ping baidu.com: 40 ms
        >
        MicroPython v0.5.1-136-g039f72b6c-dirty on 2020-11-18; Sipeed_M1 with kendryte-k210
        Type "help()" for more information.
        >>>
    

    esp32 的 ADC

        MicroPython v0.5.1-136-g039f72b6c-dirty on 2020-11-18; Sipeed_M1 with kendryte-k210
        Type "help()" for more information.
        >>> 
        raw REPL; CTRL-B to exit
        >OK
        (2370, 3102, 3071)
        2017 2753 0977 2709 0963 0855  : adc
        0617 0757 0150 0095 0133 0153  : adc
        1319 1478 0955 0939 0698 0619  : adc
        2403 3231 3299 3298 1483 0779  : adc
        1119 1815 1274 1315 0230 0255  : adc
        0951 0951 0295 0283 0319 0399  : adc
        2175 2769 2576 2579 1487 1104  : adc
        1995 2846 2647 2699 0839 0441  : adc
    

    其实 espAT 也是这样获取 ADC 的,但只能在指定的引脚上。

    HTTP 的支持

    https 的支持

    该功能默认是不被编译的,但所以提供的是 HTTP 的使用方法,而 HTTP 和 HTTPS 只是路径 url 的区别,注意这个 https 的 IP 解析依赖于网卡固件,并不在 K210 上完成。

    esp32、82XX 的 scan WIFI AP 热点

    '''
        >>>
        raw REPL; CTRL-B to exit
        >OK
        SSID:    Sipeed_2.4G     , ENC:WPA/WPA2 PSK , RSSI:        -57
        SSID:   ChinaNet-Ffdj    , ENC:WPA/WPA2 PSK , RSSI:        -58
        SSID:      wea_615       , ENC:WPA/WPA2 PSK , RSSI:        -67
        SSID:   ChinaNet-PnAN    , ENC:WPA/WPA2 PSK , RSSI:        -70
        SSID:      wea_613       , ENC:WPA/WPA2 PSK , RSSI:        -73
        SSID:   ChinaNet-TnSG    , ENC:WPA/WPA2 PSK , RSSI:        -82
        SSID:  chipshine_GUEST   , ENC:WPA/WPA2 PSK , RSSI:        -83
        SSID:        ASUS        , ENC:WPA/WPA2 PSK , RSSI:        -86
        SSID:       gta888       , ENC:WPA/WPA2 PSK , RSSI:        -87
        SSID:       huahua       , ENC:WPA/WPA2 PSK , RSSI:        -88
        >
        MicroPython v0.5.1-136-g039f72b6c-dirty on 2020-11-18; Sipeed_M1 with kendryte-k210
        Type "help()" for more information.
        >>>
    '''
    

    mqtt 支持

    这个是来自于 micropython 的官方仓库提供的代码,如果是商业用途,请将 socket 配置为非阻塞且添加 MQTT 保活的协议。

    更新 ESP82XX 的 AT 固件

    这是给 AT 固件提供的功能,懂的自然懂。