55 lines
2.6 KiB
C
55 lines
2.6 KiB
C
/* 101/104共用的ASDU公共头解析与参数检查,不包含传输帧接口。 */
|
||
#ifndef IEC60870_CODEC_H
|
||
#define IEC60870_CODEC_H
|
||
|
||
#include "IEC60870_Types.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* ASDU公共头的解析结果;本模块不解析具体信息对象,调用方按type_id另行处理。 */
|
||
typedef struct {
|
||
uint8_t type_id; /* 类型标识 */
|
||
uint8_t object_count; /* VSQ中的信息对象数量 */
|
||
uint8_t is_sequence; /* VSQ中的SQ标志 */
|
||
uint8_t cause_of_transmission; /* 传送原因,不含标志位 */
|
||
uint8_t is_negative_confirm; /* 传送原因中的P/N标志 */
|
||
uint8_t is_test; /* 传送原因中的TEST标志 */
|
||
uint8_t originator_address; /* 源发地址 */
|
||
uint16_t common_address; /* ASDU公共地址 */
|
||
const uint8_t *information_objects; /* 信息对象区首地址 */
|
||
uint16_t information_objects_len; /* 信息对象区长度 */
|
||
const IEC60870_AppLayerParameters_t *parameters; /* 借用本次解析参数,不可修改。 */
|
||
} IEC60870_AsduInfo_t;
|
||
|
||
/**
|
||
* 功能:校验应用层字段宽度、默认源发地址及ASDU总长上限。
|
||
* 输入参数:parameters——待检查参数,允许NULL。
|
||
* 输出参数:无。
|
||
* 返回值:合法返回1,NULL或非法值返回0。
|
||
* 说明:不修改参数,不替调用方选择101/104的传输配置。
|
||
*/
|
||
extern int IEC60870_AppLayerParameters_Valid(const IEC60870_AppLayerParameters_t *parameters);
|
||
|
||
/**
|
||
* 功能:检查ASDU公共头及已知固定长度对象的最低载荷长度,解析公共头。
|
||
* 输入参数:parameters——非空应用层参数;asdu——ASDU首地址;asdu_len——总长度。
|
||
* 输出参数:asdu_info——解析成功时写入公共头字段和信息对象区位置。
|
||
* 返回值:解析成功返回1,参数或长度非法返回0且不修改asdu_info。
|
||
* 说明:头长为2+sizeOfCOT+sizeOfCA,IOA及最低载荷长度按sizeOfIOA计算。
|
||
* 未知/变长类型及零对象不做载荷检查;不检查多余尾字节、SQ/数量的类型约束、
|
||
* 传送原因、地址或信息对象内容是否合法。接收器在链路受理前调用本函数。
|
||
* information_objects及parameters均为借用,取对象期间报文和参数必须有效且不变。
|
||
*/
|
||
extern int IEC60870_Parse_ASDU_Header(const IEC60870_AppLayerParameters_t *parameters,
|
||
const uint8_t *asdu,
|
||
uint16_t asdu_len,
|
||
IEC60870_AsduInfo_t *asdu_info);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* IEC60870_CODEC_H */
|