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)