8. NETWORK

K2000对于网络的使用做了简化和优化使其能适配TCP协议和UDP协议。

8.1. 网络接口配置

  • SHARP_NetWork(ip, mask, gw) 此方法配置了并初始化机子内部的硬件网络接口

    • ip : 机子IP地址

    • mask : 子网掩码

    • gw : 默认网关

# 本机IP配置[169.254.1.XXX](XXX:2-255)
ip =    [192, 168, 1,  71]
# 子网掩码,一般为[255.255.255.0]
mask =  [255, 255, 255, 0]
# 默认网关地址
gw =    [192, 168, 1,   1]

################### 网卡初始化(无论是用UDP还是TCP  都需要先初始化网卡) ####################################
# 配置并实例化SHARP_NetWork对象
My_NETWORK = SHARP_NetWork(ip,mask,gw)
# 返回如<<SHARP_NetWork object at c00fb590>>成功
print(My_NETWORK)

8.2. TCP协议

8.2.1. TCP协议简介

TCP协议,传输控制协议(Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通讯协议,由IETF的RFC 793定义。

TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先创建相关连接,才能发送数据,类似于生活中,”打电话””。

8.2.2. 构建TCP客户端

  • Driver_TCP_Client_Init(remote_ip, remote_port, local_port, getData_len) 此方法会构造并返回一个新的TCP 客户端 对象,并用于后续的读写

    • remote_ip : 远端ip (列表形式传入)

    • remote_port : 远端端口

    • local_port : 本地端口

    • getData_len : 接收数据长度

Attention

由于在网络中都是以bytes形式传输的,所以需要注意数据编码与解码。

################################### 网口TCP 客户端初始化 ################################################
# 注意:实例化过后不可重新实例化,否则程序会卡死
# 实例化过后调试,只能则行实例化之后的程序指令
# 配置并实例化TCP客户端对象
NetWorkDriver = My_NETWORK.Driver_TCP_Client_Init(remote_ip, remote_port, local_port, getData_len)
# 返回如<Tsky_comDriver object at c005eba0>成功
print(NetWorkDriver)

8.2.3. 构建TCP服务器

  • Driver_TCP_Server_Init(local_port,recv_buff_len) 此方法会构造并返回一个新的TCP 服务器 对象,并用于后续的读写

    • local_port : 本地端口

    • getData_len : 接收数据长度

################################### 网口TCP 服务器初始化 ################################################
# 注意:实例化过后不可重新实例化,否则程序会卡死
# 实例化过后调试,只能则行实例化之后的程序指令
# 配置并实例化TCP服务器对象
NetWorkDriver = My_NETWORK.Driver_TCP_Server_Init(local_port, getData_len)
print(NetWorkDriver)

8.3. UDP协议

8.3.1. UDP协议简介

UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠、基于数据报的传输层通信协议。

UDP的通信过程与TCP相比较更为简单,不需要复制的三次握手与四次挥手,体现了无连接。 所以UDP传输速度比TCP快,但容易丟包、数据到达顺序无保证、缺乏拥塞控制、秉承尽最大努力交付的原则,体现了不可靠。

8.3.2. 构建UDP客户端

  • Driver_UDP_Init(remote_ip,remote_port,local_port,getData_len) 此方法会构造并返回一个新的UDP 客户端 对象,并用于后续的读写

    • remote_ip : 远端ip (列表形式传入)

    • remote_port : 远端端口

    • local_port : 本地端口

    • getData_len : 接收数据长度

################################### 网口UDP初始化 ######################################################
# 配置并实例化UDP客户端对象
NetWorkDriver = My_NETWORK.Driver_UDP_Init(remote_ip,remote_port,local_port,getData_len)
# 返回如<Tsky_comDriver object at c005eba0>成功
print(NetWorkDriver)

8.4. 网口发送

无论是TCP通信还是UDP通信,网口接收数据的使用方法都是一样,下面以TCP 服务器为例。

# 网口发送测试(不可直接发送中文)
# 发送后会并打印一行数字代表字符串长度
NetWorkDriver.write('hello world...\r\n')

#格式化打印(同C sprintf)
str2 = '%s year: %d, moom: %d, day: %d\r\n' % ('hello world,', 2022, 4, 25)
NetWorkDriver.write(str2)

8.5. 网口接收

无论是TCP通信还是UDP通信,网口接收数据的使用方法都是一样,下面以TCP 服务器为例。

# 应用层方法 获取UDP发送 信息并打印(需要传入下面NetWorkDriver.dev_single(NetWork_read))
# data:     接收到的字节流
# data_len: 接收到的字符串长度
# 注意:     不可接收中文信息
def NetWork_read(data,data_len):
    if data_len > 0:
        # 获取到的字节流 解码 为字符串
        data_decode = data.decode()
        print(data_decode, end='')

# 将应用层函数传递到该方法中,该方法为当配置好网口后,如果有接收到TCP服务器信息,回调信息到应用层方法
NetWorkDriver.dev_single(NetWork_read)

8.6. 示例

from sharp_user import user_mode
from sharp_eth import SHARP_NetWork

# 本机IP配置[169.254.1.XXX](XXX:2-255)
ip =    [192, 168, 1,  71]
# 子网掩码,一般为[255.255.255.0]
mask =  [255, 255, 255, 0]
# 默认网关地址
gw =    [192, 168, 1,   1]

# 远端PC主机(UDP客户端)IP地址
remote_ip = [192,168,1,223]
# 远端主机(UDP客户端)端口
remote_port = 8000
# 本地端口
local_port = 8888
# 接收到的字符串长度(Byte字节)
getData_len = 128



################### 网卡初始化(无论是用UDP还是TCP  都需要先初始化网卡) ####################################
# 配置并实例化SHARP_NetWork对象
My_NETWORK = SHARP_NetWork(ip,mask,gw)
# 返回如<<SHARP_NetWork object at c00fb590>>成功
print(My_NETWORK)



################################### 网口UDP初始化 ######################################################
# 配置并实例化UDP客户端对象
NetWorkDriver = My_NETWORK.Driver_UDP_Init(remote_ip,remote_port,local_port,getData_len)
# 返回如<Tsky_comDriver object at c005eba0>成功
print(NetWorkDriver)

################################### 网口TCP 客户端初始化 ################################################
# 注意:实例化过后不可重新实例化,否则程序会卡死
# 实例化过后调试,只能则行实例化之后的程序指令
# 配置并实例化TCP客户端对象
NetWorkDriver = My_NETWORK.Driver_TCP_Client_Init(remote_ip, remote_port, local_port, getData_len)
# 返回如<Tsky_comDriver object at c005eba0>成功
print(NetWorkDriver)

################################### 网口TCP 服务器初始化 ################################################
# 注意:实例化过后不可重新实例化,否则程序会卡死
# 实例化过后调试,只能则行实例化之后的程序指令
# 配置并实例化TCP服务器对象
NetWorkDriver = My_NETWORK.Driver_TCP_Server_Init(local_port, getData_len)
print(NetWorkDriver)




# 网口发送测试(不可直接发送中文)
# 发送后会并打印一行数字代表字符串长度
NetWorkDriver.write('hello world...\r\n')

'''
# 发送中文需要先进行编码--'utf-8'  'gbk'  'gb2312',调试助手要调到对应编码,不然可能会乱码
str1 = '你好,世界!!!\r\n'.encode('gb2312')
NetWorkDriver.write(str1)
'''

#格式化打印(同C sprintf)
str2 = '%s year: %d, moom: %d, day: %d\r\n' % ('hello world,', 2022, 4, 25)
NetWorkDriver.write(str2)

# 应用层方法 获取UDP发送 信息并打印(需要传入下面NetWorkDriver.dev_single(NetWork_read))
# data:     接收到的字节流
# data_len: 接收到的字符串长度
# 注意:     不可接收中文信息
def NetWork_read(data,data_len):
    if data_len > 0:
        # 获取到的字节流 解码 为字符串
        data_decode = data.decode()
        print(data_decode, end='')

# 将应用层函数传递到该方法中,该方法为当配置好网口后,如果有接收到TCP服务器信息,回调信息到应用层方法
NetWorkDriver.dev_single(NetWork_read)

# 循环向UDP客户端发送信息
while True:
    # 延时单位秒,若要延时毫秒如1000毫秒输入1000即可
    user_mode.Delay_ms(1000)
    NetWorkDriver.write("hello world...")
    #NetWorkDriver.write(str1)
    NetWorkDriver.write(str2)