定义文件语法
定义文件由几个部分组成,
定义头信息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 }