如何使用 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 固件提供的功能,懂的自然懂。