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;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM