需要对刷卡取车、还车、开门、关门进行性能测试。车辆刷卡是socket协议,mina服务器只能识别二进制,所以需要将报文从16进制转换成二进制进行发送,编写测试脚本期间,出现一些问题,本文主要对出现的问题及该问题的解决方法做了一个总结,希望对以后遇到该问题的同志们有些帮助。
LR发送socket协议格式:
创建socket连接(长连接和短连接),发送报文,接收报文,关闭连接;此处使用短连接
rc=lrs_create_socket("socket0", "TCP", "LocalHost=0","RemoteHost=10.10.8.62:4008", LrsLastArg);//创建Socket连接
lrs_send("socket0", "buf0", LrsLastArg);//发送buf0,buf0为在data.ws中定义的发送变量
lrs_receive("socket0", "buf1", LrsLastArg); //接收消息,存放在buf1中,buf1是在data.ws中定义的接收数组,注意数组长度一定要大于等于实际接收长度
lrs_close_socket("socket0");
问题一:转码后,如何将报文变量sendbuf转换成LR识别的buf0
经查询可以使用lrs_set_send_buffer函数,lrs_set_send_buffer(”socket0”,sendbuf,30);
lrs_set_send_buffer 被执行后, 他后面的lrs_send 的内容便不会被发送出去,必须搭配lrs_send(“socket0”,”buf0”,LrsLastArg)发送buf0
函数说明:
The lrs_set_send_buffer function specifies the buffer to send in the next call to lrs_send. The buffer specified in lrs_set_send_buffer is sent, and not the buffer designated in the lrs_send function.
使用这俩个函数在理论上是可以将报文发送成功的,实际执行脚本后,报错内存问题,经试验报文长度超过16时该函数报错内存问题;
问题二:如何保证报文长度超过16时没有内存问题
查找LR中socket报文发送的相关函数。
经试验发现lrs_save_param_ex ( char *s_desc, char *type, char *buff, int offset, int length, char *encoding, char *param );函数可以解决此问题。
以下是完整报文:
#include "lrs.h"
char ASCCITALBE[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,'a','b','c','d','e','f'};
char GetHafBcd(char value)
{
char i;
for(i = 0; i < 16;i++)
{
if(value == ASCCITALBE[i])
return i;
}
return 0;
}
void BCDToHex(char *pbuf,char *out,int len )
{
char i,value;
len >>=1;
for(i = 0; i < len;i++)
{
value = GetHafBcd(*pbuf);
value<<=4;
pbuf++;
value|= GetHafBcd(*pbuf);
pbuf++;
*out = value;
out++;
}
}
Action()
{
char *recvbuf;
int recvlen=0,i;
int rc;
char sendlen,*sendpoint,sendbuf[256];
char *msgin = "<param>";
char a[94];
int j=0;
lrs_startup(257);
strcpy(a, lr_eval_string("<param>"));
memset(sendbuf,0,128);
sendlen =strlen(a);
BCDToHex(a,sendbuf,sendlen);
lr_start_transaction("GetCar");
lr_start_transaction("Conn_1");
rc=lrs_create_socket("socket0", "TCP", "LocalHost=0","RemoteHost=10.10.8.62:4008", LrsLastArg);//创建Socket连接
if (rc != 0 ) {
lr_end_transaction("Conn_1", LR_FAIL);
lr_end_transaction ("GetCar", LR_FAIL);
return 0;
}
lr_end_transaction("Conn_1", LR_PASS); //判断socket是否链接成功的事务,0表示创建成功
lrs_save_param_ex("socket0", "user", sendbuf, 0, 48,"ascii", "size_param");
lrs_send("socket0", "buf0", LrsLastArg);//发送buf0,buf0为在data.ws中定义的发送变量
//lr_think_time(5);
lrs_receive("socket0", "buf1", LrsLastArg); //接收消息,存放在buf1中,buf1是在data.ws中定义的接收数组,注意数组长度一定要大于等于实际接收长度
lrs_get_last_received_buffer("socket0",&recvbuf,&recvlen);//把Socket最后接收的字节数组,长度放在recvlen中,内容放在recvbuf中
if(recvlen>0)
lr_end_transaction("GetCar", LR_PASS);
else
lr_end_transaction ("GetCar", LR_FAIL);
lrs_disable_socket("socket0", DISABLE_SEND_RECV);
lrs_close_socket("socket0");
return 0;
}