小豆子的笔记QAQ

导航

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.接收到的数据也是以十六进制进行比较的

 

以上:用模板的方式实现发送接收信息

难点:制定模板

缺点:在不定长时没有实现功能

若找到实现方式,会加更~~

 

posted on 2019-07-17 15:14  小豆子的笔记QAQ  阅读(525)  评论(0编辑  收藏  举报