当前位置: 首页 > news >正文

代理网站系统wordpress 分段

代理网站系统,wordpress 分段,营销网络建设的好处,网站主页设计教程python实现FINS协议的UDP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样#xff0c;可以使用现成的pymodbus模块去实现。但是#xff0c;我们可以根据协议帧进行组包#xff0c;自己去实现帧的格式#xff0c;而这一切可以基于socket模块。本文基于原先 FINS协议的TCP…python实现FINS协议的UDP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样可以使用现成的pymodbus模块去实现。但是我们可以根据协议帧进行组包自己去实现帧的格式而这一切可以基于socket模块。本文基于原先 FINS协议的TCP服务端的文章进行修改。 一、FINS TCP与FINS UDP 1、FINS_UDP与FINS_TCP有什么不同 FINSFactory Interface Network Service是欧姆龙OmronPLC可编程逻辑控制器的通信协议。FINS支持两种主要的传输方式FINS over TCPFINS_TCP和FINS over UDPFINS_UDP。 下面是它们之间的主要区别 1传输层协议: FINS_TCP 使用TCPTransmission Control Protocol作为传输层协议。TCP是面向连接的、可靠的协议确保数据的可靠性和顺序传输。 FINS_UDP 使用UDPUser Datagram Protocol作为传输层协议。UDP是面向无连接的协议它不保证数据的可靠性和顺序传输但通常具有更低的延迟。 2连接方式: FINS_TCP 建立连接后进行通信类似于常见的TCP通信方式。 FINS_UDP 无连接每个数据包独立发送适用于对实时性要求较高的应用场景。 3可靠性和顺序性: FINS_TCP 提供TCP的可靠性和顺序性适用于对数据完整性和传输顺序有要求的应用。 FINS_UDP 不提供可靠性和顺序性的保证适用于对实时性要求较高可以容忍一些数据丢失的场景。 4用途: FINS_TCP 适用于对数据完整性和传输顺序要求较高的应用例如需要确保每个数据包都被正确接收的场景。 FINS_UDP 适用于实时性要求较高可以容忍一些数据丢失的应用例如对于实时控制要求较高的系统。 选择使用哪种方式取决于具体的应用场景和对通信特性的要求。 2、FINS_UDP与FINS_TCP的协议包有什么不同 1握手包 FINS_TCP有握手包而FINS_UDP没有握手包。 2请求头 FINS_TCP的请求头是FINS而FINS_UDP没有请求头。 3其他部分 一致。相关文档请查阅我之前写的“python实现FINS协议的TCP服务端篇一”等文章现对比如下 FINS_TCP 46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 80 00 02 00 01 00 00 01 00 3D 01 01 82 00 64 00 00 01 FINS_UDP 80 00 02 00 FF 00 00 05 00 64 01 01 82 00 64 00 00 01 二、程序实现 1、构建响应帧 def recognition_frame(req_bytes_frame, Trigger):get_frame req_bytes_frame.hex().upper()print(设备请求:, get_frame)SRC_value get_frame[22:24] # 判断读写01为读02为写Area_value get_frame[24:26] # 判断寄存器区域82为保持寄存器# print(SRC_value)# print(Area_value)if SRC_value 01:if Area_value 82:response_1 00000000000000000000010100000001 # Trigger位为Trueresponse_0 00000000000000000000010100000000 # Trigger位为Falseif Trigger True:return bytes().fromhex(response_1)else:return bytes().fromhex(response_0)else:raise ValueError(Area_value is error!)elif SRC_value 02:if Area_value 82:print(***************************************)# 写保持寄存器的响应print(扫码器写入的结果数据, bytes().fromhex(get_frame))response 0000000000000000000001020000return bytes().fromhex(response)else:raise ValueError(Area_value is error!)else:raise ValueError(SRC_value is error!) 这个函数是针对读取或写入保持寄存器的请求以下是对函数的解释 1输入参数 req_bytes_frame: 一个字节序列表示设备请求的原始帧。Trigger: 一个布尔值似乎用于确定设备是否处于触发状态。 2函数操作 将输入的字节序列转换为十六进制表示并转换为大写形式。从帧中提取 SRC源和 Area寄存器区域的值。 根据 SRC 和 Area 的值执行相应的逻辑 如果 SRC 是 01表示读取请求继续判断 Area 是否为 82保持寄存器。 如果不是 82抛出 ValueError 异常表示 Area 值错误。 如果 SRC 是 02表示写入请求同样判断 Area 是否为 82。 如果是打印扫码器写入的结果数据构建写保持寄存器的响应帧。如果不是 82同样抛出 ValueError 异常。 如果 SRC 不是 01 或 02抛出 ValueError 异常表示 SRC 值错误。 如果是根据 Trigger 的值构建响应帧其中 Trigger 为 True 时触发位为 1否则为 0。 3返回值 如果是读取请求返回构建的响应帧True 触发位或 False 触发位。 如果是写入请求返回构建的写保持寄存器的响应帧。 4异常处理 如果 Area 值不是 82或者 SRC 值不是 01 或 02都会抛出 ValueError 异常提示相应的错误信息。 总体来说该函数是为了处理设备的读取和写入请求并根据请求类型和条件构建相应的响应帧。 2、服务器实现 if __name__ __main__:DM_start 1000# 创建FINS服务端# 创建一个TCP/IP套接字server_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定套接字到特定地址和端口server_address (192.168.1.188, 9600) # 服务器地址和端口server_socket.bind(server_address)try:num 0 # 触发标志Trigger_rec 0 # Trigger置为True时对应变为1表示触发一次response # 响应while True:# 接收客户端请求request, client_address server_socket.recvfrom(1024)if request:# 如果收到的不是请求头if 800002 in request.hex():# print(request.hex()[22:24])# 实现扫码触发if request.hex()[22:24] 01: # 判断读写01为读触发指令02为写触发结果if Trigger_rec ! 2:Trigger_rec 1if Trigger_rec 1:response recognition_frame(request, TriggerFalse) # 先清空触发信号server_socket.sendto(response, client_address)elif Trigger_rec 2: # 复位Trigger信号response recognition_frame(request, TriggerTrue) # 再置位触发信号server_socket.sendto(response, client_address)# 实现结果接收elif request.hex()[22:24] 02:print(request.hex())# print(---------------, int(request.hex()[26:30], 16))if int(request.hex()[26:30], 16) DM_start 4:if any(c ! 0 for c in request.hex()[36:]): # 不全为0print(扫码结果, request.hex()[36:])num 1Trigger_rec 0else:response recognition_frame(request, TriggerTrue)server_socket.sendto(response, client_address)print(还没有收到结果继续等待扫码结果)else:response recognition_frame(request, TriggerTrue)server_socket.sendto(response, client_address)# 处理其他请求else:response recognition_frame(request, TriggerTrue)server_socket.sendto(response, client_address)print(服务响应, response.hex()) # 可以响应为空if num 1:assert bytes().fromhex(request.hex()[36:]).decode() ! NG, 实际扫码结果为{}不符合预期.format(bytes().fromhex(request.hex()[36:]).decode())breakrequest Falsefinally:# 清理连接server_socket.close() 这段代码是一个服务端程序是套接字UDP服务端。让我们分析主要的部分 1服务端设置 创建一个UDP套接字socket.AF_INET, socket.SOCK_DGRAM用于与客户端通信。绑定套接字到特定的地址和端口(192.168.1.188, 9600)。 2主循环 在一个无限循环中服务端等待从客户端接收请求。对于收到的请求根据请求的内容进行不同的处理。 3请求处理 判断请求是否包含特定的头部标识 800002。如果是读触发指令01则处理触发逻辑。如果是写触发结果指令02则处理扫码结果。如果是其他请求统一进行处理。 4触发逻辑 根据触发标志 (Trigger_rec) 的状态对触发指令进行相应的处理。首先清空触发信号然后再置位触发信号。 5扫码结果处理 对于写触发结果指令检查是否收到了预期的扫码结果。如果扫码结果不全为0则认为收到有效的扫码结果增加计数。如果结果为0继续等待扫码结果。 6响应处理 根据处理后的结果调用 recognition_frame 函数构建响应帧。将响应发送给客户端。 7断言和终止条件 当计数 num 达到1时使用断言检查扫码结果是否符合预期并终止程序。 8清理 在 finally 块中关闭套接字确保程序退出时资源被释放。 总体来说这个服务端程序用于处理来自客户端的请求其中包括了特定的触发指令和扫码结果指令。在处理这些指令时它通过 recognition_frame 函数构建响应并对结果进行相应的处理。
http://www.sadfv.cn/news/313436/

相关文章:

  • 机械行业做网站网站咨询弹窗是怎么做的
  • 网站网页制作教程天津网站备案
  • 网站开发培训培训班影视网站怎么做优化
  • 东莞网站设计风格微信产品展示小程序
  • 中国医院建设协会网站wordpress页面侧边栏没了
  • 成都网站建设 公司工具型网站有哪些
  • wordpress电影下载站seo优化杭州
  • 外贸网站平台seo推广wordpress使用百度云cdn
  • 个人网站建设流程怎么在手机上设计网站
  • 怎么在备案号添加网站微电商平台
  • 自适应的网站模板跟犀牛云一样做网站的
  • 云建站空间房屋装修效果图怎么制作
  • 徐州做网站企业茂名网站制作计划
  • 自己如何建一个网站python在线编程视频
  • 采集类淘宝客网站怎么做网站制作属于什么专业
  • 徐州城乡建设局网站做外贸主要在那些网站找单
  • 人人设计网官方网站知名企业创新案例
  • 福州正规网站建设公司推荐腾讯云可视化wordpress
  • 网站建设布吉银州手机网站建设
  • 电子商务网站建设有管理课后答案wordpress log 信息
  • 建模网站做网站建设销售员准备什么
  • 网站的平面设计图用ps做快速搭建展示型网站
  • 互联网营销工具有哪些潮州网站推广优化
  • 最新网站源码下载南京网页空间
  • 龙岩网站建设加盟深圳网站制作专业公司
  • iis7 无法添加网站北京网站建设电话
  • 高端汽车网站建设外贸流程图解
  • 贵阳营销型网站建设四川有那些网站建设公司
  • 营销型网站搭建的工作四川网站制作
  • 网站开发项目开发高唐网站