8. NETWORK
K2000对于网络的使用做了简化和优化使其能适配TCP协议和UDP协议。
8.1. 网络接口配置
# 本机IP配置[169.254.1.XXX](XXX:2-255)
ip = [169, 254, 1, 134]
# 子网掩码,一般为[255.255.255.0]
mask = [255, 255, 255, 0]
# 默认网关地址
gw = [169, 254, 1, 1]
res = SHARP_NetWork_Init(ip, mask, gw) # 网卡配置
SHARP_NetWork_Init(ip, mask, gw)此方法配置了机子内部的硬件网络接口ip: 本地IP地址mask: 子网掩码gw: 默认网关地址
8.2. TCP协议
8.2.1. TCP协议简介
TCP协议,传输控制协议(Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通讯协议,由IETF的RFC 793定义。
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先创建相关连接,才能发送数据,类似于生活中,"打电话""。
8.2.2. 构建TCP客户端
# 远端PC主机(UDP客户端)IP地址
remote_ip = [169,254,0,133]
# 远端主机(UDP客户端)端口
remote_port = 6000
# 本地端口
local_port = 8888
# 接收到的字符串长度(Byte字节)
getData_len = 128
NetWorkDriver = SHARP_Driver_TCP_Client_Init(remote_ip, remote_port, local_port, getData_len) #构建TCP客户端
SHARP_Driver_TCP_Client_Init(remote_ip, remote_port, local_port, getData_len)此方法会构造并返回一个新的TCP 客户端 对象,并用于后续的读写remote_ip: 远端ip (列表形式传入)remote_port: 远端端口local_port: 本地端口getData_len: 接收数据长度
注意
由于在网络中都是以bytes形式传输的,所以需要注意数据编码与解码。
8.2.3. 构建TCP服务器
local_port = 8888
# 接收到的字符串长度(Byte字节)
getData_len = 128
NetWorkDriver = SHARP_Driver_TCP_Server_Init(localPort, getData_len) #构建TCP服务器
SHARP_Driver_TCP_Server_Init(local_port,recv_buff_len) 此方法会构造并返回一个新的TCP 服务器 对象,并用于后续的读写
local_port: 本地端口
getData_len: 接收数据长度
8.3. UDP协议
8.3.1. UDP协议简介
UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠、基于数据报的传输层通信协议。
UDP的通信过程与TCP相比较更为简单,不需要复制的三次握手与四次挥手,体现了无连接。 所以UDP传输速度比TCP快,但容易丟包、数据到达顺序无保证、缺乏拥塞控制、秉承尽最大努力交付的原则,体现了不可靠。
8.3.2. 构建UDP客户端
# 远端PC主机(UDP客户端)IP地址
remote_ip = [169,254,0,133]
# 远端主机(UDP客户端)端口
remote_port = 6000
# 本地端口
local_port = 8888
# 接收到的字符串长度(Byte字节)
getData_len = 128
NetWorkDriver = SHARP_Driver_UDP_Init(remote_ip, remote_port, local_port, getData_len) # 构建UDP客户端
SHARP_Driver_UDP_Init(remote_ip,remote_port,local_port,recv_buff_len) 此方法会构造并返回一个新的UDP 客户端 对象,并用于后续的读写
remote_ip: 远端ip (列表形式传入)
remote_port: 远端端口
local_port: 本地端口
getData_len: 接收数据长度
8.4. 网口发送
无论是TCP通信还是UDP通信,网口接收数据的使用方法都是一样,下面以TCP 服务器为例。
getData_len = 128 localPort = 6000 NetWorkDriver = SHARP_Driver_TCP_Server_Init(localPort, getData_len) # 网口发送测试(不可直接发送中文) # 发送后会并打印一行数字代表字符串长度 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)
8.5. 网口接收
无论是TCP通信还是UDP通信,网口接收数据的使用方法都是一样,下面以TCP 服务器为例。
getData_len = 128 localPort = 6000 NetWorkDriver = SHARP_Driver_TCP_Server_Init(localPort, getData_len) # 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. 示例
# 本机IP配置[169.254.1.XXX](XXX:2-255)
ip = [169, 254, 1, 134]
# 子网掩码,一般为[255.255.255.0]
mask = [255, 255, 255, 0]
# 默认网关地址
gw = [169, 254, 1, 1]
################### 网卡初始化(无论是用UDP还是TCP 都需要先初始化网卡) ####################################
# res:返回值 =0 配置成功
# =-1 配置失败
res = SHARP_NetWork_Init(ip, mask, gw)
################################### 网口TCP 服务器初始化 ################################################
# 注意:实例化过后不可重新实例化,否则程序会卡死
# 实例化过后调试,只能则行实例化之后的程序指令
# 配置并实例化TCP服务器对象
localPort = 6000
NetWorkDriver = SHARP_Driver_TCP_Server_Init(localPort, 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)
# ################################### 网口接收测试 ################################################
# 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)