You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

487 lines
19 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifdef __cplusplus
extern "C"
{
#endif
#include "glbtypes.h"
#include "sysincs.h"
#include "signal.h"
#include "mmsdefs.h"
#include "mms_pvmd.h"
#include "mms_pvar.h"
#include "mms_vvar.h"
#include "mms_err.h"
#include "mms_pcon.h"
#include "asn1defs.h"
#include "mmsop_en.h"
#include "locale.h"
#include "mvl_acse.h"
#include "mvl_log.h"
#include "tp4api.h"
#include "clntobj.h"
#include "smpval.h"
#include "lean_a.h"
#include "scl.h"
#include "sx_arb.h"
#include "mloguser.h"
#include "mvl_defs.h"
#include "str_util.h"
#define MAX_REF_LEN 65 //最大的引用长度
#define MAX_NAME_LEN 128 //最大的名称长度
#define MAX_FILE_NAME 255 //最大文件名称长度
#define MAX_NAME_BUF 5000 //最大名称缓冲区长度
#define MAX_RPT_NAME_BUF 1000 //最大报告控制块名称缓冲区长度
#define MAX_OBJ_NAME 5000 //数据集中元素的最大数量
#define MAX_RPT_DATA_NUM 5000 //一个报告中的最大数据数目
//报告控制块相关结构体定义
typedef struct
{
ST_INT mmsbool; /* named so not confused with C++ 'bool' type */
ST_INT int8u;
ST_INT int16u; /* for SqNum. */
/* NOTE: UCA server sends int8u for SqNum */
/* but it's safe to decode it as int16u */
ST_INT int32u; /* for IntgPd */
ST_INT vstring65; /* for RptID & ObjectReference */
ST_INT btime6; /* for EntryTime */
ST_INT ostring8; /* for EntryID */
ST_INT vstring32; /* for RptId */
ST_INT bvstring6; /* for TrgOps (IEC) */
ST_INT bvstring8; /* for OptFlds,TrgOps (UCA) */
ST_INT bvstring10; /* for OptFlds (IEC) */
ST_INT bstr6; /* for Reason (IEC) */
ST_INT bstr8; /* for Reason (UCA) */
ST_INT bstr9; /* for Writing OptFlds (IEC). Can't write all 10 bits.*/
} RPT_TYPEIDS;
typedef struct
{
ST_CHAR RptID[66];
struct /* BVstring */
{
ST_INT16 len_1;
ST_UCHAR data_1[2]; /* BVstring9 - need 2 bytes */
} OptFlds;
ST_UINT16 SqNum;
MMS_BTIME6 TimeOfEntry;
ST_CHAR DatSetNa[66];
ST_BOOLEAN BufOvfl;
ST_UINT16 SubSeqNum;
ST_BOOLEAN MoreSegmentsFollow;
ST_UINT8 EntryID [8]; /* ostring8 */
ST_UINT32 ConfRev;
ST_UINT8 *Inclusion; /* ptr to bitstring */
/* Must alloc appropriate size */
/* buffer for bitstring. */
ST_CHAR *dataRefName; /* ptr to array of dataRefName */
MMS_BVSTRING *Reason; /* ptr to array of Reason bitstrings */
/* WARNING: this only works for variable*/
/* len bitstring up to 8 bits. */
} RCB_DATA;
typedef struct
{
MVL_VAR_ASSOC * RptID;
MVL_VAR_ASSOC * OptFlds;
MVL_VAR_ASSOC * SqNum;
MVL_VAR_ASSOC * TimeOfEntry;
MVL_VAR_ASSOC * DatSetNa;
MVL_VAR_ASSOC * BufOvfl;
MVL_VAR_ASSOC * SubSeqNum;
MVL_VAR_ASSOC * MoreSegmentsFollow;
MVL_VAR_ASSOC * EntryID;
MVL_VAR_ASSOC * ConfRev;
MVL_VAR_ASSOC * Inclusion;
MVL_VAR_ASSOC ** dataRefName; /* array of ptrs */
MVL_VAR_ASSOC ** dataValue; /* array of ptrs */
MVL_VAR_ASSOC ** Reason; /* array of ptrs */
} RCB_VAR;
typedef struct
{
DBL_LNK link; /* allows linked list of this struct */
ST_INT rcb_type; /* RCB_TYPE_UCA, RCB_TYPE_IEC_BRCB, etc. */
ST_INT rcb_create_type; /*rcb建立方式0表示动态建立1表示静态建立 liwei 2012.07.13*/
/* see RCB_TYPE.. defines in 'mvl_uca.h'. */
ST_CHAR RptID [66]; /* RptID of this RCB (Vstring65) */
OBJECT_NAME **varNameArray; /* array of variable names in NVL */
ST_INT numDsVar; /* num variables in rpt dataset */
ST_INT *typeIdArr; /* array of type ids */
ST_INT InclusionTypeid; /*Type ID for Inclusion Bitstring*/
RCB_DATA rcb_data;
RCB_VAR rcb_var;
} RCB_INFO;
typedef struct
{
RPT_TYPEIDS *rpt_typeids;
RCB_INFO *rcb_info_list; /* linked list of RCB_INFO structs */
} ALL_RCB_INFO; /* used to track multiple RCBs. */
typedef struct
{
ST_CHAR *RptID;
struct /* BVstring */
{
ST_UINT16 len_1;
ST_UCHAR data_1[2]; /* BVstring9 - need 2 bytes */
} *OptFlds;
ST_UINT16 *SqNum;
MMS_BTIME6 *TimeOfEntry;
ST_CHAR *DatSetNa;
ST_BOOLEAN *BufOvfl;
ST_UINT16 *SubSeqNum;
ST_BOOLEAN *MoreSegmentsFollow;
ST_UINT8 *EntryID; /* ostring8 */
ST_UINT32 *ConfRev;
ST_UINT8 *Inclusion; /* ptr to bitstring */
/* Must alloc appropriate size */
/* buffer for bitstring. */
ST_CHAR **dataRefName; /* ptr to array of dataRefName */
ST_VOID **Value;
MMS_BVSTRING **Reason; /* ptr to array of Reason bitstrings */
/* 增加字段,存储此报告发送的数据集所包含的数据的个数 */
ST_INT num_data;
}RPT_INFO;
typedef struct
{
time_t time; /* number of seconds elapsed since midnight (00:00:00), January 1, 1970 */
}MMS_GTIME;
typedef struct
{
ST_UCHAR value[1];
}MMS_BSTRING;
typedef struct
{
ST_INT32 numMSec; /* Number of milliseconds since midnight */
}MMS_BTIME4;
typedef struct
{
ST_UCHAR value[1];
}MMS_OSTRING;
typedef struct
{
ST_INT16 data_len;
ST_UCHAR value[1];
}MMS_OVSTRING;
typedef wchar_t ST_WCHAR;
typedef struct
{
ST_CHAR name[MAX_REF_LEN + 1]; /* 指其Reference */
ST_INT type; /* 指其rt->el_tag */
ST_INT len; /* 指其rt->u.p.el_len */
ST_INT data_size; /* 指叶子数据长度 */
union
{
ST_BOOLEAN *bool_value;
ST_UCHAR *bcd_value;
ST_INT8 *int8_value;
ST_INT16 *int16_value;
ST_INT32 *int32_value;
ST_UINT8 *uint8_value;
ST_UINT16 *uint16_value;
ST_UINT32 *uint32_value;
ST_FLOAT *float_value;
ST_DOUBLE *double_value;
ST_CHAR *vstring_value;
ST_CHAR *fstring_value;
ST_WCHAR *utf8string_value;
ST_WCHAR *utf8vstring_value;
MMS_GTIME *gtime_value;
MMS_BTIME4 *btime4_value;
MMS_BTIME6 *btime6_value;
MMS_UTC_TIME *utctime_value;
MMS_BSTRING *bstring_value;
MMS_BVSTRING *bvstring_value;
MMS_OSTRING *ostring_value;
MMS_OVSTRING *ovstring_value;
ST_VOID *any_value;
}value;
MMS_BVSTRING *reason_code;
}PRIM_DATA;
//内存监控变量
static ST_CHAR *spareMem;
static ST_INT memErrDetected;
//服务器断开回调函数指针
typedef unsigned int (*SERVER_DISC_CALLBACK_FUN)(char *server_name, int reason);
//报告接收回调函数指针
typedef unsigned int (*RPT_CALLBACK_FUN)(char *server_name, RPT_INFO *rpt_info);
//控制报告接收回调函数指针
typedef unsigned int (*CTRL_RPT_CALLBACK_FUN)(char *server_name, char *oper_name, char oper_result);
//mms数据结构信息
typedef struct
{
ST_CHAR name[MAX_REF_LEN + 1]; //本层名称
ST_INT type; //数据类型
ST_INT len; //数据长度
ST_INT size; //数据占用字节数
}DATA_DIR;
//mms文件列表结构信息
typedef struct
{
ST_UINT32 fsize; //文件长度
ST_BOOLEAN mtimpres; //是否显示最后一次修改时间标志
time_t mtime; //文件最后一次修改时间
ST_CHAR filename [MAX_FILE_NAME+1]; //文件名称
} DIR_ENTRY;
//客户端控制信息结构体,每连接一个服务器,应创建一个该结构体实例,并加入链表中
typedef struct
{
DBL_LNK l; //存放双向循环链表指针的结构体
ST_CHAR sever_name[MAX_NAME_LEN]; //被调用的远程服务器名称
ST_UINT8 level;
MVL_NET_INFO *clientNetInfo; //存放和远程服务器间联系的网络信息的结构体
MVL_VMD_CTRL *client_vmd; //存放远程服务器数据信息的结构体
ALL_RCB_INFO *all_rcb_info;
SERVER_DISC_CALLBACK_FUN server_disk_callback_fun;//服务器断开连接回调函数
RPT_CALLBACK_FUN rpt_callback_fun; //报告接收回调函数
CTRL_RPT_CALLBACK_FUN ctrl_rpt_callback_fun; //控制结束报告回调函数
}CLIENT_CTRL;
CLIENT_CTRL *head_client_ctrl_list;
/*外部接口函数*/
//初始化及连接管理函数
__declspec(dllexport) unsigned int mms_init();
__declspec(dllexport) unsigned int mms_quit();
__declspec(dllexport) unsigned int mms_connect(char *server_name, int level);
__declspec(dllexport) unsigned int mms_disconnect(char *server_name);
//目录服务函数
__declspec(dllexport) unsigned int mms_directory_service_fun(char *server_name);
__declspec(dllexport) unsigned int mms_directory_create_fun(char *server_name, char *scl_file_name, char *ied_name, char *access_point_name);//2010.5.26
__declspec(dllexport) unsigned int mms_free_directory_service_fun(char *server_name);//添加函数,用于释放指定服务器的虚拟设备控制体资源
//获得逻辑设备、逻辑节点、数据集、日志名称列表函数
__declspec(dllexport) unsigned int mms_fetch_domain_name_list(char *server_name, char(**domain_names)[MAX_NAME_LEN], int *num_dom);
__declspec(dllexport) void mms_free_domain_name_list(char (*domain_names)[MAX_NAME_LEN]);
__declspec(dllexport) unsigned int mms_fetch_var_name_list(char *server_name, char *domain_name, char(**var_names)[MAX_NAME_LEN], int *num_var);
__declspec(dllexport) void mms_free_var_name_list(char (*var_names)[MAX_NAME_LEN]);
__declspec(dllexport) unsigned int mms_fetch_dataset_name_list(char *server_name, char *domain_name, char (**ds_names)[MAX_NAME_LEN], int *num_ds);
__declspec(dllexport) void mms_free_dataset_name_list(char (*ds_names)[MAX_NAME_LEN]);
__declspec(dllexport) unsigned int mms_fetch_dataset_entry_name_list(char *server_name, char *dataset_ref, char (**var_refs)[MAX_NAME_LEN], int *num_vars);
__declspec(dllexport) void mms_free_dataset_entry_name_list(char (*var_refs)[MAX_NAME_LEN]);
__declspec(dllexport) unsigned int mms_fetch_log_name_list(char *server_name, char *domain_name, char (**log_names)[MAX_NAME_LEN], int *log_num);
__declspec(dllexport) void mms_free_log_name_list(char (*log_names)[MAX_NAME_LEN]);
//数据目录通用函数,可获得指定引用下一级的数据信息目录
__declspec(dllexport) unsigned int mms_fetch_data_directory(char *server_name, char *var_ref, DATA_DIR **dir_info, int *num);
__declspec(dllexport) void mms_free_data_directory(DATA_DIR *dir_info);
//叶子节点数据读写函数(本地)
__declspec(dllexport) unsigned int mms_local_read_prim_data(char *server_name, char *prim_ref, void *prim_buf);
__declspec(dllexport) unsigned int mms_local_write_prim_data(char *server_name, char *prim_ref, void *prim_buf);
//远程读写1个数据至本地数据缓冲区中
__declspec(dllexport) unsigned int mms_remote_read_1_data(char *server_name, char *data_ref);
__declspec(dllexport) unsigned int mms_remote_write_1_data(char *server_name, char *data_ref);
//远程读写多个数据至本地数据缓冲区中
__declspec(dllexport) unsigned int mms_remote_read_data(char *server_name, int var_num, char **var_refs, void *reserved);
__declspec(dllexport) unsigned int mms_remote_write_data(char *server_name, int var_num, char **var_refs, void *reserved);
//远程读写指定数据集数据至本地数据缓冲区
__declspec(dllexport) unsigned int mms_remote_read_dataset(char *server_name, char *dataset_ref, void *reserved );
__declspec(dllexport) unsigned int mms_remote_write_dataset(char *server_name, char *dataset_ref, void *reserved );
//动态建立数据集及删除数据集函数
__declspec(dllexport) unsigned int mms_create_dataset(char *server_name, char *dataset_ref, int var_num, char (*var_refs)[MAX_NAME_LEN], void *reserved);
__declspec(dllexport) unsigned int mms_delete_dataset(char *server_name, char *dataset_ref, void *reserved);
//报告回调函数注册
__declspec(dllexport) unsigned int mms_register_rpt_callback(char *server_name, RPT_CALLBACK_FUN callback_fun);
//服务器断开连接函数注册
__declspec(dllexport) unsigned int mms_register_server_disc_callback(char *server_name, SERVER_DISC_CALLBACK_FUN callback_fun);
//控制报告回调函数注册
__declspec(dllexport) unsigned int mms_register_ctrl_rpt_callback(char *server_name, CTRL_RPT_CALLBACK_FUN callback_fun);
//将报告数据转换为叶子节点数据的转换函数
__declspec(dllexport) unsigned int mms_rpt_info_to_prim_data_list(char *server_name, RPT_INFO *rpt_info, PRIM_DATA **prims, int *num );
__declspec(dllexport) void mms_free_prim_data_list(PRIM_DATA *prim_list, int num );
//获取与释放文件列表函数
__declspec(dllexport) unsigned int mms_get_file_list(char *server_name, char *fs_name, DIR_ENTRY **file_info, int *file_num, void *reserved );
__declspec(dllexport) unsigned int mms_free_file_list(char *server_name, DIR_ENTRY *dir_entries );
//获取远程服务器文件函数
__declspec(dllexport) unsigned int mms_get_file(char *server_name, char *rem_file_name, char *loc_file_name, void *reserved);
//更改远程服务器上文件名函数
__declspec(dllexport) unsigned int mms_rename_file(char *server_name, char *old_file_name, char *new_file_name, void *reserved );
//用本地文件替代远程服务器上的文件函数
__declspec(dllexport) unsigned int mms_set_file(char *server_name, char *loc_file_name, char *rem_file_name, void *reserved );
//删除远程服务器文件函数
__declspec(dllexport) unsigned int mms_delete_file(char *server_name, char *file_name, void *reserved);
__declspec(dllexport) unsigned int mms_server_create_fun(char *server_name, char *scl_file_name, char *ied_name, char *access_point_name);
__declspec(dllexport) unsigned int mms_modify_server_ip_addr(char *server_name, ST_ULONG ip_addr);
////////////////////////////////////
__declspec(dllexport) unsigned int mms_jinit(char *server_name, char *log_ref);
__declspec(dllexport) unsigned int mms_jstat(char *server_name, char *log_ref);
__declspec(dllexport) unsigned int mms_jread(char *server_name, char *log_ref, int start_flag, int stop_flag,
char *start_entry, long num_of_entries, MMS_BTOD start_time, MMS_BTOD end_time);
__declspec(dllexport) unsigned int set_opear_name(char *opear_name);
////////////////////////////////////
typedef struct
{
char name[256];
int type;
int size;
char desc[1025];
}DATA_INFO;
__declspec(dllexport) unsigned int mms_fetch_dataset_datainfo(char *server_name,
char *dataset_ref,
DATA_INFO **data_info,
int *num,
int desc_get_mode,
int leaf_mode);
__declspec(dllexport) unsigned int mms_fetch_leaf_data_info(char *server_name,
char *data_ref,
char *comp_name,
DATA_INFO *data_info,
int *leaf_num,
int leaf_mode);
unsigned int get_dU_str(char *server_name, char *in_str, char *out_str);
//获取指定数据引用的类型及长度
__declspec(dllexport) unsigned int mms_fetch_data_type(char *server_name, char *var_ref, int *data_type, int *data_size, int *data_len);
//////////////////////////////////////
/*以下暂时为内部函数,不提供外部接口*/
MVL_VAR_ASSOC * fetch_vmd_var_ctrl(MVL_VMD_CTRL *vmd_ctrl, char *data_ref, char *data_name, char *ld_name, ST_UINT8 level);
MVL_NVLIST_CTRL * fetch_vmd_nvl_ctrl(MVL_VMD_CTRL *vmd_ctrl, char *dataset_ref, char *dataset_name, char *ld_name);
ST_RET fetch_remote_name_list(MVL_NET_INFO *clientNetInfo, char *name_dom, char(*name_list)[128], char(*rpt_list)[128], int *num_name, int *num_rpt, int mms_class, int objscope, ST_UINT8 level);
ST_RET fetch_remote_domain_name_list(MVL_NET_INFO *clientNetInfo, char(*name_list)[128], int *num_dom);
ST_RET fetch_remote_var_dom_list(MVL_NET_INFO *clientNetInfo, char *name_dom, char(*name_list)[128], char(*rpt_list)[128], int *num_var, int *num_rpt, ST_UINT8 level);
ST_RET fetch_remote_var_attr_dom(MVL_NET_INFO *clientNetInfo, MVL_VMD_CTRL *vmd_ctrl, char *name_dom, char *name_var, int *type_id, int *data_size);
ST_RET fetch_remote_nvl_dom_list(MVL_NET_INFO *clientNetInfo, char *name_dom, char(*name_list)[128], int *num_nvl);
ST_RET fetch_remote_nvl_attr_dom(MVL_NET_INFO *clientNetInfo, char *name_dom, char *name_nvl, OBJECT_NAME *var_obj, int *num_var_nvl);
MVL_NET_INFO *SearchConnectServer(char *server_name, CLIENT_CTRL **client_ctrl);
CLIENT_CTRL * FindConnectServer(MVL_NET_INFO *clientNetInfo);
/*以下为mms内部函数不提供外部接口*/
void client_server(LPVOID pParam);
static ST_VOID disc_ind_fun (MVL_NET_INFO *cc, ST_INT discType);
MVL_NET_INFO *connectToServer (ST_CHAR *clientARName, ST_CHAR *serverARName);
ST_RET disconnectFromServer (MVL_NET_INFO *clientNetInfo);
ST_RET waitReqDone (MVL_REQ_PEND *req, ST_INT timeout);
ST_VOID doCommService ();
unsigned int init_iec_rpt (MVL_NET_INFO *clientNetInfo, RPT_TYPEIDS *rpt_typeids,MVL_VMD_CTRL *vmd_ctrl,
ST_CHAR *dom_name, ST_CHAR *rcb_name);
ST_RET var_read (MVL_NET_INFO *net_info, ST_CHAR *varName, ST_INT scope,
ST_CHAR *domName,ST_INT type_id, ST_VOID *dataDest,
ST_INT timeOut);
ST_RET nvl_read (MVL_NET_INFO *net_info, ST_CHAR *nvlName, ST_INT scope,
ST_CHAR *domName,ST_INT *type_id, ST_CHAR **dataDest,
ST_INT num_var, ST_INT timeOut);
ST_RET var_write (MVL_NET_INFO *netInfo, ST_CHAR *varName, ST_INT scope,
ST_CHAR *domName, ST_INT type_id, ST_VOID *dataSrc,
ST_INT timeOut);
ST_RET nvl_write (MVL_NET_INFO *net_info, ST_CHAR (*varName)[MAX_REF_LEN], ST_INT scope,
ST_CHAR *domName,ST_INT *type_id, ST_CHAR **dataSrc,
ST_INT num_var, ST_INT timeOut);
ST_RET m_var_read (MVL_NET_INFO *net_info, ST_CHAR (*varName)[MAX_REF_LEN], ST_INT scope,
ST_CHAR (*domName)[MAX_REF_LEN], ST_INT *type_id, ST_CHAR **dataDest,
ST_INT num_var, ST_INT timeOut);
ST_RET m_var_write (MVL_NET_INFO *net_info, ST_CHAR (*varName)[MAX_REF_LEN], ST_INT scope,
ST_CHAR (*domName)[MAX_REF_LEN], ST_INT *type_id, ST_CHAR **dataSrc,
ST_INT num_var, ST_INT timeOut);
static ST_RET getFile (MVL_NET_INFO *clientNetInfo, ST_CHAR *loc_file, ST_CHAR *rem_file);
static ST_VOID init_mem ();
static ST_VOID free_mem();
static ST_VOID init_log_cfg (ST_VOID);
static ST_VOID mem_chk_error_detected (ST_VOID);
static ST_VOID *my_malloc_err (ST_UINT size);
static ST_VOID *my_calloc_err (ST_UINT num, ST_UINT size);
static ST_VOID *my_realloc_err (ST_VOID *old, ST_UINT size);
ST_RET rpt_typeids_find (RPT_TYPEIDS *rpt_typeids);
RCB_INFO *rcb_info_create (MVL_NET_INFO *net_info, ST_CHAR *domName, MVL_VMD_CTRL *vmd_ctrl,
ST_CHAR *rcbName, RPT_TYPEIDS *rpt_typeids, ST_INT timeOut);
ST_VOID rcb_info_destroy (RCB_INFO *rcb_info);
ST_RET u_iec_rpt_ind (MVL_COMM_EVENT *event);
ST_VOID u_iec_rpt_ind_data (MVL_VAR_ASSOC **info_va,
ST_UINT8 *OptFldsData, /* ptr to data part of OptFlds bvstring */
ST_UINT8 *InclusionData, /* ptr to Inclusion bstring */
RCB_INFO *rcb_info,
ST_INT va_total,
RPT_INFO *rpt_info);
ST_INT vmd_type_id_create (MVL_VMD_CTRL *vmd_ctrl, ST_CHAR *type_name, ST_UCHAR *asn1_data, ST_UINT asn1_len);
//liwei 2012.07.13
ST_INT my_type_id_create_from_tdl (ST_CHAR *type_name, ST_CHAR *tdl, MVL_VMD_CTRL *vmd_ctrl);
ST_RET rcb_info_var_create (RCB_INFO *rcb_info, RPT_TYPEIDS *rpt_typeids);
static ST_VOID kbService (ST_VOID);
//yhc
__declspec(dllexport) void mms_free_dataset_datainfo(DATA_INFO *data_info);
//重新装置osicfg
__declspec(dllexport) unsigned int mms_load_OsiCfg(); //yhc
#ifdef __cplusplus
}
#endif