自定义协议
自定义应用层通信协议

自定义应用层通信协议应用层通信协议是计算机网络中实现不同应用程序之间数据交换的重要手段之一。
常见的应用层协议有HTTP、FTP、SMTP等,但有时候我们需要根据特定需求自定义一种应用层通信协议。
本文将介绍自定义应用层通信协议的意义、设计原则以及实现过程,并且分析其在实际应用中的优势和挑战。
一、自定义应用层通信协议的意义1.1 提高效率和性能自定义应用层通信协议可以根据具体应用的需求精确地设计消息格式和通信机制,避免了不必要的开销和冗余数据传输,从而提高通信效率和性能。
通过自定义协议,可以有效减少通信过程中的延迟和带宽占用,提升用户体验。
1.2 弥补已有协议的不足某些特定的应用场景下,现有的通用协议可能无法满足需求。
自定义协议可以根据具体需求定制化设计,弥补已有协议的不足。
例如,在物联网领域,由于设备类型繁多、通信要求复杂多样,自定义应用层通信协议可以更好地满足各类设备的需求。
1.3 提高安全性自定义应用层通信协议可以增加安全认证和加密机制,保护通信数据的隐私和完整性。
通过自定义协议,可以有效预防黑客攻击、信息窃取等安全威胁,提高系统的安全性。
二、自定义应用层通信协议的设计原则2.1 简洁明了自定义应用层通信协议应该尽量简洁明了,避免冗余和复杂的设计。
合理定义消息格式和通信机制,确保协议的易理解性和可扩展性。
2.2 可靠性和稳定性自定义协议在设计时要考虑通信的可靠性和稳定性。
要保证数据传输的有效性,尽量避免丢包和错误,可以采用差错校验、重传机制等手段来确保数据的可靠传输。
2.3 可扩展性自定义协议应具备良好的可扩展性,能够适应未来的需求变化。
在设计协议时,要考虑到新功能的引入和协议的升级,保证协议的灵活性和可持续发展。
三、自定义应用层通信协议的实现过程3.1 协议设计在协议设计阶段,首先确定通信的目标和需求,然后定义消息的格式和通信机制。
消息格式包括消息头、消息体和消息尾等部分,需要根据实际需求来确定。
自定义通信协议

自定义通信协议在计算机网络通信中,通信协议是计算机之间进行通信所遵循的规则和约定。
通信协议的设计和选择对于网络通信的效率和安全性至关重要。
除了常见的TCP/IP协议、HTTP协议等通用协议之外,有些特定的应用场景需要自定义通信协议来满足特定的需求。
自定义通信协议是指根据特定的通信需求和环境,由通信双方协商制定的适合自身应用的通信规则和约定。
自定义通信协议可以根据实际需求进行灵活定制,以满足特定应用场景下的通信要求。
首先,自定义通信协议的设计需要充分考虑通信的安全性。
在网络通信中,数据的安全性是至关重要的。
通过加密算法和身份认证机制,可以保障通信数据的机密性和完整性,防止数据在传输过程中被窃取或篡改。
因此,自定义通信协议需要考虑如何对通信数据进行加密和解密,以及如何进行身份验证和权限控制。
其次,自定义通信协议还需要考虑通信的效率和稳定性。
在实际的应用场景中,通信双方可能处于不同的网络环境下,通信的稳定性和效率会受到网络带宽、延迟等因素的影响。
因此,自定义通信协议需要设计合理的数据传输机制,以减少通信的延迟和丢包率,提高通信的稳定性和效率。
另外,自定义通信协议还需要考虑通信的灵活性和扩展性。
随着应用需求的变化,通信协议可能需要进行升级和扩展。
因此,自定义通信协议需要具备良好的扩展性,能够灵活地支持新的功能和特性的添加,同时保持与旧版本的兼容性。
在实际的应用中,自定义通信协议可以应用于各种场景,如物联网设备之间的通信、多人在线游戏的网络通信、金融交易系统的通信等。
通过自定义通信协议,可以更好地满足特定应用场景下的通信需求,提高通信的安全性、效率和稳定性。
总的来说,自定义通信协议的设计需要充分考虑通信的安全性、效率性、稳定性以及灵活性和扩展性,以满足特定应用场景下的通信需求。
通过合理设计和选择自定义通信协议,可以更好地支持各种应用场景下的网络通信,提高通信的质量和可靠性。
netty fileregion 自定义协议

netty fileregion 自定义协议Netty FileRegion是Netty提供的用于传输文件的类,它可以有效地在网络上传输文件。
FileRegion接口的实现类主要有两个:DefaultFileRegion和ChunkedFile。
自定义协议是指在网络通信中使用自己设计的数据格式和规则进行通信。
在使用Netty进行网络通信时,我们可以自定义协议来满足特定的业务需求。
在Netty中,可以通过编写自定义的编码器和解码器来实现自定义协议。
Encoder负责将业务数据转换为网络传输的格式,Decoder负责将接收到的网络传输的数据转换为业务数据。
例如,如果我们使用Netty传输文件,并且我们需要在文件内容前添加文件长度的信息,我们可以自定义一个协议,协议的格式可以是文件长度 + 文件内容。
具体实现方式如下:1. 定义一个编码器,用于将文件转换为网络传输的格式```javapublic class FileEncoder extends MessageToByteEncoder<File> { @Overrideprotected void encode(ChannelHandlerContext ctx, File file, ByteBuf out) throws Exception {FileInputStream fis = new FileInputStream(file);byte[] data = new byte[(int) file.length()];fis.read(data);fis.close();out.writeInt(data.length); // 写入文件长度out.writeBytes(data); // 写入文件内容}}```2. 创建一个解码器,用于将接收到的网络传输的数据转换为文件```javapublic class FileDecoder extends ByteToMessageDecoder {@Overrideprotected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {if (in.readableBytes() < 4) {return; // 若可读字节数小于4,则不足以获取到文件长度信息}int length = in.readInt(); // 获取文件长度if (in.readableBytes() < length) {in.resetReaderIndex(); // 字节不足以获取到完整的文件内容,等待下次读取return;}byte[] data = new byte[length];in.readBytes(data);File file = new File("received_file");FileOutputStream fos = new FileOutputStream(file); fos.write(data);fos.close();out.add(file);}}```3. 使用自定义的协议进行文件传输```javapublic class FileServerHandler extends SimpleChannelInboundHandler<File> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, File file) throws Exception {// 处理接收到的文件System.out.println("Received file: " +file.getName());}}public class FileServer {public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(newChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();p.addLast(new FileDecoder());p.addLast(new FileServerHandler());}}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);ChannelFuture f = b.bind(8888).sync();f.channel().closeFuture().sync();} finally {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}}}public class FileClient {public static void main(String[] args) throws Exception { EventLoopGroup workerGroup = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(workerGroup).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();p.addLast(new FileEncoder());}});ChannelFuture f = b.connect("localhost", 8888).sync();File file = new File("test_file.txt");f.channel().writeAndFlush(file).sync();f.channel().closeFuture().sync();} finally {workerGroup.shutdownGracefully();}}}```这样,就实现了使用自定义协议在Netty中传输文件的功能。
自定义通信协议例子

自定义通信协议例子自定义通讯协议本协议是由甲方(以下简称“甲方”)和乙方(以下简称“乙方”)共同签署,为规范双方之间的通讯行为而制定。
本协议中的各方身份、权利、义务、履行方式、期限、违约责任均是符合中国相关法律法规的。
一、双方的基本信息:甲方:名称:(填写甲方名称)地址:(填写甲方地址)联系人:(填写甲方联系人)联系电话:(填写甲方联系电话)电子邮件:(填写甲方电子邮件)乙方:名称:(填写乙方名称)地址:(填写乙方地址)联系人:(填写乙方联系人)联系电话:(填写乙方联系电话)电子邮件:(填写乙方电子邮件)二、各方身份、权利、义务、履行方式、期限、违约责任1.甲方的身份是通讯服务提供者,乙方是通讯服务使用者。
2.甲方的权利和义务:(1)提供稳定可靠的通讯服务。
(2)保障乙方的通讯隐私。
(3)保证服务质量及时有效的维护服务可靠性。
(4)在服务中不得出现任何违反中国相关法律法规的行为。
(5)服务期限为双方签署本协议之日起至协议终止。
(6)违约责任:如果甲方严重违反本协议规定,乙方有权要求甲方给予赔偿,赔偿数额以实际损失为准。
3.乙方的权利和义务:(1)按照本协议规定的规定向甲方支付通讯服务费用。
(2)按照甲方规定的方式、时间和条款向甲方提交通讯服务需求。
(3)在使用甲方的通讯服务时,不得进行违反中国相关法律法规的行为。
(4)服务期限为双方签署本协议之日起至协议终止。
(5)违约责任:如果乙方严重违反本协议规定,甲方有权要求乙方给予赔偿,赔偿数额以实际损失为准。
三、遵守中国相关法律法规本协议所涉及到的各项规定及双方行为均应遵守《中华人民共和国电信条例》、《中华人民共和国网络安全法》等相关法律法规。
双方应当严格遵守法律法规的规定,不得以任何方式违反法律法规。
四、法律效力和可执行性本协议自甲方与乙方签署之日起生效,在协议有效期内,双方应严格遵守本协议,协议到期前双方未达成续约或协议终止后,本协议自动失效。
如本协议的任何条款因与法律法规相抵触或被迫废止,其他条款仍然有效。
自定义通信协议

自定义通信协议1. 引言通信协议是计算机网络中进行信息传输的规则和约定。
自定义通信协议是指根据特定需求,自行设计和制定的通信规则。
本文将介绍自定义通信协议的基本概念、设计原则以及示例。
2. 自定义通信协议的基本概念自定义通信协议是一种特定领域的通信规则,在该协议下,通信的双方按照预先定义好的格式和规则进行信息交换。
自定义通信协议的设计可以灵活地满足特定需求,提高通信效率和安全性。
3. 自定义通信协议的设计原则设计一个好的自定义通信协议需要考虑以下几个原则:3.1 简洁性通信协议应该尽量简洁明了,避免过多的冗余信息和复杂的操作步骤。
简洁的通信协议能够提高通信效率,并减少出错的可能性。
3.2 安全性通信协议应该具备一定的安全性,防止信息被非法篡改和窃取。
可以采用加密算法和身份验证等手段来增强通信的安全性。
3.3 可扩展性通信协议应该具备一定的可扩展性,能够适应未来可能出现的新需求和新技术。
设计时应考虑到通信协议的可升级性,以便后续的功能扩展。
4. 自定义通信协议示例下面是一个简单的自定义通信协议示例,用于传输传感器数据:4.1 协议格式自定义通信协议的格式如下:| 数据类型 | 数据长度 | 数据 |•数据类型:表示数据的类型,如温度、湿度等。
•数据长度:表示数据的长度,以字节为单位。
•数据:实际的传感器数据。
4.2 示例协议包以下是一个示例的通信协议包:| 温度 | 1字节 | 25℃ |该协议包表示传输的是温度数据,数据长度为1字节,具体的数据为25℃。
4.3 示例协议流程示例通信协议的流程如下:1.传感器将数据按照协议格式打包。
2.数据包通过网络传输到接收端。
3.接收端按照协议格式解析数据包,获取传感器数据。
4.接收端对数据进行处理和存储。
5. 总结自定义通信协议是一种根据特定需求自行设计和制定的通信规则。
本文介绍了自定义通信协议的基本概念、设计原则以及一个示例。
设计一个好的自定义通信协议需要考虑简洁性、安全性和可扩展性等因素,以提高通信效率和安全性。
c语言自定义通讯协议的具体实现

c语言自定义通讯协议的具体实现在实际开发中,应用通信功能时不可避免地会使用通讯协议,常见的通讯协议一般有TCP/IP、UDP和HTTP等,但是在一些特殊场景下,需要使用自定义的通讯协议,本文将介绍c语言实现自定义通讯协议的具体实现方法。
一、通讯协议的概念通讯协议是一种规范,它定义了通讯的格式、内容、序列、错误控制等信息,使通信双方能够正确地理解和使用通信协议。
自定义通讯协议的实现需要遵守以下步骤:1、确定通讯协议内容首先需要确定自定义通讯协议的内容,包括通讯数据的格式、内容、长度、序列以及通讯的命令等信息。
一般情况下,自定义通讯协议应根据实际应用场景进行设计。
2、定义数据接口定义数据的输入输出接口是自定义通讯协议的重要一个步骤,一般情况下,数据接口应该尽量简单化,实现数据的快速解析以及传输过程中对数据的处理等功能。
3、实现协议解析功能协议解析功能是实现自定义通讯协议的重要一个内容,在实现协议解析功能时,可以利用c语言中的结构体来实现数据的存储、传输、解析等功能,同时,还需要实现数据的校验和、长度校验等功能,以保证数据传输的安全可靠性。
协议编码功能是实现自定义通讯协议的另一个重要内容,主要用于将应用数据编码成符合协议要求的数据格式,常用的编码方式有二进制编码和文本编码方式。
5、实现数据传输功能数据传输功能是自定义通讯协议的另一个重要内容,主要实现数据在网络上的传输功能,常见的传输方式有TCP/IP、UDP和HTTP等。
三、自定义通讯协议的优点1、提高系统的可扩展性和灵活性。
自定义通讯协议根据实际应用场景进行设计,可以更好的满足应用程序的需要,同时也提高了系统的可扩展性和灵活性。
2、提高通讯安全性。
自定义通讯协议拥有自己的通讯协议格式和加解密方式,以保证数据传输的安全可靠,提高通讯的安全性。
3、提高通讯速度和效率。
自定义通讯协议可以自由定义数据格式和传输方式,同时可以针对应用程序对数据传输进行优化处理,提高数据传输的速度和效率。
c语言自定义通讯协议的具体实现

c语言自定义通讯协议的具体实现
在C语言中,自定义通讯协议的具体实现可以分为以下几步:
1. 确定通讯协议的格式和内容:通讯协议应该包含哪些信息以及信息的格式是什么样的,如何标识数据包的开始和结束等。
2. 定义数据结构:根据通讯协议的格式和内容,定义合适的数据结构来存储数据。
例如,可以定义一个结构体来表示一个数据包,包含标识数据包的头部和尾部以及通讯协议中规定的各种信息。
3. 编写数据包的组装和解析函数:根据定义的数据结构,编写组装和解析函数,将数据转化为通讯协议中规定的格式,并将接收到的数据还原为原始数据。
4. 实现通讯协议的传输:根据通讯协议的传输方式,使用相应的函数或库实现数据的传输,如TCP/IP、串口通信等。
5. 测试和调试:进行测试和调试,确保通讯协议的实现符合预期,能够正常工作。
需要注意的是,在自定义通讯协议时,要考虑到通讯的稳定性和可靠性,避免数据丢失和传输错误的情况发生。
同时,还要考虑通讯协议的安全性,防止数据被篡改或窃取。
- 1 -。
单片机自定义协议通信

单片机自定义协议通信
首先,自定义协议通信的设计需要考虑数据帧的格式。
数据帧通常包括起始标志、地址信息、数据内容、校验位和结束标志等字段。
起始标志和结束标志用于标识数据帧的开始和结束,地址信息用于指示数据的发送方和接收方,数据内容是实际传输的信息,校验位用于检测数据的完整性和准确性。
其次,通信规则也是自定义协议通信设计的重要部分。
通信规则包括数据的发送和接收流程、数据帧的处理方式、重发机制、错误处理等。
在设计通信规则时,需要考虑通信的稳定性、实时性和可靠性。
另外,校验机制也是自定义协议通信设计中至关重要的部分。
常见的校验机制包括奇偶校验、CRC校验、校验和等,用于检测数据在传输过程中是否发生错误,以保证数据的准确性。
此外,单片机自定义协议通信还需要考虑通信的功耗、通信速率、通信距离等实际应用场景中的因素。
在实际应用中,需要根据具体的通信需求和环境来选择合适的通信协议设计方案。
总的来说,单片机自定义协议通信涉及到数据帧格式、通信规则、校验机制等多个方面的设计,需要综合考虑通信的稳定性、实时性、可靠性以及实际应用场景中的因素。
设计合理的自定义通信协议能够提高单片机系统的通信效率和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.通信协议的概念及其要素
在OSI开放互联参考模型中,对等实体之间数据单元在发送方逐层封装,在接收方的逐层解析。
发送方N层实体从N+1层实体得到的数据包称为服务数据单元(Service Data Unit,SDU)。
N层实体只将其视为需要本实体提供服务的数据,将服务数据单元进行封装,使其成为一个对方能够理解的数据单元(Protocol Data Unit,PDU),封装过程实际上是为SDU 增加对等实体间约定的控制信息(Protocol Control Information,PCI)的过程。
为了保证网络的各个功能的相对独立性,以及便于实现和维护,通常将协议划分为多个子协议,并且让这些协议保持一种层次结构,子协议的集合通常称为协议簇。
网络协议的分层有利于将复杂的问题分解成多个简单的问题,从而分而治之。
各层的协议由各层的实体实现,通信双方对等层中完成相同协议功能的实体称为对等实体。
对等实体按协议进行通信,所以协议反映的是对等层的对等实体之间的一种横向关系,严格地说,协议是对等实体共同遵守的规则和约定的集合。
通信协议精确地定义了双方通信控制信息和解释信息:发送方能将特定信息(文本、图片、音频、视频)按协议封装成指定格式的数据包,最终以串行化比特流在网络上传输;接收方接收到数据包后,根据协议将比特流解析为本地化数据,从而获取对方发送过来的原始信息。
通信协议包括三个要素:
(1)语法:规定了信息的结构和格式;
(2)语义:表明信息要表达的内容;
(3)同步:规则涉及双方的交互关系和事件顺序。
整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet互联网的核心协议。
2.通信协议开发步骤
(1)协议的开发主要包括协议设计、协议形式描述、协议实现和协议一致性测试。
协议的开发过程与步骤如图1所示。
图1 协议开发过程与步骤
(2)协议设计过程中的分组发送接收模型如图2所示。
图2协议设计过程中的分组发送接收模型
(3)协议的一致性测试
协议的一致性测试是指测试协议能否按照预想的控制策略实现正确的通信,主要体现在数据包通过信道从信源传送到信宿后,信宿能够根据协议正确的解析出原始信息。
协议的一致性测试如图3所示。
图3 协议一致性测试环境
根据测试环境的可以分为局部测试和分布式测试,如图4所示。
图4局部测试法、分布式测试法
3.数据包和数据报
为方便描述自定义协议,还是借用数据包和数据报来描述封装数据单元和传输数据单元,但这里的数据包和数据报完全不同于TCP/IP架构中的Packet和Datagram概念。
下文所述的数据包指封装的基本单位,以TLV(Type-Length-Value)格式封装基本消息单位;数据报Package是传输的基本单位,头部包含序列号和命令信息。
接收端根据命令信息分辨事件类型,做出不同的解析。
报文实体是多个TLV数据包组成的链表。
4.数据包TLV的设计
从应用层HTTP协议,到超文本置标语言HTML(HyperText Mark-up Language),再到可扩展置标语言XML(Extensible Markup Language),它们提供了数据的格式化存储、传输和格式化显示的规范,是网络通信的基石。
然而HTTP协议以及HTML/XML置标语言的本质就是定义一堆标签(Tag)对数据进行串行化序列化,然后接收方再根据标签解析、还原数据。
自定义通信协议的关键是对数据包的合理构造(construct)和正确解析(parse),即制定编解码规则。
抽象语法标记ASN(Abstract Syntax Notation)BER的长度确定的编码方式,由3部分组成Identifier octets、Length octets和Contents octets,实际上这就是一中TLV
(Type-Length-Value)模型:类型字段(Type或Tag)是关于标签和编码格式的信息;长度字段(Length)定义数值的长度;内容字段(Value)表示实际的数值。
因此,一个编码值又称TLV三元组。
编码可以是基本型或结构型,如果它表示一个简单类型的、完整的显式值,那么编码就是基本型(primitive);如果它表示的值具有嵌套结构,那么编码就是结构型(constructed)。
TLV编码就是指对Type(Tag)、Length和Value进行编码,形成比特流数据包;解码是编码的逆过程,是从比特流缓冲区中解析还原出原始数据。
采用C++编程语言设计TLV协议类,其类视图如图5所示。
图5 CTLV类视图
目前只提供设置整形值(int型)的setValue_Int和设置字符串值(C_String型)的SetValue_Cstring两个接口。
TLV将数据封装成包的格式如表1所示。
表1 TLV包格式
TLV包
头部包实体
m_dwTag m_nLen m_pValue
TLV的接口说明:
(1)值类型标签m_vtTag是内部辅助枚举变量,它根据构造TLV时传递的服务类型标签m_dwTag来确定。
(2)TLV::m_nLen在为TLV设置具体值时确定。
(3)TLV包的封装:
1)使用Tag参数创建一个TLV对象后,调用TLV::setValue_*方法为TLV填充具体值;2)调用TLV::toBuffer方法打包到缓冲区streamBuffer。
(4)TLV包的解析:创建一个TLV对象后,调用TLV::fromBuffer方法从缓冲区streamBuffer 解析出TLV。
(5)封装和解析涉及到本机字节顺序和网络字节顺序的转换问题。
(6)调用TLV::setValue_*方法填充TLV时,统一字节边界数为4。
5.数据报Package的设计
不同于底层的数据包/数据报只是对数据层次的封装解析,实际应用程序是以事件驱动的,因此必须注册不同的信令(事件类型标签),然后填充到数据报中。
接收端根据信令做出相应的事件处理。
例如在C/S通信系统中,客户端往往要先登录,通过服务器端的校验才能进行后续通信。
因此客户端运行后,需要构造并向服务器端发送含有LOGIN信令的包含用户名字符串strUserName和密码字符串strPassWord的数据报;服务器端解析LOGIN信令后做校验处理,然后发送含有LOGIN_RESPONSE信令和校验结果的回执数据报给客户端。
采用C++编程语言设计Package类,其类视图如图6所示。
图6 CPackage类视图
Package类将TLV封装成包的格式如表2所示。
表2 Package包格式
Package包
头部序列号包实体
m_nCmdL m_dwCmd m_dwCmdSta m_nSeq Count*
en ID te No Tlv
Package的接口说明:
(1)Package::m_nCmdLen是整个Package包的长度,将其作为首个字段的好处在于当传送大数据包时,接收方可以根据数据长度来控制读状态,从而将一个大数据包分批接收。
(2)Package::m_nCmdLen在构造函数中初始化为16,在调用Package::addTLV方法填充包实体时增长。
(3)Package包的封装:
1)创建Package对象后,调用Package::setHeader方法填充头部信令;
2)创建TL V对象并填充数据,再调用Package::addTLV方法填充包实体;
3)调用Package::toBuffer方法将Package打包到缓冲区streamBuffer。
(4)Package包的解析:
1)先创建一个Package对象,调用Package::fromBuffer方法从缓冲区streamBuffer先解析出Package的头部和序列号,再从剩余缓冲区中解析出TLV并将其串行化到链表。
2)调用Package::getTLV方法根据Tag从链表中查找具体TLV包,再调用TLV::getValue 方法取得具体值。
(5)Package::toBuffer方法和Package::fromBuffer方法主要遍历Package::m_TLV_List 列表,然后调用TLV::toBuffer方法和TLV::fromBuffer方法解析出TLV数据单元。
TLV数据包的功能测试(主要是本地测试)
鉴于实际通信数据最后都要转换成比特流,故只测试发送字符串类型的变量,仅测试协议能否正确打包、解析。
其他类型的普通数据都可以转换成字符串传输,最后,接收方根据
m_dwTag确定值类型m_vtTag,解析出具体值。
对TLV::setValue_C_String方法填充TLV的测试,需要考虑字节对齐问题。
对于长度为4字节倍数的C状态字符串,打包时省去末尾的‘/0’结束标志符。
需要测试长度非4倍数的字符串和长度为4倍数的字符串。
经本地测试,调用TLV::setValue_Int方法和TLV::setValue_C_String方法构造整形和字符串时,能够正确封装、正确解析。
Package数据报的功能测试,主要是将TLV组合成包,然后添加信令,完成特定的通信。
对登陆LOGIN和发送消息SUBMIT_SM的测试表明Package协议能正确封装、正确解析。
在实际项目中使用Package通信协议,对于稍大一点的数据块需要控制好读的步骤,以便能接收整包完整的信息。