TLV协议说明:
T(Type)字段表示数据包类型,传输中定义为short类型;L(length)字段表示数据包长度(不包括类型和长度字段本身),传输中定义为long类型.T和L共同组成包头;V(value)表示数据包信息。
第三方要求(采用小端模式(little endian)发送,每个字段为了扩展需要,预留一定的字节,如果实际数据并未占满字段空间,末尾以ASCII码'\0'结束(仅对字符串)).比如其中一个数据包:Type length value
<-2-> <--4--> <------28-------->value 为下面的信息字段名 字段类型 字段长度 说明
RZM char 8 认证码
TCCID char 9 停车场编号
JCKLX char 1 进出口类型
JCKBH char 6 进出口编号
GKJIP long 4 图片存放设备下面是我定义的结构体:
TVehiclePacket = record //*======停车场信息包=================*
Rzm:string[8]; //认证码
VehicleId:string[9]; //停车场编号
IoType:string[1]; //进出口类型
IoNo:string[6]; //进出口编号
PicIP:DWORD; //图片服务器IP地址
end;
TSendVehiclePacket=record //*====发送停车场信息包=================*
PType:Word; //包类型
PLength:DWORD; //长度
VehicleInfo:TVehiclePacket; //数据
end;赋值后下面是我用idtcpclent发送的代码:
FillChar(PVehiclePacket,Sizeof(PVehiclePacket),0);
FillChar(PSendVehiclePacket,Sizeof(PSendVehiclePacket),0);
PVehiclePacket.rzm:=Vehicle_RZM;
PVehiclePacket.VehicleId:=VehicleId;
PVehiclePacket.IoType:=IoType;
PVehiclePacket.IoNo:=IoNo;
PVehiclePacket.PicIP:=0;
PSendVehiclePacket.PType:=1303;
PSendVehiclePacket.PLength:=28;
PSendVehiclePacket.VehicleInfo:=PVehiclePacket;
WriteLog(..............);
ms:=TMemoryStream.Create;
try
ms.WriteBuffer(PSendVehiclePacket,SizeOf(PSendVehiclePacket));
AIdTCPClient.OpenWriteBuffer();
try
AIdTCPClient.WriteStream(ms,True,True);
AIdTCPClient.CloseWriteBuffer();
except
AIdTCPClient.CancelWriteBuffer();
WriteLog(..................);
end;
finally
FreeAndNil(ms);
end;
然后自己做了服务器端自己测试是可以了,但是当与第三方连接发送的时候,没返回数据。可能是自己没有真正的理解TLV协议,没按对方的要求发送数据。由于自己是新手第一次做网络通信编程方面的知识,虽然自己也做了很多小例子,看了indy自带的char和client的demo。但缺乏经验,希望高人好心人不吝指点赐教!非常感谢!.
T(Type)字段表示数据包类型,传输中定义为short类型;L(length)字段表示数据包长度(不包括类型和长度字段本身),传输中定义为long类型.T和L共同组成包头;V(value)表示数据包信息。
第三方要求(采用小端模式(little endian)发送,每个字段为了扩展需要,预留一定的字节,如果实际数据并未占满字段空间,末尾以ASCII码'\0'结束(仅对字符串)).比如其中一个数据包:Type length value
<-2-> <--4--> <------28-------->value 为下面的信息字段名 字段类型 字段长度 说明
RZM char 8 认证码
TCCID char 9 停车场编号
JCKLX char 1 进出口类型
JCKBH char 6 进出口编号
GKJIP long 4 图片存放设备下面是我定义的结构体:
TVehiclePacket = record //*======停车场信息包=================*
Rzm:string[8]; //认证码
VehicleId:string[9]; //停车场编号
IoType:string[1]; //进出口类型
IoNo:string[6]; //进出口编号
PicIP:DWORD; //图片服务器IP地址
end;
TSendVehiclePacket=record //*====发送停车场信息包=================*
PType:Word; //包类型
PLength:DWORD; //长度
VehicleInfo:TVehiclePacket; //数据
end;赋值后下面是我用idtcpclent发送的代码:
FillChar(PVehiclePacket,Sizeof(PVehiclePacket),0);
FillChar(PSendVehiclePacket,Sizeof(PSendVehiclePacket),0);
PVehiclePacket.rzm:=Vehicle_RZM;
PVehiclePacket.VehicleId:=VehicleId;
PVehiclePacket.IoType:=IoType;
PVehiclePacket.IoNo:=IoNo;
PVehiclePacket.PicIP:=0;
PSendVehiclePacket.PType:=1303;
PSendVehiclePacket.PLength:=28;
PSendVehiclePacket.VehicleInfo:=PVehiclePacket;
WriteLog(..............);
ms:=TMemoryStream.Create;
try
ms.WriteBuffer(PSendVehiclePacket,SizeOf(PSendVehiclePacket));
AIdTCPClient.OpenWriteBuffer();
try
AIdTCPClient.WriteStream(ms,True,True);
AIdTCPClient.CloseWriteBuffer();
except
AIdTCPClient.CancelWriteBuffer();
WriteLog(..................);
end;
finally
FreeAndNil(ms);
end;
然后自己做了服务器端自己测试是可以了,但是当与第三方连接发送的时候,没返回数据。可能是自己没有真正的理解TLV协议,没按对方的要求发送数据。由于自己是新手第一次做网络通信编程方面的知识,虽然自己也做了很多小例子,看了indy自带的char和client的demo。但缺乏经验,希望高人好心人不吝指点赐教!非常感谢!.
Rzm:array[0..7]of char; //认证码
VehicleId:array[0..8]of char; //停车场编号
IoType:char; //进出口类型
IoNo:array[0..5]of char; //进出口编号
PicIP:DWORD; //图片服务器IP地址
end;
TSendVehiclePacket=record //*====发送停车场信息包=================*
PType:Word; //包类型
PLength:DWORD; //长度
VehicleInfo:TVehiclePacket; //数据
end;
FillChar(PVehiclePacket,Sizeof(PVehiclePacket),0);
FillChar(PSendVehiclePacket,Sizeof(PSendVehiclePacket),0);
PVehiclePacket.rzm:=Vehicle_RZM;
PVehiclePacket.VehicleId:=VehicleId;
PVehiclePacket.IoType:=IoType;
PVehiclePacket.IoNo:=IoNo;
PVehiclePacket.PicIP:=0;
PSendVehiclePacket.PType:=1303;
PSendVehiclePacket.PLength:=28;
PSendVehiclePacket.VehicleInfo:=PVehiclePacket;
AIdTCPClient.WriteBuffer(PSendVehiclePacket,SizeOf(PSendVehiclePacket));
以前嵌入式、金融行业用的比较多吧
现在最好改为ini或json或xml既然有L了,为什么还 末尾以ASCII码'\0'结束(仅对字符串) ?对接不上,检查一下 字节对齐、字节顺序(大端小端) 之类的
我的是delphi7 自带的Indy9,我看了源代码,不管是write,writebuffer,writestream最后调用的都是writebuffer.