zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    关于前端复用的构思
    react-redux单元测试(基于react-addons-test-utils,mocha)
    关于windows下NODE_ENV=test无效的情况解决办法
    javascript柯里化及组合函数~
    如何使用函数式编程?
    redux源码解析-函数式编程
    react案例->新闻移动客户端--(react+redux+es6+webpack+es6的spa应用)
    jQuery高级技巧——性能优化篇
    jQuery高级技巧——DOM操作篇
    使用checkbox实现纯CSS下拉框
  • 原文地址:https://www.cnblogs.com/zhuqq/p/5938180.html
Copyright © 2011-2022 走看看