在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()