【学习K230-例程17】GT6700-HTTP-Client

B站视频


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值