惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - 三胖他爹

VC CUtilityLZW 效率还行的LZW压缩算法,随机数加密 VC CQHashNTBuffer 牛逼的Hash表 UINT32 VC CHashBuffer 牛逼的hash表算法,字符串查找块了100倍 关闭Fedora防火墙 gnome 屏幕截图 zynq -- arm-xilinx-eabi-路径 Fedora 14安装出现的错误 fedora19安装后,需要安装的一些必备的软件包 zynq -- cannot find -lxil Zynq -- 启动过程 OTG: On-The-Go Zynq --- SDK - Cannot compile ARM application on Windows 7 64-bit or Linux 64-bit OS MarshalHelper 找不到/dev/input/event的原因 iec61850采样协议(9-1、9-2)解析(一) C语言项目常用的头文件声明及相关宏定义 TTY头文件注释 设置和取得串口参数 程序调用shell设置ip地址
iec61850采样协议(9-1、9-2)解析(二)
三胖他爹 · 2013-05-23 · via 博客园 - 三胖他爹
   1 /*
   2  * iec61850采样协议(9-1、9-2)解析。
   3  *
   4  *
   5  * 本代码支持win32平台和linux平台。
   6  *
   7  * Copyright,lizhi<ibox>
   8  *
   9  * 2012-10-10 V1.0 lizhi<QQ:252240557,msn:ddgooo@hotmail.com> created
  10  *
  11  * 我曾经问过不休,你何时跟我走?可你却总是笑我,一无所有;
  12  * 我要给你我的追求,还有我的自由;可你却总是笑我,一无所有;
  13  *
  14  */
  15 
  16 
  17 /*
  18  * 头文件
  19  */
  20 #include "base_type.h"
  21 #include "base_include.h"
  22 #include "base_debug.h"
  23 #include "base_function.h"
  24 #include "base_endian.h"
  25 
  26 #include "iec61850sv_protocol.h"
  27 
  28 
  29 /*
  30  * 测试宏开关
  31  */
  32 //*
  33 #define IEC61850SV_CONSOLE_DEMO
  34 // */
  35 
  36 
  37 /*
  38  * _my_read_sv_bytes/_my_write_sv_bytes - 读取/写入并且转换sv数据。读取count个字节,fd会自加;
  39  * @pfd: 读写地址,为buffer地址;
  40  * @ptr:  读取/写入的数据;
  41  * @count: 需要读取/写入的字节个数;
  42  * @counter:  读取/写入的字节计数器;
  43  *
  44  */
  45 #define _my_read_sv_bytes(pfd, ptr, count, counter)                             \
  46         do {                                                                    \
  47                 _my_read_svpdu_bufn((pfd), (u8*)(ptr), (count));                \
  48                 (counter) += (count);                                           \
  49         } while(0)
  50 
  51 #define _my_write_sv_bytes(pfd, ptr, count, counter)                            \
  52         do {                                                                    \
  53                 _my_write_svpdu_bufn((pfd), (u8*)(ptr), (count));               \
  54                 (counter) += (count);                                           \
  55         } while(0)
  56 
  57 /*
  58  * _my_read_asn1_tag8/_my_write_asn1_tag8 - 按照asn.1规范读取/写入标志字节,fd会自加;
  59  * @pfd: 读写地址,为buffer地址;
  60  * @tag:  读取/写入的数据;
  61  * @counter:  读取/写入的字节计数器;
  62  *
  63  */
  64 #define _my_read_asn1_tag8(pfd, tag, counter)                                   \
  65         do {                                                                    \
  66                 u8 data = 0;                                                    \
  67                 _my_read_sv_bytes((pfd), &data, 1, counter);                    \
  68                 (tag) = _my_get8(&data);                                        \
  69         } while(0)
  70 #define _my_write_asn1_tag8(pfd, tag, counter)                                  \
  71         do {                                                                    \
  72                 u8 data = _my_get8(&tag);                                       \
  73                 _my_write_sv_bytes((pfd), &data, 1, counter);                   \
  74         } while(0)
  75 
  76 /*
  77  * _my_read_asn1_length/_my_write_asn1_length - 按照asn.1规范读取/写入长度,fd会自加;
  78  * @pfd: 读写地址,为buffer地址;
  79  * @len:  读取/写入的数据;
  80  * @counter:  读取/写入的字节计数器;
  81  *
  82  */
  83 #define _my_read_asn1_length(pfd, len, counter)                                 \
  84         do {                                                                    \
  85                 u8 len_first, len_bytes;                                        \
  86                 u8 datas[5];                                                    \
  87                 _my_read_sv_bytes((pfd), &len_first, 1, counter);               \
  88                 if ( len_first & 0x80 ) {                                       \
  89                         len_bytes = len_first & 0x7f;                           \
  90                         if (len_bytes == 1) {                                   \
  91                                 _my_read_sv_bytes((pfd), datas, 1, counter);    \
  92                                 (len) = *datas;                                 \
  93                         }                                                       \
  94                         else if (len_bytes == 2) {                              \
  95                                 _my_read_sv_bytes((pfd), datas, 2, counter);    \
  96                                 (len) = _my_btoh16((_my_getb16(datas)));        \
  97                         }                                                       \
  98                         else if (len_bytes == 3) {                              \
  99                                 datas[0] = 0x00;                                \
 100                                 _my_read_sv_bytes((pfd), datas+1, 3, counter);  \
 101                                 (len) = _my_btoh32((_my_getb32(datas)));        \
 102                         }                                                       \
 103                         else {                                                  \
 104                                 _my_read_sv_bytes((pfd), datas, 4, counter);    \
 105                                 (len) = _my_btoh32((_my_getb32(datas)));        \
 106                         }                                                       \
 107                 }                                                               \
 108                 else {                                                          \
 109                         (len) = len_first;                                      \
 110                 }                                                               \
 111         } while(0)
 112 #define _my_write_asn1_length(pfd, len, counter)                                \
 113         do {                                                                    \
 114                 u8 tag;                                                         \
 115                 u32 datas;                                                      \
 116                 datas = _my_htob32(((u32)(len)));                               \
 117                 if ((len) <= 0x0000007f) {                                      \
 118                         _my_write_sv_bytes((pfd), (u8*)(&datas), 1, counter);   \
 119                 }                                                               \
 120                 else if ((len) <= 0x000000ff) {                                 \
 121                         tag = (u8)0x81;                                         \
 122                         _my_write_sv_bytes((pfd), (u8*)(&tag), 1, counter);     \
 123                         _my_write_sv_bytes((pfd), (u8*)(&datas), 1, counter);   \
 124                 }                                                               \
 125                 else if ((len) <= 0x0000ffff) {                                 \
 126                         tag = (u8)0x82;                                         \
 127                         _my_write_sv_bytes((pfd), (u8*)(&tag), 1, counter);     \
 128                         _my_write_sv_bytes((pfd), (u8*)(&datas), 2, counter);   \
 129                 }                                                               \
 130                 else if ((len) <= 0x00ffffff) {                                 \
 131                         tag = (u8)0x83;                                         \
 132                         _my_write_sv_bytes((pfd), (u8*)(&tag), 1, counter);     \
 133                         _my_write_sv_bytes((pfd), (u8*)(&datas), 3, counter);   \
 134                 }                                                               \
 135                 else if ((len) <= 0xffffffff) {                                 \
 136                         tag = (u8)0x84;                                         \
 137                         _my_write_sv_bytes((pfd), (u8*)(&tag), 1, counter);     \
 138                         _my_write_sv_bytes((pfd), (u8*)(&datas), 4, counter);   \
 139                 }                                                               \
 140         } while(0)
 141 
 142 /*
 143  * _my_read_asn1_valn/_my_write_asn1_valn - 按照asn.1规范读取/写入int,fd会自加;
 144  * @pfd: 读写地址,为buffer地址;
 145  * @val:  读取/写入的数据;
 146  * @len:  数据长度;
 147  * @counter:  读取/写入的字节计数器;
 148  *
 149  */
 150 #define _my_read_asn1_valn(pfd, val, len, counter)                              \
 151         do {                                                                    \
 152                 u8 datas[5];                                                    \
 153                 if ((len) == 1) {                                               \
 154                         _my_read_sv_bytes((pfd), datas, 1, counter);            \
 155                         (val) = *datas;                                         \
 156                 }                                                               \
 157                 else if ((len) == 2) {                                          \
 158                         _my_read_sv_bytes((pfd), datas, 2, counter);            \
 159                         (val) = _my_btoh16((_my_getb16(datas)));                \
 160                 }                                                               \
 161                 else if ((len) == 3) {                                          \
 162                         datas[0] = 0x00;                                        \
 163                         _my_read_sv_bytes((pfd), datas+1, 3, counter);          \
 164                         (val) = _my_btoh32((_my_getb32(datas)));                \
 165                 }                                                               \
 166                 else if ((len) == 4) {                                          \
 167                         _my_read_sv_bytes((pfd), datas, 4, counter);            \
 168                         (val) = _my_btoh32((_my_getb32(datas)));                \
 169                 }                                                               \
 170         } while(0)
 171 #define _my_write_asn1_valn(pfd, val, len, counter)                             \
 172         do {                                                                    \
 173                 u32 datas;                                                      \
 174                 datas = _my_htob32(((u32)(val)));                               \
 175                 if ((len) == 1) {                                               \
 176                         _my_write_sv_bytes((pfd), (u8*)(&datas), 1, counter);   \
 177                 }                                                               \
 178                 else if ((len) == 2) {                                          \
 179                         _my_write_sv_bytes((pfd), (u8*)(&datas), 2, counter);   \
 180                 }                                                               \
 181                 else if ((len) == 3) {                                          \
 182                         _my_write_sv_bytes((pfd), (u8*)(&datas), 3, counter);   \
 183                 }                                                               \
 184                 else if ((len) == 4) {                                          \
 185                         _my_write_sv_bytes((pfd), (u8*)(&datas), 4, counter);   \
 186                 }                                                               \
 187         } while(0)
 188 
 189 
 190 /*
 191  * _my_read_asn1_valb/_my_write_asn1_valb - 按照asn.1规范读取/写入bytes,fd会自加;
 192  * @pfd: 读写地址,为buffer地址;
 193  * @val:  读取/写入的数据;
 194  * @len:  数据长度;
 195  * @counter:  读取/写入的字节计数器;
 196  *
 197  */
 198 #define _my_read_asn1_valb(pfd, val, len, counter)                              \
 199         _my_read_sv_bytes((pfd), (val), (len), counter);
 200 #define _my_write_asn1_valb(pfd, val, len, counter)                             \
 201         _my_write_sv_bytes((pfd), (val), (len), counter);
 202 
 203 
 204 /*
 205  * read_svpdu_lpdu_head - 取得链路层svpdu报文头部信息,没有读到的数据为其原来的值
 206  * @pfd:  输入输出参数,地址
 207  * @len: 输入参数,数据缓冲区长度;
 208  * @head: 输出参数,svpdu_lpdu_head值
 209  * @counter:  输出参数,读取的字节计数器;
 210  *
 211  * 读成功返回当前读pfd地址,否则返回NULL;
 212  *
 213  */
 214 _my_svpdu_ioptr read_svpdu_lpdu_head(_my_svpdu_ioptr pfd, int len, struct svpdu_lpdu_head *head, int *counter)
 215 {
 216         _my_svpdu_ioptr curr_pfd = pfd;
 217 
 218         _my_assert(curr_pfd && head);
 219 
 220         _my_assert( len > sizeof(struct svpdu_lpdu_head)); /* 最小长度应该大于 26 个字节,从协议计算*/
 221         _my_read_sv_bytes(curr_pfd, head->des_mac, 6, *counter);
 222         _my_read_sv_bytes(curr_pfd, head->src_mac, 6, *counter);
 223         _my_read_asn1_valn(curr_pfd, head->tpid, 2, *counter);
 224         if (head->tpid != SVPDU_LPDU_TPID_VLAN) {   /* 有的报文里面没有tpid和tci字段 不能比较 */
 225                 head->ether_type = head->tpid;
 226         }
 227         else {
 228                 _my_read_asn1_valn(curr_pfd, head->tci, 2, *counter);
 229                 _my_read_asn1_valn(curr_pfd, head->ether_type, 2, *counter);
 230         }
 231         _my_read_asn1_valn(curr_pfd, head->appid, 2, *counter);
 232         _my_read_asn1_valn(curr_pfd, head->epdu_length, 2, *counter);
 233         _my_read_asn1_valn(curr_pfd, head->reserve1, 2, *counter);
 234         _my_read_asn1_valn(curr_pfd, head->reserve2, 2, *counter);
 235 
 236         return curr_pfd;
 237 }
 238 
 239 
 240 /*
 241  * read_svpdu_apdu_head - 取得svpdu报文中apdu头部信息,没有读到的数据为其原来的值
 242  * @pfd:  输入输出参数,地址
 243  * @len: 输入参数,数据缓冲区长度;
 244  * @head: 输出参数,svpdu_lpdu_head值
 245  * @counter:  输出参数,读取的字节计数器;
 246  *
 247  * 读成功返回当前读pfd地址,否则返回NULL;
 248  *
 249  */
 250 _my_svpdu_ioptr read_svpdu_apdu_head(_my_svpdu_ioptr pfd, int len, struct svpdu_apdu_head *head, int *counter)
 251 {
 252         u8 curr_tag = 0;
 253         u32 curr_len = 0;
 254         u32 index = 0;
 255 
 256         _my_svpdu_ioptr curr_pfd =  pfd;
 257 
 258         _my_assert(curr_pfd && head);
 259 
 260         _my_read_asn1_tag8(curr_pfd, head->apdu_tag, *counter);
 261         _my_read_asn1_length(curr_pfd, head->apdu_length, *counter);
 262         if (head->apdu_tag == SVPDU_APDU_TAG_91) {
 263                 _my_read_asn1_valn(curr_pfd, head->asdu_num_value, 2, *counter);
 264                 return curr_pfd;
 265         }
 266         else if (head->apdu_tag == SVPDU_APDU_TAG_92) {
 267                 for (index = 0; index < 3; index++) { /* 最多读三遍,一般没有SVPDU_SECURITY_TAG_92 */
 268                         _my_read_asn1_tag8(curr_pfd, curr_tag, *counter);
 269                         _my_read_asn1_length(curr_pfd, curr_len, *counter);
 270                         if (curr_tag == SVPDU_ASDUNUM_TAG_92) {
 271                                 head->asdu_num_tag = curr_tag;
 272                                 head->asdu_num_length = curr_len;
 273                                 _my_read_asn1_valn(curr_pfd, head->asdu_num_value, curr_len, *counter);
 274                         }
 275                         else if (curr_tag == SVPDU_SECURITY_TAG_92) {
 276                                 head->asdu_security_tag = curr_tag;
 277                                 head->asdu_security_length = curr_len;
 278                         }
 279                         else if (curr_tag == SVPDU_SEQUENCE_TAG_92) {
 280                                 head->asdu_sequence_tag = curr_tag;
 281                                 head->asdu_sequence_length = curr_len;
 282                                 break;
 283                         }
 284                         else {
 285                                 _my_warn_info(1, "WARN: read unknown svpdu apdu head tag");
 286                                 break;
 287                         }
 288                 }
 289                 return curr_pfd;
 290         }
 291         else {
 292                 _my_warn_info(1, "WARN: not a 9-1/9-2 packet ");
 293                 return 0;
 294         }
 295 }
 296 
 297 
 298 
 299 /*
 300  * read_svpdu_asdu_dat92 - 读取9-2-asdu详细值;
 301  * @pfd:  输入输出参数,地址
 302  * @len: 输入参数,数据缓冲区长度;
 303  * @dat92: 输出参数,asdu详细值;
 304  * @smpquality_enable: 是否有质量信息;
 305  * @counter:  输出参数,读取的字节计数器;
 306  *
 307  * 读成功返回当前读pfd地址,否则返回NULL;
 308  *
 309  * 读取过程中可能会利用动态创建空间以保存svid_value、datset_value、smpdata_values、smpdata_qualitys数据;
 310  *
 311  */
 312 _my_svpdu_ioptr read_svpdu_asdu_dat92(_my_svpdu_ioptr pfd, int len, struct svpdu_asdu_dat92 *dat92, int smpquality_enable, int *counter)
 313 {
 314         _my_svpdu_ioptr curr_pfd = pfd;
 315 
 316         int begn_pos = 0;
 317         u8 curr_tag = 0;
 318         u32 curr_len = 0;
 319         u32 index = 0;
 320         u32 sizebuf = 0;
 321         u8 succ_flag = 1;
 322 
 323         _my_assert(curr_pfd && dat92);
 324 
 325         _my_read_asn1_tag8(curr_pfd, dat92->asdu_tag, *counter);
 326         _my_read_asn1_length(curr_pfd, dat92->asdu_length, *counter);
 327 
 328         begn_pos = *counter;
 329 
 330         if (dat92->asdu_tag != SVPDU_ASDU_TAG_92) {
 331                 _my_warn_info(1, "WARN: not a 9-2 asdu packet ");
 332                 return 0;
 333         }
 334 
 335         while ((u32)((*counter) - begn_pos) <  dat92->asdu_length) {
 336                 _my_read_asn1_tag8(curr_pfd, curr_tag, *counter);
 337                 _my_read_asn1_length(curr_pfd, curr_len, *counter);
 338                 switch (curr_tag) {
 339                 case SVPDU_ASDU_SVID_TAG_92 :
 340                         dat92->svid_tag = curr_tag;
 341                         dat92->svid_length = curr_len;
 342                         if (dat92->svid_value != NULL) {
 343                                 _my_buf_free(dat92->svid_value);
 344                                 dat92->svid_value = NULL;
 345                         }
 346                         if (curr_len > 0) {
 347                                 sizebuf = curr_len + 1;
 348                                 dat92->svid_value = _my_buf_malloc(sizebuf);
 349                                 memset(dat92->svid_value, 0, sizebuf);
 350                                 _my_read_asn1_valb(curr_pfd, dat92->svid_value, curr_len, *counter);
 351                         }
 352                         break;
 353                 case SVPDU_ASDU_DATSET_TAG_92 :
 354                         dat92->datset_tag = curr_tag;
 355                         dat92->datset_length = curr_len;
 356                         if (dat92->datset_value != NULL) {
 357                                 _my_buf_free(dat92->datset_value);
 358                                 dat92->datset_value = NULL;
 359                         }
 360                         if (curr_len > 0) {
 361                                 sizebuf = curr_len + 1;
 362                                 dat92->datset_value = _my_buf_malloc(sizebuf);
 363                                 memset(dat92->datset_value, 0, sizebuf);
 364                                 _my_read_asn1_valb(curr_pfd, dat92->datset_value, curr_len, *counter);
 365                         }
 366                         break;
 367                 case SVPDU_ASDU_SMPCNT_TAG_92 :
 368                         dat92->smpcnt_tag = curr_tag;
 369                         dat92->smpcnt_length = curr_len;
 370                         _my_read_asn1_valn(curr_pfd, dat92->smpcnt_value, curr_len, *counter);
 371                         break;
 372                 case SVPDU_ASDU_CONFREV_TAG_92 :
 373                         dat92->confrev_tag = curr_tag;
 374                         dat92->confrev_length = curr_len;
 375                         _my_read_asn1_valn(curr_pfd, dat92->confrev_value, curr_len, *counter);
 376                         break;
 377                 case SVPDU_ASDU_REFRTM_TAG_92 :
 378                         dat92->refrtm_tag =         curr_tag;
 379                         dat92->refrtm_length = curr_len;
 380                         _my_read_asn1_valn(curr_pfd, dat92->refrtm_value, curr_len, *counter);
 381                         break;
 382                 case SVPDU_ASDU_SMPSYNCH_TAG_92 :
 383                         dat92->smpsynch_tag = curr_tag;
 384                         dat92->smpsynch_length = curr_len;
 385                         _my_read_asn1_valn(curr_pfd, dat92->smpsynch_value, curr_len, *counter);
 386                         break;
 387                 case SVPDU_ASDU_SMPRATE_TAG_92 :
 388                         dat92->smprate_tag = curr_tag;
 389                         dat92->smprate_length = curr_len;
 390                         _my_read_asn1_valn(curr_pfd, dat92->smprate_value, curr_len, *counter);
 391                         break;
 392                 case SVPDU_ASDU_SMPDATA_TAG_92 :
 393                         dat92->smpdata_tag = curr_tag;
 394                         dat92->smpdata_length = curr_len;
 395                         dat92->smpdata_portnum = (u16)(curr_len / (smpquality_enable ? 8 : 4));
 396                         if (dat92->smpdata_values != NULL) {
 397                                 _my_buf_free(dat92->smpdata_values);
 398                                 dat92->smpdata_values = NULL;
 399                         }
 400                         if (dat92->smpdata_qualitys != NULL) {
 401                                 _my_buf_free(dat92->smpdata_qualitys);
 402                                 dat92->smpdata_qualitys = NULL;
 403                         }
 404                         if (dat92->smpdata_portnum > 0) {
 405                                 sizebuf = dat92->smpdata_portnum * sizeof(s32);
 406                                 dat92->smpdata_values = _my_buf_malloc(sizebuf);
 407                                 memset(dat92->smpdata_values, 0, sizebuf);
 408                                 dat92->smpdata_qualitys = _my_buf_malloc(sizebuf);
 409                                 memset(dat92->smpdata_qualitys, 0, sizebuf);
 410                         }
 411                         for (index = 0; (index < dat92->smpdata_portnum); index++) {
 412                                 _my_read_asn1_valn(curr_pfd, dat92->smpdata_values[index], 4, *counter);
 413                                 _my_read_asn1_valn(curr_pfd, dat92->smpdata_qualitys[index], 4, *counter);
 414                         }
 415                         break;
 416                 default:
 417                         _my_warn_info(1, "WARN: not a 9-1/9-2 asdu item packet ");
 418                         succ_flag = 0;
 419                         break;
 420                 }
 421         }
 422 
 423         return succ_flag ? curr_pfd : 0;
 424 }
 425 
 426 
 427 /*
 428  * init_svpdu_asdu_dat92 - 初始化Dat92结构体;
 429  * @dat92: 输入输出参数,asdu详细值;
 430  * @setdefaultval: 参数是否赋默认值;
 431  *
 432  * 初始化成功返回当前dat92结构体地址,否则返回NULL;
 433  *
 434  */
 435 struct svpdu_asdu_dat92 * init_svpdu_asdu_dat92(struct svpdu_asdu_dat92 *dat92, int setdefaultval)
 436 {
 437         struct svpdu_asdu_dat92 *dat = dat92;
 438 
 439         if (dat == NULL) {
 440                 dat = (struct svpdu_asdu_dat92 *)_my_buf_malloc(sizeof(struct svpdu_asdu_dat92));
 441                 dat->svid_value = NULL;
 442                 dat->datset_value = NULL;
 443                 dat->smpdata_values = NULL;
 444                 dat->smpdata_qualitys = NULL;
 445         }
 446 
 447         memset(dat, 0, sizeof(struct svpdu_asdu_dat92));
 448         if (dat->svid_value != NULL) {
 449                 _my_buf_free(dat->svid_value);
 450                 dat->svid_value = NULL;
 451         }
 452         if (dat->datset_value != NULL) {
 453                 _my_buf_free(dat->datset_value);
 454                 dat->datset_value = NULL;
 455         }
 456         if (dat->smpdata_values != NULL) {
 457                 _my_buf_free(dat->smpdata_values);
 458                 dat->smpdata_values = NULL;
 459         }
 460         if (dat->smpdata_qualitys != NULL) {
 461                 _my_buf_free(dat->smpdata_qualitys);
 462                 dat->smpdata_qualitys = NULL;
 463         }
 464 
 465         if (setdefaultval) {
 466                 dat->asdu_tag = SVPDU_ASDU_TAG_92;
 467                 dat->svid_tag = SVPDU_ASDU_SVID_TAG_92;
 468                 dat->datset_tag = SVPDU_ASDU_DATSET_TAG_92;
 469                 dat->smpcnt_tag = SVPDU_ASDU_SMPCNT_TAG_92;
 470                 dat->confrev_tag = SVPDU_ASDU_CONFREV_TAG_92;
 471                 dat->refrtm_tag = SVPDU_ASDU_REFRTM_TAG_92;
 472                 dat->smpsynch_tag = SVPDU_ASDU_SMPSYNCH_TAG_92;
 473                 dat->smprate_tag = SVPDU_ASDU_SMPRATE_TAG_92;
 474                 dat->smpdata_tag = SVPDU_ASDU_SMPDATA_TAG_92;
 475         }
 476 
 477         return dat;
 478 }
 479 
 480 /*
 481  * free_svpdu_asdu_dat92 - 释放Dat92结构体;
 482  * @dat92: 输入输出参数,asdu详细值;
 483  *
 484  * 初始化成功返回返回NULL,否则返回当前dat92结构体地址;
 485  *
 486  */
 487 struct svpdu_asdu_dat92 * free_svpdu_asdu_dat92(struct svpdu_asdu_dat92 *dat92)
 488 {
 489         struct svpdu_asdu_dat92 *dat = dat92;
 490 
 491         if (dat != NULL) {
 492                 if (dat->svid_value != NULL) {
 493                         _my_buf_free(dat->svid_value);
 494                         dat->svid_value = NULL;
 495                 }
 496                 if (dat->datset_value != NULL) {
 497                         _my_buf_free(dat->datset_value);
 498                         dat->datset_value = NULL;
 499                 }
 500                 if (dat->smpdata_values != NULL) {
 501                         _my_buf_free(dat->smpdata_values);
 502                         dat->smpdata_values = NULL;
 503                 }
 504                 if (dat->smpdata_qualitys != NULL) {
 505                         _my_buf_free(dat->smpdata_qualitys);
 506                         dat->smpdata_qualitys = NULL;
 507                 }
 508                 _my_buf_free(dat);
 509                 dat = NULL;
 510         }
 511 
 512         return dat;
 513 }
 514 
 515 
 516 
 517 
 518 /*
 519  * read_svpdu_asdu_dat91 - 读取9-1-asdu详细值;
 520  * @pfd:  输入输出参数,地址
 521  * @len: 输入参数,数据缓冲区长度;
 522  * @dat91: 输出参数,asdu详细值;
 523  * @counter:  输出参数,读取的字节计数器;
 524  *
 525  * 读成功返回当前读pfd地址,否则返回NULL;
 526  *
 527  * 读取过程中可能会利用动态创建空间以保存smpdata_values数据;
 528  *
 529  */
 530 _my_svpdu_ioptr read_svpdu_asdu_dat91(_my_svpdu_ioptr pfd, int len, struct svpdu_asdu_dat91 *dat91, int *counter)
 531 {
 532         _my_svpdu_ioptr curr_pfd = pfd;
 533 
 534         u32 index = 0;
 535         u32 sizebuf = 0;
 536 
 537         _my_assert(curr_pfd && dat91);
 538 
 539         _my_read_asn1_valn(curr_pfd, dat91->asdu_length, 2, *counter);
 540 
 541         _my_assert(dat91->smpdata_portnum >= 20);
 542 
 543         _my_read_asn1_valn(curr_pfd, dat91->ln_name, 1, *counter);
 544         _my_read_asn1_valn(curr_pfd, dat91->dataset_name, 1, *counter);
 545         _my_read_asn1_valn(curr_pfd, dat91->ld_name, 2, *counter);
 546         _my_read_asn1_valn(curr_pfd, dat91->i_pp, 2, *counter);
 547         _my_read_asn1_valn(curr_pfd, dat91->i_p0, 2, *counter);
 548         _my_read_asn1_valn(curr_pfd, dat91->u_pp, 2, *counter);
 549         _my_read_asn1_valn(curr_pfd, dat91->t_delay, 2, *counter);
 550 
 551         dat91->smpdata_portnum = (dat91->asdu_length - 20) / 2;
 552 
 553         _my_assert(dat91->smpdata_portnum >= 0);
 554 
 555         if (dat91->smpdata_values != NULL) {
 556                 _my_buf_free(dat91->smpdata_values);
 557                 dat91->smpdata_values = NULL;
 558         }
 559         if (dat91->smpdata_portnum > 0) {
 560                 sizebuf = dat91->smpdata_portnum * sizeof(s16);
 561                 dat91->smpdata_values = _my_buf_malloc(sizebuf);
 562                 memset(dat91->smpdata_values, 0, sizebuf);
 563         }
 564 
 565         for (index=0; index<dat91->smpdata_portnum; index++) {
 566                 _my_read_asn1_valn(curr_pfd, dat91->smpdata_values[index], 2, *counter);
 567         }
 568 
 569         _my_read_asn1_valn(curr_pfd, dat91->status_word1, 2, *counter);
 570         _my_read_asn1_valn(curr_pfd, dat91->status_word2, 2, *counter);
 571         _my_read_asn1_valn(curr_pfd, dat91->smp_cnt, 2, *counter);
 572         _my_read_asn1_valn(curr_pfd, dat91->smp_rate, 1, *counter);
 573         _my_read_asn1_valn(curr_pfd, dat91->version, 1, *counter);
 574 
 575         return curr_pfd;
 576 }
 577 
 578 /*
 579  * init_svpdu_asdu_dat91 - 初始化Dat91结构体;
 580  * @dat92: 输入输出参数,asdu详细值;
 581  *
 582  * 初始化成功返回当前dat91结构体地址,否则返回NULL;
 583  *
 584  */
 585 struct svpdu_asdu_dat91 * init_svpdu_asdu_dat91(struct svpdu_asdu_dat91 *dat91)
 586 {
 587         struct svpdu_asdu_dat91 *dat = dat91;
 588 
 589         if (dat == NULL) {
 590                 dat = (struct svpdu_asdu_dat91 *)_my_buf_malloc(sizeof(struct svpdu_asdu_dat91));
 591                 dat->smpdata_values = NULL;
 592         }
 593 
 594         memset(dat, 0, sizeof(struct svpdu_asdu_dat91));
 595         if (dat->smpdata_values != NULL) {
 596                 _my_buf_free(dat->smpdata_values);
 597                 dat->smpdata_values = NULL;
 598         }
 599 
 600         return dat;
 601 }
 602 
 603 /*
 604  * free_svpdu_asdu_dat91 - 释放Dat91结构体;
 605  * @dat91: 输入输出参数,asdu详细值;
 606  *
 607  * 初始化成功返回返回NULL,否则返回当前dat91结构体地址;
 608  *
 609  */
 610 struct svpdu_asdu_dat91 * free_svpdu_asdu_dat91(struct svpdu_asdu_dat91 *dat91)
 611 {
 612         struct svpdu_asdu_dat91 *dat = dat91;
 613 
 614         if (dat != NULL) {
 615                 if (dat->smpdata_values != NULL) {
 616                         _my_buf_free(dat->smpdata_values);
 617                         dat->smpdata_values = NULL;
 618                 }
 619                 _my_buf_free(dat);
 620                 dat = NULL;
 621         }
 622 
 623         return dat;
 624 }
 625 
 626 
 627 
 628 
 629 /*
 630  * write_svpdu_lpdu_head - 写svpdu_lpdu_head到文件中
 631  * @pfd: 输入参数,写地址;
 632  * @head:输入参数,svpdu_lpdu_head结构体;
 633  * @counter: 输出参数,成功写入的字节个数;
 634  *
 635  * 返回当前pfd指针,写失败返回NULL
 636  *
 637  */
 638 _my_svpdu_ioptr write_svpdu_lpdu_head(_my_svpdu_ioptr pfd, struct svpdu_lpdu_head *head, int *counter)
 639 {
 640         _my_svpdu_ioptr curr_pfd = pfd;
 641 
 642         _my_assert(curr_pfd && head);
 643 
 644         _my_write_sv_bytes(curr_pfd, head->des_mac, 6, *counter);
 645         _my_write_sv_bytes(curr_pfd, head->src_mac, 6, *counter);
 646         _my_write_asn1_valn(curr_pfd, (u32)(head->tpid), 2, *counter);
 647         _my_write_asn1_valn(curr_pfd, (u32)(head->tci), 2, *counter);
 648         _my_write_asn1_valn(curr_pfd, (u32)(head->ether_type), 2, *counter);
 649         _my_write_asn1_valn(curr_pfd, (u32)(head->appid), 2, *counter);
 650         _my_write_asn1_valn(curr_pfd, (u32)(head->epdu_length), 2, *counter);
 651         _my_write_asn1_valn(curr_pfd, (u32)(head->reserve1), 2, *counter);
 652         _my_write_asn1_valn(curr_pfd, (u32)(head->reserve1), 2, *counter);
 653 
 654         return curr_pfd;
 655 }
 656 
 657 
 658 
 659 /*
 660  * write_svpdu_apdu_head - 写svpdu_apdu_head到文件中
 661  * @pfd: 输入参数,写地址;
 662  * @head:输入参数,svpdu_apdu_head结构体;
 663  * @counter: 输出参数,成功写入的字节个数;
 664  *
 665  * 返回当前pfd指针,写失败返回NULL
 666  *
 667  */
 668 _my_svpdu_ioptr write_svpdu_apdu_head(_my_svpdu_ioptr pfd, struct svpdu_apdu_head *head, int *counter)
 669 {
 670         _my_svpdu_ioptr curr_pfd = pfd;
 671 
 672         _my_assert(curr_pfd && head);
 673 
 674         _my_write_asn1_tag8(curr_pfd, head->apdu_tag, *counter);
 675         _my_write_asn1_length(curr_pfd, head->apdu_length, *counter);
 676 
 677         if (head->apdu_tag == SVPDU_APDU_TAG_92){
 678                 _my_write_asn1_tag8(curr_pfd, head->asdu_num_tag, *counter);
 679                 _my_write_asn1_length(curr_pfd, head->asdu_num_length, *counter);
 680         }
 681         _my_write_asn1_valn(curr_pfd, (u32)(head->asdu_num_value), 2, *counter);
 682 
 683         if (head->apdu_tag == SVPDU_APDU_TAG_92){
 684                 if (head->asdu_security_tag != 0x00) {
 685                         _my_write_asn1_tag8(curr_pfd, head->asdu_security_tag, *counter);
 686                         _my_write_asn1_length(curr_pfd, head->asdu_security_length, *counter);
 687                 }
 688                 if (head->asdu_sequence_tag != 0x00) {
 689                         _my_write_asn1_tag8(curr_pfd, head->asdu_sequence_tag, *counter);
 690                         _my_write_asn1_length(curr_pfd, head->asdu_sequence_length, *counter);
 691                 }
 692         }
 693 
 694         return curr_pfd;
 695 }
 696 
 697 
 698 /*
 699  * write_svpdu_asdu_dat92 - 写svpdu_asdu_dat92到文件中
 700  * @pfd: 输入参数,写地址;
 701  * @dat92:输入参数,svpdu_asdu_dat92结构体;
 702  * @counter: 输出参数,成功写入的字节个数;
 703  *
 704  * 返回当前pfd指针,写失败返回NULL
 705  *
 706  */
 707 _my_svpdu_ioptr write_svpdu_asdu_dat92(_my_svpdu_ioptr pfd, struct svpdu_asdu_dat92 *dat92, int *counter)
 708 {
 709          _my_svpdu_ioptr curr_pfd = pfd;
 710 
 711          u32 index = 0;
 712 
 713         _my_assert(curr_pfd && dat92);
 714 
 715         _my_write_asn1_tag8(curr_pfd, dat92->asdu_tag, *counter);
 716         _my_write_asn1_length(curr_pfd, dat92->asdu_length, *counter);
 717 
 718         if (dat92->svid_tag == SVPDU_ASDU_SVID_TAG_92) {
 719                 _my_write_asn1_tag8(curr_pfd, dat92->svid_tag, *counter);
 720                 _my_write_asn1_length(curr_pfd, dat92->svid_length, *counter);
 721                 _my_write_asn1_valb(curr_pfd, dat92->svid_value, dat92->svid_length, *counter);
 722         }
 723         if (dat92->datset_tag == SVPDU_ASDU_DATSET_TAG_92) {
 724                 _my_write_asn1_tag8(curr_pfd, dat92->datset_tag, *counter);
 725                 _my_write_asn1_length(curr_pfd, dat92->datset_length, *counter);
 726                 _my_write_asn1_valb(curr_pfd, dat92->datset_value, dat92->datset_length, *counter);
 727         }
 728         if (dat92->smpcnt_tag == SVPDU_ASDU_SMPCNT_TAG_92) {
 729                 _my_write_asn1_tag8(curr_pfd, dat92->smpcnt_tag, *counter);
 730                 _my_write_asn1_length(curr_pfd, dat92->smpcnt_length, *counter);
 731                 _my_write_asn1_valn(curr_pfd, dat92->smpcnt_value, dat92->smpcnt_length, *counter);
 732         }
 733         if (dat92->confrev_tag == SVPDU_ASDU_CONFREV_TAG_92) {
 734                 _my_write_asn1_tag8(curr_pfd, dat92->confrev_tag, *counter);
 735                 _my_write_asn1_length(curr_pfd, dat92->confrev_length, *counter);
 736                 _my_write_asn1_valn(curr_pfd, dat92->confrev_value, dat92->confrev_length, *counter);
 737         }
 738         if (dat92->refrtm_tag == SVPDU_ASDU_REFRTM_TAG_92) {
 739                 _my_write_asn1_tag8(curr_pfd, dat92->refrtm_tag, *counter);
 740                 _my_write_asn1_length(curr_pfd, dat92->refrtm_length, *counter);
 741                 _my_write_asn1_valn(curr_pfd, dat92->refrtm_value, dat92->refrtm_length, *counter);
 742         }
 743         if (dat92->smpsynch_tag == SVPDU_ASDU_SMPSYNCH_TAG_92) {
 744                 _my_write_asn1_tag8(curr_pfd, dat92->refrtm_tag, *counter);
 745                 _my_write_asn1_length(curr_pfd, dat92->smpsynch_length, *counter);
 746                 _my_write_asn1_valn(curr_pfd, dat92->smpsynch_value, dat92->smpsynch_length, *counter);
 747         }
 748         if (dat92->smprate_tag == SVPDU_ASDU_SMPRATE_TAG_92) {
 749                 _my_write_asn1_tag8(curr_pfd, dat92->smprate_tag, *counter);
 750                 _my_write_asn1_length(curr_pfd, dat92->smprate_length, *counter);
 751                 _my_write_asn1_valn(curr_pfd, dat92->smprate_value, dat92->smprate_length, *counter);
 752         }
 753         if (dat92->smpdata_tag == SVPDU_ASDU_SMPDATA_TAG_92) {
 754                 _my_write_asn1_tag8(curr_pfd, dat92->smpdata_tag, *counter);
 755                 _my_write_asn1_length(curr_pfd, dat92->smpdata_length, *counter);
 756                 for (index = 0; (index < dat92->smpdata_portnum); index++) {
 757                         _my_write_asn1_valn(curr_pfd, dat92->smpdata_values[index], 4, *counter);
 758                         _my_write_asn1_valn(curr_pfd, dat92->smpdata_qualitys[index], 4, *counter);
 759                 }
 760         }
 761 
 762         return curr_pfd;
 763 }
 764 
 765 
 766 /*
 767  * write_svpdu_asdu_dat91 - 写svpdu_asdu_dat91到文件中
 768  * @pfd: 输入参数,写地址;
 769  * @dat91:输入参数,svpdu_asdu_dat91结构体;
 770  * @counter: 输出参数,成功写入的字节个数;
 771  *
 772  * 返回当前pfd指针,写失败返回NULL
 773  *
 774  */
 775 _my_svpdu_ioptr write_svpdu_asdu_dat91(_my_svpdu_ioptr pfd, struct svpdu_asdu_dat91 *dat91, int *counter)
 776 {
 777          _my_svpdu_ioptr curr_pfd = pfd;
 778 
 779          u32 index = 0;
 780 
 781         _my_assert(curr_pfd && dat91);
 782 
 783         _my_write_asn1_valn(curr_pfd, dat91->asdu_length, 2, *counter);
 784         _my_write_asn1_valn(curr_pfd, dat91->ln_name, 1, *counter);
 785         _my_write_asn1_valn(curr_pfd, dat91->dataset_name, 1, *counter);
 786         _my_write_asn1_valn(curr_pfd, dat91->ld_name, 2, *counter);
 787         _my_write_asn1_valn(curr_pfd, dat91->i_pp, 2, *counter);
 788         _my_write_asn1_valn(curr_pfd, dat91->i_p0, 2, *counter);
 789         _my_write_asn1_valn(curr_pfd, dat91->u_pp, 2, *counter);
 790         _my_write_asn1_valn(curr_pfd, dat91->t_delay, 2, *counter);
 791         for (index = 0; (index < dat91->smpdata_portnum); index++) {
 792                 _my_write_asn1_valn(curr_pfd, dat91->smpdata_values[index], 2, *counter);
 793         }
 794         _my_write_asn1_valn(curr_pfd, dat91->status_word1, 2, *counter);
 795         _my_write_asn1_valn(curr_pfd, dat91->status_word2, 2, *counter);
 796         _my_write_asn1_valn(curr_pfd, dat91->smp_cnt, 2, *counter);
 797         _my_write_asn1_valn(curr_pfd, dat91->smp_rate, 1, *counter);
 798         _my_write_asn1_valn(curr_pfd, dat91->version, 1, *counter);
 799 
 800         return curr_pfd;
 801 }
 802 
 803 /*
 804  * print_svpdu_lpdu_head - 打印数据
 805  * @head: 数据包
 806  *
 807  */
 808 void print_svpdu_lpdu_head(struct svpdu_lpdu_head * head) {
 809         if ( head ) {
 810                 _my_printf("========= svpdu_lpdu_head ============\n");
 811                 _my_printf("des_mac:%02X:%02X:%02X:%02X:%02X:%02X\n",
 812                         head->des_mac[0], head->des_mac[1], head->des_mac[2],
 813                         head->des_mac[3], head->des_mac[4], head->des_mac[5]);
 814                 _my_printf("src_mac:%02X:%02X:%02X:%02X:%02X:%02X\n",
 815                         head->src_mac[0], head->src_mac[1], head->src_mac[2],
 816                         head->src_mac[3], head->src_mac[4], head->src_mac[5]);
 817                 _my_printf("tpid:%u [0x%04X]\n", head->tpid, head->tpid);
 818                 _my_printf("tci:%u [0x%04X]\n", head->tci, head->tci);
 819                 _my_printf("ether_type:%u [0x%04X]\n", head->ether_type, head->ether_type);
 820                 _my_printf("appid:%u [0x%04X]\n", head->appid, head->appid);
 821                 _my_printf("epdu_length:%u [0x%04X]\n", head->epdu_length, head->epdu_length);
 822                 _my_printf("reserve1:%u [0x%04X]\n", head->reserve1, head->reserve1);
 823                 _my_printf("reserve2:%u [0x%04X]\n", head->reserve2, head->reserve2);
 824                 _my_printf("=====================\n");
 825         }
 826 }
 827 
 828 /*
 829  * print_svpdu_apdu_head - 打印数据
 830  * @head: 数据包
 831  *
 832  */
 833 void print_svpdu_apdu_head(struct svpdu_apdu_head* head) {
 834         if ( head ) {
 835                 _my_printf("========= svpdu_apdu_head ============\n");
 836                 _my_printf("apdu_tag:%u [0x%02X]\n", head->apdu_tag, head->apdu_tag);
 837                 _my_printf("apdu_length:%u [0x%08X]\n", head->apdu_length, head->apdu_length);
 838                 _my_printf("asdu_num_tag:%u [0x%02X]\n", head->asdu_num_tag, head->asdu_num_tag);
 839                 _my_printf("asdu_num_length:%u [0x%08X]\n", head->asdu_num_length, head->asdu_num_length);
 840                 _my_printf("asdu_num_value:%u [0x%04X]\n", head->asdu_num_value, head->asdu_num_value);
 841                 _my_printf("asdu_security_tag:%u [0x%02X]\n", head->asdu_security_tag, head->asdu_security_tag);
 842                 _my_printf("asdu_security_length:%u [0x%08X]\n", head->asdu_security_length, head->asdu_security_length);
 843                 _my_printf("asdu_sequence_tag:%u [0x%02X]\n", head->asdu_sequence_tag, head->asdu_sequence_tag);
 844                 _my_printf("asdu_sequence_length:%u [0x%08X]\n", head->asdu_sequence_length, head->asdu_sequence_length);
 845                 _my_printf("=====================\n");
 846         }
 847 }
 848 
 849 /*
 850  * print_svpdu_asdu_dat92 - 打印数据
 851  * @dat92: 数据包
 852  * @smpquality_enable: 是否包含质量信息
 853  *
 854  */
 855 void print_svpdu_asdu_dat92(struct svpdu_asdu_dat92* dat92, u8 smpquality_enable){
 856         u32 index = 0;
 857         if ( dat92 ) {
 858                 _my_printf("========= svpdu_asdu_dat92 ============\n");
 859                 _my_printf("asdu_tag:%u [0x%02X]\n", dat92->asdu_tag, dat92->asdu_tag);
 860                 _my_printf("asdu_length:%u [0x%08X]\n", dat92->asdu_length, dat92->asdu_length);
 861                 _my_printf("svid_tag:%u [0x%02X]\n", dat92->svid_tag, dat92->svid_tag);
 862                 _my_printf("svid_length:%u [0x%08X]\n", dat92->svid_length, dat92->svid_length);
 863                 _my_printf("svid_value:\n");
 864                 for (index = 0; index < dat92->svid_length; index++) {
 865                         if ((index % 16) == 0) {
 866                                 _my_printf("\n");
 867                         }
 868                         _my_printf("%02X ", dat92->svid_value[index]);
 869                 }
 870                 _my_printf("\n");
 871                 _my_printf("datset_tag:%u [0x%02X]\n", dat92->datset_tag, dat92->datset_tag);
 872                 _my_printf("datset_length:%u [0x%08X]\n", dat92->datset_length, dat92->datset_length);
 873                 _my_printf("datset_value:\n");
 874                 for (index = 0; index < dat92->datset_length; index++) {
 875                         if ((index % 16) == 0) {
 876                                 _my_printf("\n");
 877                         }
 878                         _my_printf("%02X ", dat92->datset_value[index]);
 879                 }
 880                 _my_printf("\n");
 881                 _my_printf("smpcnt_tag:%u [0x%02X]\n", dat92->smpcnt_tag, dat92->smpcnt_tag);
 882                 _my_printf("smpcnt_length:%u [0x%08X]\n", dat92->smpcnt_length, dat92->smpcnt_length);
 883                 _my_printf("smpcnt_value:%u [0x%04X]\n", dat92->smpcnt_value, dat92->smpcnt_value);
 884                 _my_printf("confrev_tag:%u [0x%02X]\n", dat92->confrev_tag, dat92->confrev_tag);
 885                 _my_printf("confrev_length:%u [0x%08X]\n", dat92->confrev_length, dat92->confrev_length);
 886                 _my_printf("confrev_value:%u [0x%08X]\n", dat92->confrev_value, dat92->confrev_value);
 887                 _my_printf("refrtm_tag:%u [0x%02X]\n", dat92->refrtm_tag, dat92->refrtm_tag);
 888                 _my_printf("refrtm_length:%u [0x%08X]\n", dat92->refrtm_length, dat92->refrtm_length);
 889                 _my_printf("refrtm_value:%u [0x%08X]\n", dat92->refrtm_value, dat92->refrtm_value);
 890                 _my_printf("smpsynch_tag:%u [0x%02X]\n", dat92->smpsynch_tag, dat92->smpsynch_tag);
 891                 _my_printf("smpsynch_length:%u [0x%08X]\n", dat92->smpsynch_length, dat92->smpsynch_length);
 892                 _my_printf("smpsynch_tag:%u [0x%02X]\n", dat92->smpsynch_tag, dat92->smpsynch_tag);
 893                 _my_printf("smprate_tag:%u [0x%02X]\n", dat92->smprate_tag, dat92->smprate_tag);
 894                 _my_printf("smprate_length:%u [0x%08X]\n", dat92->smprate_length, dat92->smprate_length);
 895                 _my_printf("smprate_value:%u [0x%04X]\n", dat92->smprate_value, dat92->smprate_value);
 896                 _my_printf("smpdata_tag:%u [0x%02X]\n", dat92->smpdata_tag, dat92->smpdata_tag);
 897                 _my_printf("smpdata_length:%u [0x%08X]\n", dat92->smpdata_length, dat92->smpdata_length);
 898                 _my_printf("smpdata_portnum:%u [0x%04X]\n", dat92->smpdata_portnum, dat92->smpdata_portnum);
 899                 _my_printf("smpdata_values:\n");
 900                 for (index = 0; index < dat92->smpdata_portnum; index++) {
 901                         if ((index % 8) == 0) {
 902                                 _my_printf("\n");
 903                         }
 904                         _my_printf("%d[%08X] %lf ",
 905                                 dat92->smpdata_values[index],
 906                                 dat92->smpdata_values[index],
 907                                 (double)(dat92->smpdata_values[index]));
 908                 }
 909                 _my_printf("\n");
 910                 if (smpquality_enable) {
 911                         _my_printf("smpdata_qualitys:\n");
 912                         for (index = 0; index < dat92->smpdata_portnum; index++) {
 913                                 if ((index % 8) == 0) {
 914                                         _my_printf("\n");
 915                                 }
 916                                 _my_printf("%d[%08X] ", dat92->smpdata_qualitys[index], dat92->smpdata_qualitys[index]);
 917                         }
 918                         _my_printf("\n");
 919                 }
 920                 _my_printf("=====================\n");
 921         }
 922 }
 923 
 924 
 925 /*
 926  * print_svpdu_asdu_dat91 - 打印数据
 927  * @dat92: 数据包
 928  * @smpquality_enable: 是否包含质量信息
 929  *
 930  */
 931 void print_svpdu_asdu_dat91(struct svpdu_asdu_dat91* dat91){
 932         u32 index = 0;
 933         if ( dat91 ) {
 934                 _my_printf("========= svpdu_asdu_dat91 ============\n");
 935                 _my_printf("asdu_length:%u [0x%04X]\n", dat91->asdu_length, dat91->asdu_length);
 936                 _my_printf("ln_name:%u [0x%02X]\n", dat91->ln_name, dat91->ln_name);
 937                 _my_printf("dataset_name:%u [0x%04X]\n", dat91->dataset_name, dat91->dataset_name);
 938                 _my_printf("ld_name:%u [0x%04X]\n", dat91->ld_name, dat91->ld_name);
 939                 _my_printf("i_pp:%u [0x%04X]\n", dat91->i_pp, dat91->i_pp);
 940                 _my_printf("i_p0:%u [0x%04X]\n", dat91->i_p0, dat91->i_p0);
 941                 _my_printf("u_pp:%u [0x%04X]\n", dat91->u_pp, dat91->u_pp);
 942                 _my_printf("t_delay:%u [0x%04X]\n", dat91->t_delay, dat91->t_delay);
 943                 _my_printf("smpdata_portnum:%u [0x%04X]\n", dat91->smpdata_portnum, dat91->smpdata_portnum);
 944                 _my_printf("smpdata_values:\n");
 945                 for (index = 0; index < dat91->smpdata_portnum; index++) {
 946                         if ((index % 6) == 0) {
 947                                 _my_printf("\n");
 948                         }
 949                         _my_printf("%d[%04X] ",
 950                                 dat91->smpdata_values[index],
 951                                 dat91->smpdata_values[index]);
 952                 }
 953                 _my_printf("\n");
 954                 _my_printf("status_word1:%u [0x%04X]\n", dat91->status_word1, dat91->status_word1);
 955                 _my_printf("status_word2:%u [0x%04X]\n", dat91->status_word2, dat91->status_word2);
 956                 _my_printf("smp_cnt:%u [0x%04X]\n", dat91->smp_cnt, dat91->smp_cnt);
 957                 _my_printf("smp_rate:%u [0x%02X]\n", dat91->smp_rate, dat91->smp_rate);
 958                 _my_printf("version:%u [0x%02X]\n", dat91->version, dat91->version);
 959                 _my_printf("=====================\n");
 960         }
 961 }
 962 
 963 
 964 #ifdef IEC61850SV_CONSOLE_DEMO
 965 
 966 #include "pcap_protocol.h"
 967 
 968 /*
 969  * _my_pcap_openrb/_my_pcap_openwb/_my_pcap_openab/_my_pcap_close
 970  *              - 可以根据需要改写该接口,如重定义为网口的recv\send、串口r\w等
 971  * @pfd:  文件地址、缓冲区地址、或者socket地址等
 972  * @str:  文件路径或者联机ip或者串口地址或者共享内存名称
 973  *
 974  */
 975 #ifdef PCAP_IOFILE
 976 #define _my_pcap_openrb(str)    (open((str), O_RDONLY | O_BINARY, S_IWRITE | S_IREAD))
 977 #define _my_pcap_openwb(str)    (open((str), O_CREAT | O_RDWR | O_BINARY, S_IWRITE | S_IREAD))
 978 #define _my_pcap_openab(str)    (open((str), O_CREAT | O_APPEND | O_RDWR | O_BINARY, S_IWRITE | S_IREAD))
 979 #define _my_pcap_close(pfd)     (close(pfd))
 980 #else /* 定义其他的io*/
 981 #endif
 982 
 983 /*
 984  * i92p_test_demo1 - 测试函数
 985  * @pcap_pathname:  pcap文件路径
 986  * @packet_pathname:  pcaket文件路径
 987  *
 988  */
 989 void i92p_test_demo1(const char* pcap_pathname, u8 smpquality_enable) {
 990         int pckt_count = 0;
 991         int read_count = 0;
 992         u8* ppd = 0;
 993         struct pcap_file_head pfh;
 994         struct pcap_packet_head pph;
 995 
 996         _my_svpdu_ioptr curr_pdf = 0;
 997         int bgn_pos = 0;
 998         int end_pos = 0;
 999 
1000         int index = 0;
1001         int count = 0;
1002 
1003         char chget;
1004 
1005         _my_pcap_ioptr fdpcap = 0;
1006 
1007         struct svpdu_lpdu_head lpdu_head;
1008         struct svpdu_apdu_head apdu_head;
1009         struct svpdu_asdu_dat92 asdu_dat92;
1010 
1011         fdpcap = _my_pcap_openrb(pcap_pathname);
1012         if ( fdpcap ) {
1013                 fdpcap = read_pcap_head(fdpcap, &pfh, &read_count);
1014                 if (0 != fdpcap) {
1015                         _tprintf("press [s] to break, any other keys to show pcap file header data.....\n");
1016                         chget = getchar();
1017                         if (chget == 's') {
1018                                 _my_pcap_close(fdpcap);
1019                                 return;
1020                         }
1021                         print_pcap_head(&pfh);
1022                         while (!(chget == 's')) {
1023                                 _tprintf("press [s] to break, any other keys to continue showing pcap packet header data......\n");
1024                                 chget = getchar();
1025                                 if (chget == 's') {
1026                                         break;
1027                                 }
1028                                 fdpcap = read_pcap_packet_head(fdpcap, &pph, pfh.magic, &read_count);
1029                                 if (0 != fdpcap) {
1030                                         pckt_count++;
1031                                         _tprintf("pcap data packet header count %d\n", pckt_count);
1032                                         print_pcap_packet_head(&pph);
1033                                         _tprintf("press [s] to break, any other keys to continue showing pcap packet content data.......\n");
1034                                         chget = getchar();
1035                                         if (chget == 's') {
1036                                                 break;
1037                                         }
1038                                         ppd = (u8 *)_my_malloc((size_t)(pph.caplen));
1039                                         fdpcap = read_pcap_packet_data(fdpcap, ppd, pph.caplen, &read_count);
1040                                         if ( 0 != fdpcap) {
1041                                                 print_pcap_packet_data(ppd, pph.caplen);
1042 
1043                                                 curr_pdf = (_my_i92p_rwptr)ppd;
1044                                                 curr_pdf = read_svpdu_lpdu_head(curr_pdf, pph.caplen, &lpdu_head, &read_count);
1045                                                 if (0 == curr_pdf) {
1046                                                         _tprintf("press [s] to break, read error...\n");
1047                                                         chget = getchar();
1048                                                         if (chget == 's') {
1049                                                                 break;
1050                                                         }
1051                                                 }
1052                                                 else {
1053                                                         print_svpdu_lpdu_head(&lpdu_head);
1054                                                         _tprintf("press [s] to break, any other keys to continue...\n");
1055                                                         //        chget = getchar();
1056                                                         if (chget == 's') {
1057                                                                 break;
1058                                                         }
1059                                                 }
1060 
1061                                                 curr_pdf = read_svpdu_apdu_head(curr_pdf, pph.caplen, &apdu_head, &read_count);
1062                                                 if (0 == curr_pdf) {
1063                                                         _tprintf("press [s] to break, read error...\n");
1064                                                         chget = getchar();
1065                                                         if (chget == 's') {
1066                                                                 break;
1067                                                         }
1068                                                 }
1069                                                 else {
1070                                                         print_svpdu_apdu_head(&apdu_head);
1071                                                         _tprintf("press [s] to break, any other keys to continue...\n");
1072                                                         chget = getchar();
1073                                                         if (chget == 's') {
1074                                                                 break;
1075                                                         }
1076                                                 }
1077 
1078                                                 for (index = 0; index<apdu_head.asdu_num_value; index ++) {
1079                                                         _tprintf("read  asdu_dat92 %d\n", index);
1080                                                         init_svpdu_asdu_dat92(&asdu_dat92);
1081                                                         curr_pdf = read_svpdu_asdu_dat92(curr_pdf, pph.caplen, &asdu_dat92, smpquality_enable, &read_count);
1082                                                         if (0 == curr_pdf) {
1083                                                                 _tprintf("press [s] to break, read error...\n");
1084                                                                 chget = getchar();
1085                                                                 if (chget == 's') {
1086                                                                         break;
1087                                                                 }
1088                                                         }
1089                                                         else {
1090                                                                 print_svpdu_asdu_dat92(&asdu_dat92, smpquality_enable);
1091                                                                 _tprintf("press [s] to break, any other keys to continue...\n");
1092                                                                 chget = getchar();
1093                                                                 if (chget == 's') {
1094                                                                         break;
1095                                                                 }
1096                                                         }
1097                                                 }//*/
1098 
1099                                                 free(ppd);
1100                                                 ppd = 0;
1101                                                 continue;
1102                                         }
1103                                         free(ppd);
1104                                         ppd = 0;
1105                                 }
1106                                 break;
1107                         }
1108                 }
1109                 _my_pcap_close(fdpcap);
1110         }
1111 }
1112 
1113 
1114 /*
1115  * i92p_test_demo2 - 测试函数,创建9-2包,并且读出来
1116  * @pcap_pathname:  pcap文件路径
1117  * @packet_pathname:  pcaket文件路径
1118  *
1119  */
1120 void i92p_test_demo2(const char* pcap_pathname, u8 smpquality_enable)
1121 {
1122         int index = 0;
1123 
1124         pcap_head pfh;
1125         pcap_packet_head pph;
1126 
1127         svpdu_lpdu_head lpduh;
1128         svpdu_apdu_head apduh;
1129         svpdu_asdu_dat92 asdu92;
1130 
1131         init_svpdu_asdu_dat92(&asdu92, true);
1132 
1133 /*
1134         asdu92->asdu_tag =
1135         for (intdex = 0;)
1136 
1137         _my_pcap_ioptr fdpcap = 0;
1138 
1139         fdpcap = _my_pcap_openwb(pcap_pathname);
1140 
1141         _my_svpdu_ioptr curr_pdf = 0;
1142 
1143 
1144         int pckt_count = 0;
1145         int write_count = 0;
1146 
1147 
1148         u8* ppd = 0;
1149         pcap_head pfh;
1150         pcap_packet_head pph;
1151 
1152         _my_svpdu_ioptr curr_pdf = 0;
1153         int bgn_pos = 0;
1154         int end_pos = 0;
1155 
1156         int index = 0;
1157         int count = 0;
1158 
1159         char chget;
1160 
1161         _my_pcap_ioptr fdpcap = 0;
1162 
1163         svpdu_lpdu_head lpdu_head;
1164         svpdu_apdu_head apdu_head;
1165         svpdu_asdu_dat92 asdu_dat92;
1166 
1167         fdpcap = _my_pcap_openrb(pcap_pathname);
1168         if ( fdpcap ) {
1169                 fdpcap = read_pcap_head(fdpcap, &pfh, &read_count);
1170                 if (0 != fdpcap) {
1171                         _tprintf("press [s] to break, any other keys to show pcap file header data.....\n");
1172                         chget = getchar();
1173                         if (chget == 's') {
1174                                 _my_pcap_close(fdpcap);
1175                                 return;
1176                         }
1177 */
1178 }
1179 
1180 
1181 /*
1182  * main - 测试main函数
1183  *
1184  */
1185 int main(int argc, char* argv[]) {
1186         char pcap_pathname[255];
1187 
1188         char chget;
1189 
1190                 u8 smpquality_enable = 1;
1191 //        while (1) {
1192                 memset(pcap_pathname, 0, 255);
1193                 _tprintf("please input pacp file full path name:\n");
1194                 //gets(pcap_pathname);
1195 
1196                 //i92p_test_demo(pcap_pathname, smpquality_enable);
1197                 i92p_test_demo1("D:/KRTV2_KF900/9-2lubo/09160016", smpquality_enable);
1198                 //i92p_test_demo("D:/1.pcap", smpquality_enable);
1199 
1200                 printf("press [s] to break,any other keys to continue end.\n");
1201                 chget = getchar();
1202                 if (chget == 's') {
1203                 //        break;
1204                 }
1205 //        }
1206 
1207         return 0;
1208 }
1209 
1210 #endif /* I92P_CONSOLE_DEMO */