小豆子的笔记QAQ

导航

RF-Rammbock库使用心得3-udp发送接收使用模板的方式实现2

上篇中的缺陷:不定长的数据发送和接收

使用另一种关键词发送二进制文本的方式实现(将协议中的所有帧按照一定顺序拼接起来)

 

关键词:

Client Sends Binary

Client Receives Binary

Server Sends Binary

Server Receives Binary

sent DMIdata Message
    [Arguments]    ${QueryCmd}    ${ExpectLen}    ${ExpectData}
    [Documentation]    使用发送二进制的方法实现,参数${QueryCmd}${ExpectData}为十六进制且一定需要加0x,${ExpectLen}为十进制
    ${dataLength_Ev}    Evaluate    eval('1+1+${ExpectLen}+1')
    ${dataLength_hex}    Convert To Hex    ${dataLength_Ev}    length=2
    ${QueryCmd_int}    Convert To Integer    ${QueryCmd}    16
    ${QueryCmd_hex}    Convert To Hex    ${QueryCmd_int}    length=2
    ${ExpectLen_hex}    Convert To Hex    ${ExpectLen}    length=2
    ${ExpectData_int}    Convert To Integer    ${ExpectData}    16
    ${length_hex}    Evaluate    eval('${ExpectLen}*2')
    ${ExpectData_hex}    Convert To Hex    ${ExpectData_int}    length=${length_hex}
    ${SendMsg}    Set Variable    00${dataLength_hex}01520000${QueryCmd_hex}${ExpectLen_hex}${ExpectData_hex}ff
    ${SendMsg_by}    Convert To Bytes    ${SendMsg}    hex
    Client Sends Binary    ${SendMsg_by}    name=dmiclient

注意点:

1.由于为了测试用例传参的统一性,上篇显示输入参数均为十六进制0x传入,故该接口传入的时候,也需要统一,但是字符串拼接是不需要0x的前缀的,故需要先通过转化去掉0x

2.将字符串拼接成长度为2的十六进制之后,需要通过Convert To Bytes转化为字节为\x01的情况去发送,否则会报错

3.这样显示在socketTool中为十六进制的方式

发送就写完了~~~

接收信息

receive DMIdata Message
    [Arguments]    ${QueryCmd}    ${timeout}
    [Documentation]    接收回来的数据需要为字符串的形式,参数${QueryCmd}为十六进制带0x
    ...    若直接十六进制收到00,会显示为空,无法进行解析
    ...    故要求dmi发回的数据为字符串格式
    ...    程序处理
    ...    1.比较返回的数据命令号是否与发送的一致(0x00)
    ...    2.比较返回的数据是否为05
    ...    3.打印了错误返回值
    ${RevMsg}=    Client Receives Binary    name=dmiclient    timeout=${timeout}
    ${RevMsg_1}    Evaluate    ",".join(['${RevMsg}'[2*i:2*(i+1)] for i in range(len('${RevMsg}')/2)])
    ${RevMsg_2}    Evaluate    '${RevMsg_1}'.split(",")
    ${int}    Convert To Integer    ${RevMsg_2}[7]    16
    ${hex}    Convert To Hex    ${int}    prefix=0x    length=2
    Should Be Equal    ${hex}    ${QueryCmd}
    Should Be Equal    ${RevMsg_2}[6]    05
    log    打印错误的具体返回值:${RevMsg_2}[7:]

注意点:

1.由于若正常软件发十六进制数据给我,发现00,用这个关键词接收直接显示为空,查了一下,该关键词接收的数据是按照ascii码进行接收的,当接收Null Byte的时候会接收不到,故该方法其实是不适合的。暂时的解决方法是,直接让开发返回字符串给我,直接对字符串进行校验

2.收到字符串,需要对它进行分割,然后取出对应位置的值,进行校验即可

 

 

好处:不需要制定协议、模板

难点:拼接字符串(需要按照不同的传参输入各种转化成需要的样子)

恶心点:是ascii码接收的,若接收到00的十六进制数据,直接为空,就是说接收NUll byte,无法进行解码(吐血)

 

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