定义文件语法

定义文件由几个部分组成,
定义头信息packets,表示是一个定义文件开始,
代码辅助定义,定义生成代码相关一些路径,基类名称等
数据类型定义,定义通信协议中要使用到的数据字段类型
包头定义,定义通信包的包头信息,通常包括包大小,包命令字等信息
通信包包体定义,定义各个通信包的请求包字段和应答包字段
一个简单的例子

// 协议名称
packets CRD {
[ 
    target_path    : ".";    // 用于保存生成代码文件的目录,相对于本定义文件
    target_encoding: "utf8"; // 输出的代码文件使用的字符编码
    class_prefix   : CS;
    class_base     : CSPacketBase(TPacketBase);// 包体的基类
    class_packet   : CSPacket(TPacket);        // 通信包的基类,这个类应该包含 header 和 body 的属性
    class_filename : CSCRDPackets(CRDPackets); // 所有数据包的类定义将保存到这个文件中
    fun_depack     : depackData;  // class_base 中的解包函数名称
    fun_pack       : packData;    // class_base 中的封包函数名称
    fun_getpacketsize: getPacketSize; // class_base 中的获取封包大小的函数名称
    fun_tostring   : toString;    // class_base 中的将封包信息输出到字符串的函数,便于调试包信息使用
    cmd_idvaltype  : hexint;

    cpp_baselib    : poco
    pas_baselib    : indy10;
]

// 定义协议使用到的数据类型
datatypes { 
  INT  int(fix);
  STR  str(fix);
  ARR  arr(var);
}

// 定义数据包头信息,通常包含field_len包长度和field_cmd包类型字段
header {
  field_len :  datalen INT(4) "包大小";
  field_cmd :  cmd STR(2) "包类型";
  field_seq :  seq INT(4) "包通讯序列,按顺序增加";
}

// 定义在这个协议中使用到的数据包
SignRecs : SIGN_RECS = 02 "刷卡签到" {
 "上班刷卡签到"
  submitbody [
    card_id    : STR(18) "卡号";
    sign_time  : STR(18) "刷卡时间"
  ]
  respbody [
    valid_flag : INT(1) "是否签到成功标志,1成功,0失败"
  ]  
} // SignRecs

// 拥有数组和条件字段定义的复杂包定义
SendSigns : SEND_SIGN_RECS = 03 "卡号下发" {
  "将卡号数据下发给终端"
  submitbody [
    card_num   : INT(2) "下发的卡数量";
    cards      : ARR card_num "下发的卡数据"{
      typ        : INT(1)  "卡类别";
      card_id    : STR(18) "卡号";
      tone_info  : STR(30) "刷卡播报的语言" < .typ = 3 > // 这个字段出现的条件,卡类型值为3的时候
    }: CardInfo
  ]
  respbody [
    valid_flag : INT(1) "是否发送成功,1 成功,0 失败"
  ]  
} // SendSigns

}