HTTP协议
GT6700 开发板配备了以太网接口,通过直插网线连通网络,使用HTTP协议Ping百度。
HTTP 的基本工作原理是客户端(通常是 web 浏览器)向服务器发送请求,服务器接收到请求后,返回相应的资源。这些资源可以是网页、图像、音频文件、视频等。
HTTP 使用了客户端-服务器模型,其中客户端发送请求,服务器返回响应。
代码展示
from machine import Pin #导入Pin模块
import time, os, socket, network #导入time, os, socket, network模块
def network_connect(connect=True):
LAN_LED=Pin(53, Pin.OUT) #初始化联网指示灯
if connect:
LAN_LED.value(1) #LED灯点亮
else:
for i in range(3):
LAN_LED.value(1)
time.sleep_ms(300)
LAN_LED.value(0)
time.sleep_ms(300)
#执行以太网连接函数
def network_use_lan(is_lan=True):
if is_lan:
lan = network.LAN()
if lan.active():
if lan.isconnected(): #连接成功
print('network information:', lan.ifconfig())#串口打印信息
lan.ifconfig("dhcp") #设置DHCP模式
print(lan.config("mac"))#查看网口mac地址
print(lan.ifconfig()) #查看网口 ip,掩码,网关,dns配置
network_connect(True) #连接成功,点亮LED
ip = lan.ifconfig()[0]
else:
ip = '0.0.0.0'
network_connect(False) #连接失败,LED闪烁三次
else:
network_connect(False) #连接失败,LED闪烁三次
ip = '0.0.0.0'
raise RuntimeError("LAN 未激活")
else:
print("WIFI 请等待更新")
ip = '0.0.0.0'
network_connect(False) #连接失败,LED闪烁三次
return ip
def http_client_main(use_stream=True):
s = socket.socket() #创建 socket
ai = [] #获取地址及端口号
for attempt in range(0, 3):
try:
ai = socket.getaddrinfo("www.baidu.com", 80)
break
except:
print("getaddrinfo again")
if ai == []:
print("连接错误")
s.close()
return
addr = ai[0][-1]
print("连接地址:", addr)
s.connect(addr) #连接
if use_stream:
s = s.makefile("rwb", 0)
s.write(b"GET /index.html HTTP/1.0\r\n\r\n")
print(s.read())
else:
s.send(b"GET /index.html HTTP/1.0\r\n\r\n")
print(s.recv(4096))
s.close()
def main():
ip=network_use_lan(True) #有线以太网连接函数
if not ip=='0.0.0.0':
http_client_main(use_stream=True)
time.sleep_ms(30)
http_client_main(use_stream=False)
main()
代码解读
导入必要的模块
import network # 模块用于管理网络接口
import socket # 模块提供网络通信的底层接口
配置网络接口
该函数根据输入配置网络接口:
LAN 模式:通过有线网络接口(LAN)自动获取 IP 地址。
# 执行以太网连接函数
def network_use_lan(is_lan=True):
if is_lan:
lan = network.LAN()
if lan.active():
if lan.isconnected(): # 连接成功
# 串口打印信息
print('network information:', lan.ifconfig())
lan.ifconfig("dhcp")# 设置DHCP模式
print(lan.config("mac"))# 查看网口mac地址
print(lan.ifconfig())# 查看网口 ip,掩码,网关,dns配置
network_connect(True)# 连接成功,点亮LED
ip = lan.ifconfig()[0]
else:
ip = '0.0.0.0'
# LED闪烁3次提示
network_connect(False)# 连接失败,LED闪烁三次
else:
network_connect(False)# 连接失败,LED闪烁三次
ip = '0.0.0.0'
raise RuntimeError("LAN 未激活")
else:
print("WIFI 请等待更新")
ip = '0.0.0.0'
network_connect(False)# 连接失败,LED闪烁三次
return ip
创建并配置 Socket
创建一个 socket 对象,并通过 getaddrinfo 函数获取服务器(百度)的地址和端口号信息,使用重试机制以提高健壮性。
# 创建 socket 对象
s = socket.socket()
# 获取目标地址和端口号
ai = []
for attempt in range(0, 3):
try:
ai = socket.getaddrinfo("www.baidu.com", 80)
break
except:
print("getaddrinfo again")
if ai == []:
print("连接错误")
s.close()
return
addr = ai[0][-1]
print("连接地址:", addr)
发送 HTTP 请求并接收响应
代码根据 use_stream 参数选择使用流式接口或直接通过 socket 接口发送 HTTP 请求并读取响应数据。
# 连接到服务器
s.connect(addr)
if use_stream:
# 使用流式接口读取响应
s = s.makefile("rwb", 0)
s.write(b"GET /index.html HTTP/1.0\r\n\r\n")
print(s.read())
else:
# 直接使用 socket 接口发送和接收数据
s.send(b"GET /index.html HTTP/1.0\r\n\r\n")
print(s.recv(4096))
# 关闭 socket
s.close()
函数调用
调用 main 函数,通过不同的 use_stream 参数测试流式和非流式读取 HTTP 响应的效果。如果 use_stream 为 True,则使用流式接口发送请求并读取整个响应;如果为 False,则直接发送请求并接收一定长度的响应数据(本例中为4096字节)。最后,关闭 socket 连接以释放资源。
# 分别测试流式接口和非流式接口
main(use_stream=True)
main(use_stream=False)
效果展示
配置好后,我们插上网线后通电开机,系统识别到以太网口会进行初始化,初始化完毕后,我们运行代码,代码先检测网路是否接通,检测到网络通畅后,点亮LED灯然后进行Ping百度。如果网络不通畅,则LED等闪烁。
【学习k230 - 例程17】网络例程HTTP-Client