RF-Ranmmbock库使用心得2-udp发送接收使用模板的方式实现
总结起来本次对rammbock库使用的功能就是udp的数据发送和接收,它主要 提供的方式有2种,在此介绍一下第一种模板的方式发送和接收
资料:
https://github.com/robotframework/Rammbock/wiki/RammbockUserGuide
https://github.com/robotframework/Rammbock/tree/master/atest
环境:
1.使用socketTool工具(调试接收和发送数据情况)
2.RF-ride
关键词:
Client sends message
Client Receives message
Server sends message
Server Receives message
在userGuide中介绍了整个如何制定协议-模板-发送接收数据的情况
1.制定协议:
按照开发给的通讯协议(发送的协议和接收的协议),制定协议的公共部分,在这个库中协议只能被制定一个,故需要提供的实际协议格式需要一样。而且基本帧头部分是一样的。如下图为发送帧结构和应答帧结构
分析协议:
1.帧结构保持一致
2.帧头部分共6个字节
a)第一个(2b)0-数据长度定长,非定值,需要根据数据区进行+1确定内容;
b)第二个(1b)-消息序列号也是定长,非定值,该值一般是为了做消息标识的,若接收方不进行校验的话,可以当定值处理;
c)第三个(1b)-类型,发送和接收的内容不一致,定长,非定值
d)第四个(2b)-crc校验,需要对帧内容进行crc校验算法,需要引入算法(接收方和发送发校验算法需要一致),当前不做判断,故可以当定长、定值处理;
3.数据区部分
这一部分为非定长、非定值(目前来说是比较麻烦的一部分)
4.帧尾:0xff
按照分析,定制协议
define dmi protocol
[Documentation] 定义dmi协议
... 数据长度和消息序列号,crc均设置了默认值
new protocol dmi
u16 dataLength
u8 serialNum 1
u8 messageType
u16 crc 0
pdu dataLength
end protocol
注意点:
1.结构要完整,new protocol xxx。。。。end protocol
2.u8表示一个无符号字节,同理u16为2b,u32为4b,若你需要6b,可以通过叠加的方式2+4实现
3.pdu表示不定长,这里为数据区+帧尾,此处需要注意,pdu的用法只能用在最后
4.这里第一个u16和最后一个pdu都为dataLength,因为当确定了pdu的dataLength内容之后,U16的dataLength也确定了
协议就定完了~~
接下来需要按照不同的发送接收内容定制模板
分析:
1.发送协议,可以按照类型可以定制3个模板,每个模板中增加的数据区以及帧尾(也是按照业务逻辑来进行的分类)
2.不定制模板,直接在发送关键词中写明类型,以及pdu中的数据区的具体内容以及帧尾ff
按照以上分析,选择1,会使代码更加规范,显示不会很冗长,更易读一点
如下图为其中一种类型需要发的数据:
制定的模板
GYK-18 SendBC1Cmd templates
[Documentation] 给bc1发送命令模板
New Message SetBC1Cmd dmi header:messageType:0x51
u8 cmdType
u8 dataLen 4
u32 dataValue
u8 dataEnd 0xff
Save template SetBC1CmdTemplate
注意点:
1.New Message这个关键词,在关键词查询的example中描述的一点都不准确,已经不能说不详细了,他协议的引用部分不能写成protocol=dmi,只能写dmi,否则不能识别后面的参数
2.参数部分,一定要加header表示是加在头部(这个真的也很吐血)
3.下面写的为在协议的基础上增加的部分,均为定长,若定值直接写,非定值为空即可
4.保存这个模板,并重命名模板,这个是为了直接引用写的,估计不写直接将这个模板运行一遍也是可以的
5.该模板只实现了定长的模式,若是模板中也出现不定长的情况(目前我还没有解决,试过有一直报错,难受呀~~,故出现这种情况的,都直接用另一种发送接收方式实现!!)
模板也写完啦~~~
接下来写发送和接收关键词
发送和接收需要用sockettool进行配合进行,先进行客户端和服务器的创建
由于使用udp的传输方式,那么不需要管那个是客户端和服务端,我这里将自己的程序设置为客户端,那么socketTool则为服务端,故我程序上需要使用到的关键词为
Client sends message
Client Receives message
注意点:
1.创建客户端发送数据时,需要用connect到socketTool创建的服务器上
2.可以创建多个客户端,但是需要注意的时,一定要将name=client1标注清楚,默认不填会发到最近连接的服务器上去,可能导致发错的情况
3.创建客户端,以及上面的定协议模板,在使用时,最好写在setup中,特别是客户端重复创建,会导致后面创建的客户端无法使用,报错
创建完连接连接,就可以先初步调试一下是否可以发送接收数据~~
发送数据
sent BC1Command Message
[Arguments] ${cmdNum} ${dataValue}
[Documentation] 发送bc1命令,参数${cmdNum}${dataValue}均为十六进制带0x
Load Template SetBC1CmdTemplate
Client sends message cmdType:${cmdNum} dataValue:${dataValue} name=dmiclient2
注意点
1.发送关键词中将模板中不定值的部分定值发送,为空会报错,这个是需要用[:],后面关键词参数部分用【=】区分
2.所有的参数若没有做特殊提示它是什么进制的,默认会认为十进制,在协议中基本都会使用十六进制,故传参时,需要特别注意加上0x,如0x01F4表示传入的为十进制的500,若你只写01F4,她会识别为01F4的十进制数
3.发送会以十六进制发送到socketTool中
接收数据
receive BC1Command Message
[Arguments] ${timeout}
Load Template RevBC1CmdTemplate
Client Receives Message name=dmiclient2 timeout=${timeout}
1.接收数据,也需要根据他的模板来进行接收,这个模板,他数据区为空
2.若模板中存在数据区,与发送一样的格式加在中间,会直接在接收到数据的同时,进行比较,直接起到检查点的作用
(这个也是只实现了定长的情况,若接收的数据存在不定长的未实现!!)
3.接收到的数据也是以十六进制进行比较的
以上:用模板的方式实现发送接收信息
难点:制定模板
缺点:在不定长时没有实现功能
若找到实现方式,会加更~~