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,无法进行解码(吐血)