python通信仿真_通信协议TLV的介绍及在python下的代码实现及仿真

2023-11-03

TLV协议是一种通讯协议,一般将数据封装成TLV的形式,即Tag,Length,Value。协议就是指通信双方对数据传输控制的一种规定,规定了数据格式,同步方式,传送速度,传送步骤的问题作出统一的规定。可以理解为两个节点之间为了协同工作,协商一定的规则和约定。例如我们会规定字节序,各个字段类型等。

TLV 是一种可变的格式,其中:

T 可以理解为 Tag 或 Type ,用于标识标签或者编码格式信息;

L 定义数值的长度;

V 表示实际的数值。

T 和 L 的长度固定,一般是2或4个字节,V 的长度由 Length 指定。

图例帧格式如下所示:

由于用到这块,我就自己弄了一个python下的仿真代码,这里就给大家demo一下了:

服务端:

import socket

import threading

import pickle

import time

from TLV import*

#定义保存所有socket的列表

socket_list =[]#创建socket对象

ss =socket.socket()#将socket绑定到本机IP和端口

ss.bind((‘localhost‘, 2333))#服务端开始监听来自客户端的连接

ss.listen()

tlv= TLV(t_ext=7, l_ext=7)

def server_target(s):

try:#采用循环不断地从socket中读取客户端发送过来的数据

while True:

line=input()if line is None or line ==‘exit‘:breaktime.sleep(2)

tlv.add(8,line)

data=pickle.dumps(tlv)

s.send(data)

except Exception:

print(Exception.with_traceback())while True:#此行代码会阻塞,将一直等待别人的连接

s, addr =ss.accept()#socket_list.append(s)

#每当客户端连接后启动一个线程为该客户端服务

threading.Thread(target=server_target, args=(s, )).start()

客户端:

importsocketimportthreadingimportpicklefrom TLV import *

#创建socket对象

s =socket.socket()#连接远程主机

s.connect((‘localhost‘, 2333))defread_from_server(s):try:

data= pickle.loads(s.recv(2048))#test

tlvp = TLVParser(data.buffer, t_ext=7, l_ext=7)for avp intlvp.parse():print("%d(%d): %s" % (avp["type"], avp["length"], avp["value"]))#return s.recv(2048).decode(‘utf-8‘)

returntlvp#如果捕获到异常,则表明该socket对应的客户端已经关闭

except:#删除该socket

socket_list.remove(s) #①

defread_server(s):try:whileTrue:

contend=read_from_server(s)if contend isNone:break

except:print(Exception.with_traceback())#客户端启动线程不断地读取来自服务器的数据

threading.Thread(target=read_server, args=(s, )).start() #①

TLV的实现:

from scapy.all import *

classTLVError(Exception):pass

classTLV:def __init__(self, tl_in_l=False, t_ext=0, l_ext=0):

self.buffer= ""self.tl_in_l=tl_in_l

self.t_ext=t_ext

self.l_ext=l_extdef_int(self, i, ext):

maxi= 1<<8

if ext >0:

maxi= (1 <

holdstr= ""holder=i

extend=0

count= 1

while holder >=maxi:

count+= 1newnum= (holder & (maxi - 1))

holdstr= chr(newnum | extend) +holdstr

extend=maxi

holder/=maxi

holdstr= chr(holder | extend) +holdstrreturnholdstrdef_t(self, t):if self.t_ext == 0 and t > 256:raise TLVError("type > 256 and no extension bit set")returnself._int(t, self.t_ext)def_l(self, l):if self.l_ext == 0 and l > 256:raise TLVError("length > 256 and no extension bit set")returnself._int(l, self.l_ext)def add(self, t, v, l=None):

self.buffer+=self._t(t)

length= 0 if l is None elselifself.tl_in_l:

length+=tif l isNone:

length+=len(v)

self.buffer+=self._l(length)

self.buffer+=vdef __str__(self):returnself.bufferdef __repr__(self):returnself.bufferclassTLVParser:def __init__(self, buffer, tl_in_l=False, t_ext=0, l_ext=0):

self.buffer=buffer

self.tl_in_l=tl_in_l

self.t_ext=t_ext

self.l_ext=l_ext

self.offset=0def_get_i(self, i_ext):try:

byte=ord(self.buffer[self.offset])exceptIndexError:raise TLVError("Not enough data")

ext= 1 << (i_ext if i_ext > 0 else 8)

i=0while byte &ext:

i+= (byte & (ext - 1))

i<<=i_ext

self.offset+= 1

try:

byte=ord(self.buffer[self.offset])exceptIndexError:raise TLVError("Not enough data")

i+=byte

self.offset+= 1

returnidef_get_tlv(self):

t=self._get_i(self.t_ext)

l=self._get_i(self.l_ext)if self.offset + l >len(self.buffer):raise TLVError("Buffer not long enough to encompass TLV")

v= self.buffer[self.offset:self.offset+l]

self.offset+=lreturn(t, l, v)defparse(self):while self.offset

t, l, v=self._get_tlv()yield{"type": t,"length": l,"value": v,

}#Test/example program for building TLVs and parsing the TLVs

if __name__ == "__main__":

tlv= TLV(t_ext=7, l_ext=7)

tlv.add(10, "Foobar")

tlv.add(16, "Bladibla")#hexdump(tlv)

tlvp = TLVParser(tlv.buffer, t_ext=7, l_ext=7)for avp intlvp.parse():print ("%d(%d): %s" % (avp["type"], avp["length"], avp["value"]))

具体的代码运行结果就不贴了,对懂得python的同学来说,这个很简单的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python通信仿真_通信协议TLV的介绍及在python下的代码实现及仿真 的相关文章

  • PS 2023 24.7 Beta Ai 如何解决橙色错误弹窗问题?

    距离Adobe软件公司首次将图像编辑及数字绘画软件Photoshop推出到大众面前已经过去35年 最近该公司又再次书写了属于Photoshop的历史新篇章 Adobe 发布的 Photoshop Beta 新增 创意填充 Generativ
  • Linux操作系统shell指令详解

    shell指令基本概念 命令行提示符 ubuntu 用户名 分隔符 ubuntu 主机名 家目录 当前所在的路径 普通用户权限 root 切换用户 su 用户名 gt 切换到指定用户 su gt 默认切换到超级用户 sudo 加在指令前 g
  • 【Hyperledger Fabric 开发学习1】 环境搭建

    1 概览 准备工作 1 系统环境准备 Ubuntu 20 02 LTC 2 apt 更换镜像源 3 辅助工具安装 4 安装go 5 安装容器docker和docker compose Hyperledger Fabric安装 方法1 以bo
  • Unity常见平台汇总

    UNITY EDITOR Unity编辑器 UNITY EDITOR WIN Windows 操作系统 UNITY EDITOR OSX macos操作系统 UNITY STANDALONE OSX 专门为macos 包括Universal
  • std::atomic和std::mutex区别

    std atomic介绍 模板类std atomic是C 11提供的原子操作类型 头文件 include
  • (附源码)node.js蒲公英旅游系统 毕业设计15565

    nodejs 蒲公英旅游系统 摘 要 随着社会的发展 社会的各行各业都在利用信息化时代的优势 计算机的优势和普及使得各种信息系统的开发成为必需 蒲公英旅游系统设计 主要的模块包括查看后台首页 轮播图 轮播图管理 公告管理 公告 资源管理 旅
  • 华为鸿蒙电脑操作系统测试版,华为鸿蒙OS测试

    软件介绍 华为鸿蒙OS测试平台是一款华为测试手机新系统的测试平台 这里可以让申请的用户最新体验华为的最新鸿蒙系统 让数百万用户去发现华为系统的不足 然后华为官方进行优化 我相信很多人都愿意做这个小白鼠 快来关注吧 华为鸿蒙OS测试软件简介
  • 【满分】【华为OD机试真题2023 JAVA&JS】Excel单元格数值统计

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 Excel单元格数值统计 知识点递归循环数组 时间限制 2s 空间限制 256MB 限定语言 不限 题目描述 Excel工作表中对选定区域的数值进行统计的功能非常实用 仿照Exc
  • 使用Simulink进行stm32开发2

    使用Simulink进行stm32开发2 小车直流电机控制 1 配置工程文件 simulink 模块搭建 stm32驱动模块 配置数据字典 配置电机控制函数 模块封装 加入输入并生成代码 基于对模型开发的学习 在这里用simulink搭建小
  • MyBatis 使用数组作为参数

  • OpenGL教程(五)

    前言 正如之前章节所提到的 着色器就是运行在GPU上的小程序 简单来说 着色器就是仅仅是一个将输入数据经过一定转换然后输出的过程 着色器之间是非常独立的 彼此之间除了输入输出之外没有其他交流 这篇文章将会详细介绍着色器以及编写着色器的语言G
  • 上下div之间有间距的问题

    我写了4个div 上下分布 均存在间距 代码以及效果如下 div1 height 100px background color blue position relative div2 height 100px background colo
  • HTTP请求方式中8种请求方法(简单介绍)

    HTTP请求方式中8种请求方法 简单介绍 简单介绍 HTTP是超文本传输协议 其定义了客户端与服务器端之间文本传输的规范 HTTP默认使用80端口 这个端口指的是服务端的端口 而客户端使用的端口是动态分配的 当我们没有指定端口访问时 浏览器
  • [Unity2D/3D]实用的血条制作(第一期)

    Unity2D 3D 实用的血条制作 第一期 在多数的游戏制作中 都会涉及到血条的制作 不论是在2D游戏中还是3D游戏中都非常常见 如何制作一款简易的血条呢 这里我给结合自己自学过程中用到的血条制作方法给大家分享一下我是如何制作血条的 效果
  • atoi函数(c语言)

    目录 atoi函数的说明 函数改编以及思路 代码 代码注释 atoi函数的说明 该函数的作用是将一字符串变为一整型类型的数字输出出来 若字符串内无数字则输出0 此处输出按十进制输出 字符串开头的空格会自动扫描为空 函数改编以及思路 对该函数
  • iframe无边框(隐藏边框)

    用css的border none来去掉iframe的边框在IE下起不了作用 将iframe的frameborder属性的值设为no就可以
  • Java--==与equals()的区别

    一 使用的对象 基本数据类型 equals 引用数据类型 二 比较内容 是否为同一地址 equals 未重写 是否为同一地址 已重写 引用数据类型内容 三 重写 public boolean equals Objeat obj if thi
  • Python接单一个月,副业居然比主业收入要多?

    python爬虫肯定是可以当副业的 我身边一个伙伴就靠会python爬虫这一项技能一个月差不多能有一万多收入 他截图给我看的他的收入图是这样的 人家一个月就靠接单这个副业都比很多人主业收入要多 每个月除主业外还有一万多收入 财务就相对自由的
  • 学习笔记二:IBIS模型编辑报错纠正

    新建IBIS文件后 写好了相应的IBIS模型文件 写好文件后 最好要检查下是否符合ibis语法 注意 第一点 IBIS头文件的 File name 此处名称需要和文件名称相同 同时名称字符数需在12个字符之内 否则会报错 File name

随机推荐

  • 一个javaer面试Python

    Python初面 一 初面缘由 今天是2022年的6月18日 广州 中雨转阴 非天气预报 我怀揣着紧张而有激动的心情趁着周末悄悄去面试了一次 说是去面试 其实也和玩差不多 公司的工作氛围很不错 空调很凉 零食很多 但是我没有心情享用 附上一
  • HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

    我本身不是做天线设计的 所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真 一般2 5D的仿真软件无法对过孔和跨平面进行仿真 所以要借助三维电磁软件进行 今天就针对PCB进行裁剪 为什么要裁剪 以为如果把整个PCB一起仿真的话
  • 移动APP专项测试

    什么是移动端测试 移动端测试是指对移动应用进行的测试 即实体的特性满足需求的特性 简言之就是针对移动平台的软件进行的测试 比如针对手机 ipad等平台上的各种app功能和性能展开的测试 相较于传统的web端的测试 移动端的测试受手机屏幕大小
  • 127.0.0.1和localhost的区别

    要比较两个东西有什么不同 首先要弄清两者的概念 所以 我们从概念开始 localhost 也叫local 正确的解释是 本地服务器 127 0 0 1 在windows等系统的正确解释是 本机地址 本机服务器 我们再看看他们的工作原理 lo
  • 关于块元素和行元素之间的转换

    如何让块元素变成行元素 将块级元素设置为行内元素 inline 可以通过以下几种方式 1 display inline 这个是最直接的方式 通过设置display样式为inline 可以将块级元素变为行内元素 例如 css div disp
  • element的日期组件-两个的和单个的组件

    dateOne vue
  • 云计算技术基础第1章 云的概念以及类型

    章节安排 第一章 云的概念及类型 第二章 虚拟化技术 第三章 云计算的架构和国内外研究现状 第四章 云计算与大数据 第五章 海量数据存储技术 第六章 云平台应用 本章内容 计算模式的回顾 云计算概念与特征 云计算的分类 云计算的发展动因 云
  • Spring Cloud Alibaba 大型微服务项目实战

    作者介绍 程序员十三 多年一线开发经验 历任高级开发工程师 后端主程 技术部门主管等职位 同时也是开源项目的爱好者和贡献者 掘金优秀作者 CSDN 博客专家 实体图书作者 专栏作者 视频讲师 小册介绍 Spring Cloud Alibab
  • 利用Python通过频谱分析和KNN完成iphone拨号的语音识别

    最近这段时间 学校里的事情实在太多了 从七月下旬一直到八月底实验室里基本天天十二点或者通宵 实在是没有精力和时间来写博客 这周老师出国开会 也算有了一个短暂的休息机会 刚好写点有意思的东西 上周在天津的会议上碰到一个北交的姐们儿 她想利用小
  • IDEA集成Git操作

    IDEA集成Git操作 IDEA绑定Git仓库 在需要的工程目录下创建Git仓库并完成仓库基本设置 此时IDEA界面出现的变化 若出现此变化 说明IDEA绑定Git仓库成功 IDEA集成的Git操作 右上角选项为Git基本操作 懒人操作 文
  • EMQX v4 安装及组建集群、设置负载均衡

    准备工作 操作系统ubuntu 16 04 虚拟机VMware Workstation 12 Pro 一 安装EMQX 1 打开EMQ首页 https www emqx io cn 2 选择产品 gt EMQ X Broker 3 在ubu
  • 机试复试准备中--梦校(华科)真题

    一 矩阵转置 二 统计单词 写法一 读取一整行 写法二 依次读入每一个单词 三 二叉排序树 DFS 四 IP地址 五 特殊排序 六 a b 高精度加法 七 奇偶校验 八 最大的两个数 九 二叉树遍历 DFS 十 成绩排序 十一 守形数 十二
  • vue:webpack打包过程中的常见错误-加载CSS文件

    问题1 ReferenceError dirname is not defined 解决方法 将 dirname写为 dirname 注意是两条 问题2 npm ERR code ERESOLVE npm ERR ERESOLVE unab
  • C# 任意开次方,次幂, 开平方,开三次方,平方根, 三次方根

    double a 0 开任意次方的关键是 1 0 2 必须写 0 点零 如果不写 就永远等于1 具体原因不清楚 可以测试代码 a Math Pow 2 1 2 可以跟开平方对比一下 开平方 平方根 a Math Pow 2 1 0 2 开任
  • c# yield 用法

    返回类型必须为 IEnumerable IEnumerable
  • 洛谷 P3374 【模板】树状数组 1

    题目链接 https www luogu com cn problem P3374 include
  • 标签平滑(label smoothing)

    目录 1 标签平滑主要解决什么问题 2 标签平滑是怎么操作的 3 标签平滑公式 4 代码实现 标签平滑 label smoothing 出自GoogleNet v3 关于one hot编码的详细知识请见 One hot编码 1 标签平滑主要
  • HDMI与TMDS接口

    目录 0 Xilinx的HDMI 1 4 2 0 Transmitter Subsystem Product Guide 1 HDMI是新一代的多媒体接口标准 2 HDMI向下兼容DVI 3 TMDS 最小化传输差分信号 4 TMDS编码算
  • DB2多行转一行【XML方式】

    分组然后合并 然后去除XML标签 SELECT replace replace replace xml2clob xmlagg xmlelement name A 字段 a 分隔符 a a from 表 group by 分组字段 如 SE
  • python通信仿真_通信协议TLV的介绍及在python下的代码实现及仿真

    TLV协议是一种通讯协议 一般将数据封装成TLV的形式 即Tag Length Value 协议就是指通信双方对数据传输控制的一种规定 规定了数据格式 同步方式 传送速度 传送步骤的问题作出统一的规定 可以理解为两个节点之间为了协同工作 协