esp32+合宙air724ug实现pppos拨号上网

560 阅读2分钟

在micropython中,常见的连接网络的方式只有连接wifi,但是我们的需求比较特殊,需要通过4g模块+串口通信+AT命令的方式实现上网,但是at命令的http请求不太友好,耗时,费流量,这对单片机和物联网卡非常的不友好。研究了两天终于搞定了ppp拨号上网,记录一下

import socket
import time

import machine
import network

# 配置串口引脚
uart = machine.UART(1, baudrate=115200, tx=1, rx=2)


# 发送AT命令并等待响应
def send_at_command(command, timeout=2000):
    uart.write(command + '\r\n')
    time.sleep_ms(100)
    start = time.ticks_ms()
    response = b''
    while time.ticks_diff(time.ticks_ms(), start) < timeout:
        if uart.any():
            response += uart.read()
    return response


# 初始化Air724UG模块
def init_air724ug():
    print("初始化Air724UG模块...")
    send_at_command('AT+RESET', 5000)  # 重启模块
    time.sleep(5)
    send_at_command('ATE0')  # 关闭回显
    send_at_command('AT+CGATT=1')  # 附着GPRS服务
    send_at_command('AT+CSTT="CMNET"')  # 设置APN
    send_at_command('AT+CIICR')  # 启动无线连接
    response = send_at_command('AT+CIFSR')  # 获取本地IP地址
    send_at_command('ATD*99#')
    print("本地IP地址: ", response.decode().strip())


# 启动PPP连接
def start_ppp():
    print("启动PPP连接...")
    ppp = network.PPP(uart)
    ppp.active(True)
    ppp.connect()
    while not ppp.isconnected():
        time.sleep(1)
    print("PPP连接成功,IP地址: ", ppp.ifconfig())


# 主程序
def main():
    init_air724ug()
    start_ppp()
    test_ping()
    test_http_request()


def test_ping():
    try:
        # 通过socket尝试连接到Google的公共DNS服务器
        addr = socket.getaddrinfo('www.baidu.com', 80)[0][-1]
        s = socket.socket()
        s.connect(addr)
        print("Ping测试成功,已连接到baidu")
        s.close()
    except Exception as e:
        print("Ping测试失败:", e)


def test_http_request():
    try:
        # 创建一个socket对象
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 连接到目标服务器 (这里以百度为例)
        host = 'www.baidu.com'
        port = 80
        s.connect((host, port))
        print("HTTP请求连接成功")

        # 发送HTTP GET请求
        request = "GET / HTTP/1.1\r\nHost: {}\r\nConnection: close\r\n\r\n".format(host)
        s.send(request.encode())

        # 接收响应
        response = s.recv(4096)
        print("接收到的响应:")
        print(response.decode())

    except Exception as e:
        print("HTTP请求发生错误:", e)

    finally:
        # 关闭socket连接
        s.close()


if __name__ == '__main__':
    main()