LR发送16进制转二进制socket报文常见问题及解决方案

需要对刷卡取车、还车、开门、关门进行性能测试。车辆刷卡是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时没有内存问题

查找LRsocket报文发送的相关函数。

经试验发现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;

}

posted on 2016-10-08 13:20  gracetest  阅读(3275)  评论(0编辑  收藏  举报

导航