【学习K230-例程18】GT6700-HTTP-Server
B站视频
HTTP协议
GT6700 开发板配备了以太网接口,通过直插网线连通网络,使用HTTP协议Ping百度。
HTTP 的基本工作原理是客户端(通常是 web 浏览器)向服务器发送请求,服务器接收到请求后,返回相应的资源。这些资源可以是网页、图像、音频文件、视频等。
HTTP 使用了客户端-服务器模型,其中客户端发送请求,服务器返回响应。
代码展示
from machine import Pin #导入Pin模块
import time, os, socket, network #导入time, os, socket, network模块CONTENT = b"""\
HTTP/1.0 200 OKHello #%d from GINGKO k230 canmv MicroPython!
"""
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) #连接成功,点亮LEDip = 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 ipdef http_server_main(micropython_optimize=True):ip = network_use_lan(True)s = socket.socket()ai = socket.getaddrinfo("0.0.0.0", 8081)addr = ai[0][-1]s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.bind(addr)s.listen(5)print("Listening, connect your browser to http://%s:8081/" % (ip))counter = 0while True:res = s.accept()client_sock = res[0]client_addr = res[1]print("Client address:", client_addr)client_sock.setblocking(True)client_stream = client_sock if micropython_optimize else client_sock.makefile("rwb")while True:h = client_stream.read()if h is None:continueprint(h)if h.endswith(b'\r\n\r\n'):breakos.exitpoint()client_stream.write(CONTENT % counter)client_stream.close()counter += 1time.sleep(2)if counter > 0:print("http server exit!")s.close()breakdef main():ip=network_use_lan(True) #有线以太网连接函数if not ip=='0.0.0.0':http_server_main()main()
代码解读
导入必要的模块
import socket # 模块用于网络通信 import network # 管理网络接口(如 LAN) import time # 提供时间相关功能
定义响应内容
定义一个字节字符串 CONTENT,作为 HTTP 响应主体。 %d 是计数器占位符,表示每次请求的序号。
CONTENT = b"""\ HTTP/1.0 200 OK Hello #%d from GINGKO k230 canmv MicroPython! """
配置网络接口
这段代码依据 is_wlan 参数选择 WLAN 或 LAN 接口。WLAN 模式下连接到指定 Wi-Fi 网络,而 LAN 模式则通过 DHCP 获取 IP 地址。获取并打印网络配置后,返回 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,并启用 SO_REUSEADDR 选项以允许端口重用。绑定地址并开始监听端口 8081,最多支持 5 个连接请求。
s = socket.socket() # 创建 socket 对象 s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 设置socket选项,允许地址重用ai = socket.getaddrinfo("0.0.0.0", 8081) # 绑定到所有网络接口,监听 8081 端口 addr = ai[0][-1] s.bind(addr) s.listen(5) # 开始监听,最大连接数为 5 print("监听中,请在浏览器中访问 http://%s:8081/" % (network.LAN().ifconfig()[0]))
处理客户端请求
服务器主循环接受客户端连接,选择不同的读取方式处理请求,发送带有计数器的响应,并关闭连接。连接关闭后,等待 2 秒进入下次循环。
counter = 0 while True: res = s.accept()# 接受连接 client_sock = res[0] client_addr = res[1] print("客户端地址:", client_addr) if not micropython_optimize: # 根据是否启用优化,选择不同的读取方式 client_stream = client_sock.makefile("rwb")# 使用流式接口(适用于 CPython)else:client_stream = client_sock # 使用 MicroPython 特有接口# 读取请求内容 client_stream.write(CONTENT % counter) # 发送响应 client_stream.close() # 关闭连接 counter += 1time.sleep(2)if counter > 0:print("HTTP 服务器退出!") s.close()break
效果展示
配置好后,我们通过Win+R输入cmd。在命令符里输入ipconfig,查看我们PC与K230连接的网线IP。
我们将K230的IP配置到与PC同一子网下,方便我们网路访问。
最后我们将PC端的防火墙关闭,开启防火墙可能会传输信息失败。
准备好上述工作后,我们插上网线,再启动K230。等待启动过程中以太网模块初始化,初始化完毕后,我们运行代码,可以看到网页地址打印出来了。
我们将地址复制进电脑浏览器,通过电脑访问,就可以在打印信息里看到PC的访问IP和端口号。
【学习k230 - 例程18】网络例程HTTP-server