单片机/MCU论坛
直播中

jf_16874806

1年用户 16经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[文章]

【嘉楠堪智K230开发板试用体验】网络收发信息

本次测评k230的网络模块,通过Socket编程实现CanMV K230与电脑服务器助手建立连接,相互收发数据。

我们先来看看网络层级模型图,这是构成网络通信的基础:
image.png

TCP 是一种传输层协议,它比 UDP
更复杂,具备数据确认、重传和滑动窗口等机制,保证了可靠传输。而 HTTP 是运行在应用层的协议,浏览网页时通常通过 HTTP 与服务器通信,默认使用端口 80。

比如我们访问淘宝,浏览器实际上是通过 IP 地址和端口向服务器发出 HTTP 请求。淘宝服务器处理请求后返回网页内容,连接随即关闭。这样设计是为了节省服务器资源,因为同时保持大量连接是很消耗资源的。

当多个用户或应用程序同时通信时,操作系统通过 Socket 接口
来区分不同的 TCP 连接或进程。Socket 相当于应用层和传输层之间的桥梁,虽然最常用于 TCP/IP,但它本身并不依赖特定协议,是一种通用的通信编程接口。

简单来说,Socket抽象层介于传输层和应用层之间,跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。

image.png

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议(通常是TCP或UDP),本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,简单理解就是其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。以下是通讯流程:
image.png

从上图可以看到,建了Socket通信需要一个服务器端和一个客户端,以本实验为例,CanMV K230作为客户端,电脑使用网络调试助手作为服务器端,双方使用TCP协议传输。对于客户端,则需要知道电脑端的IP和端口即可建立连接。

本实验的代码流程如下:
image.png
一、Socket 对象构造

s = usocket.socket(af=AF_INET,
type=SOCK_STREAM, proto=IPPROTO_TCP)

af:地址族

  • AF_INET:IPv4
  • AF_INET6:IPv6

type:套接字类型

  • SOCK_STREAM:TCP
  • SOCK_DGRAM:UDP

proto:协议

  • IPPROTO_TCP:TCP(默认)
  • IPPROTO_UDP:UDP

二、常用方法

获取地址信息

addr =
socket.getaddrinfo('www.01studio.cc', 80)[0][-1]

addr = socket.getaddrinfo('127.0.0.1',
80)[0][-1]

获取可用于连接或绑定的地址格式。

客户端方法

s.connect(addr)       # 连接服务器

s.send(b'hello')      # 发送字节数据

data = s.recv(1024)   # 接收数据(最多 1024 字节)

服务器方法

s.bind(addr)          # 绑定地址

s.listen(5)           # 监听连接(最多 5 个等待连接)

conn, addr = s.accept()  # 接受一个连接

通用操作

s.close()             # 关闭连接

下面演示示例代码

#导入相关模块
import network,socket,time
from machine import Pin,Timer

#WIFI连接函数
def WIFI_Connect():

    WIFI_LED=Pin(52, Pin.OUT) #初始化WIFI指示灯

    wlan = network.WLAN(network.STA_IF) #STA模式
    wlan.active(True)                   #激活接口

    if not wlan.isconnected():

        for i in range(3): #重复连接3次

            #输入WIFI账号密码(仅支持2.4G信号), 连接超过5秒为超时
            wlan.connect('01Studio', '88888888')

            if wlan.isconnected(): #连接成功
                break

    if wlan.isconnected(): #连接成功

        print('connect success')

        #LED蓝灯点亮
        WIFI_LED.value(1)

        #等待获取IP地址
        while wlan.ifconfig()[0] == '0.0.0.0':
            pass

        #串口打印信息
        print('network information:', wlan.ifconfig())

        return True

    else: #连接失败

        #LED闪烁3次提示
        for i in range(3):
            WIFI_LED.value(1)
            time.sleep_ms(300)
            WIFI_LED.value(0)
            time.sleep_ms(300)

        wlan.active(False)

        return False

#判断WIFI是否连接成功
if WIFI_Connect(): #连接成功

    #创建socket连接TCP类似,连接成功后发送“Hello 01Studio!”给服务器。
    s=socket.socket()
    addr=socket.getaddrinfo('192.168.100.200',10000)[0][-1] #服务器IP和端口
    print(addr)
    s.connect(addr)
    s.settimeout(0)#接收不阻塞
    s.send('Hello k230')

    while True:

        text=s.recv(128) #单次最多接收128字节
        if text == b'':
            pass

        else: #打印接收到的信息为字节,可以通过decode('utf-8')转成字符串
            print(text)
            s.send('I got:'+text.decode('utf-8'))

        time.sleep_ms(50)

打开网络调试工具
image.png

这个时候电脑连接上k230板子,烧录python代码到板子上运行
image.png

这个时候我们的pc端(tcp
server)就和k230连接上了并开始相互收发数据

本次实验通过在 K230 上实现基于
Socket 的 TCP 客户端通信,成功与电脑服务器建立连接并实现数据收发。掌握了 Socket 编程的基本流程,加深了对 TCP/IP 协议和网络通信机制的理解,为后续网络应用开发打下了基础。

更多回帖

发帖
×
20
完善资料,
赚取积分