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)