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。但缺乏经验,希望高人好心人不吝指点赐教!非常感谢!.

解决方案 »

  1.   

    TVehiclePacket = record //*======停车场信息包=================*
       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));
     
      

  2.   

    indy9是WriteBuffer,indy10是write,你再仔细看下INDY DEMO里的CHAT源码
      

  3.   

    tlv是Tag length value
    以前嵌入式、金融行业用的比较多吧
    现在最好改为ini或json或xml既然有L了,为什么还 末尾以ASCII码'\0'结束(仅对字符串) ?对接不上,检查一下 字节对齐、字节顺序(大端小端) 之类的
      

  4.   


    我的是delphi7 自带的Indy9,我看了源代码,不管是write,writebuffer,writestream最后调用的都是writebuffer.