需要對刷卡取車、還車、開門、關門進行性能測試。車輛刷卡是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;
}