服务器模式
服务器提供三种不同的模式:
默认模式(CS104_MODE_SINGLE_REDUNDANCY_GROUP)仅允许单个活动客户端连接。活动客户端连接是发送ASDU的连接。所有其他连接均为备用连接。事件只有一个队列。当没有客户端连接或没有连接处于活动状态时,也会存储事件。
第二种模式(CS104_MODE_CONNECTION_IS_REDUNDANCY_GROUP)允许多个活动客户端连接。每个连接都有其自己的事件队列。关闭客户端连接后,事件队列将被删除。当一个以上的客户端必须访问应用程序数据时,必须使用此模式。
第三种模式(CS104_MODE_MULTIPLE_REDUNDANCY_GROUPS)是最灵活的模式,它允许定义特定的冗余组。这些冗余组是共享同一事件队列的客户端组。对于每个冗余组,都有一个单独的事件队列实例。
可以使用CS104_Slave_setServerMode函数设置服务器模式。
CS104_Slave_setServerMode(slave, CS104_MODE_CONNECTION_IS_REDUNDANCY_GROUP);
限制客户端连接数
可以使用CS104_Slave_setMaxOpenConnections函数来限制客户端的数量。
CS104_Slave_setMaxOpenConnections(slave, 2);
在这种情况下,服务器将仅允许两个并发客户端连接。
设置本地端口和IP地址
IEC 60870-5-104的默认TCP端口为2404。可以使用CS104_Slave_setLocalPort函数更改该端口。
CS104_Slave_setLocalPort(slave, 2405);
默认情况下,服务器侦听所有本地IP地址。使用CS104_Slave_setLocalAddress函数,可以限制服务器侦听单个本地IP地址。
CS104_Slave_setLocalAddress(slave, "192.168.1.50");
使用此设置,CS104服务器将仅在分配了IP地址192.168.1.50的本地接口上进行侦听。
设置连接请求处理程序以限制访问和跟踪连接
该CS104_ConnectionRequestHandler可以用来限制对服务器的访问。使用返回值,应用程序可以允许或拒绝客户端的连接尝试。
一个CS104_ConnectionRequestHandler可以通过设置CS104_Slave_setConnectionRequestHandler功能。第二个参数是用户提供的任意对象,该对象将在调用时传递给处理程序。如果不需要,可以将其设置为NULL。
CS104_Slave_setConnectionRequestHandler(slave,connectionRequestHandler,NULL);
在处理程序中,您可以根据允许的客户端白名单来检查客户端IP地址,也可以实施黑名单。
static bool connectionRequestHandler(void* parameter, const char* ipAddress) { /* Allow only known IP addresses! */ /* You can implement your allowed client whitelist here */ if (strcmp(ipAddress, "127.0.0.1") == 0) { return true; else return false; }
使用TLS创建安全连接
CS 104标准也可以与TLS一起使用,以实现安全和经过身份验证的连接。
为了使用TLS,必须配置相关的参数,证书和私钥。
该配置存储在TLSConfiguration对象中。可以使用TLSConfiguration_create函数创建新的配置对象。
TLSConfiguration tlsConfig = TLSConfiguration_create(); TLSConfiguration_setChainValidation(tlsConfig, false); TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig, true); TLSConfiguration_setOwnKeyFromFile(tlsConfig, "server-key.pem", NULL); TLSConfiguration_setOwnCertificateFromFile(tlsConfig, "server.cer"); TLSConfiguration_addCACertificateFromFile(tlsConfig, "root.cer"); TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, "client1.cer"); /* create a new slave/server instance */ CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig);
可以通过将CONFIG_DEBUG_OUTPUT设置为1来启用到控制台的调试输出。这将默认启用调试输出。可以使用函数Lib60870_enableDebugOutput禁用调试输出。调试输出功能的默认实现将打印到控制台(使用printf)。如果需要重定向输出,最简单的方法是更改lib60870_common.c中调试输出lib60870_debug_print函数的实现。
该库包含一个C头文件,用于在使用GCC编译器时确定平台字节顺序(src / inc / internal / platform_endian.h)。这取决于C编译器提供的定义。在某些较旧的大字节序平台(如PowerPC或Coldfire)上,取决于编译器,这可能会失败。您可能需要定义
PLATFORM_IS_BIGENDIAN 1
编译库代码时。
例如放
-DPLATFORM_IS_BIGENDIAN = 1
在平台字节顺序为big endian时在GCC命令行上显示。
一些配置选项在库代码的编译时已固定。这些选项可以在文件lib60870_config.h中找到。
编译时选项包括对特定CS 104冗余模式的支持,对线程和信号量的支持(当库使用线程时需要),CS 104从站的最大TCP连接数以及其他。
以下参数存储在CS104_ConnectionParameters对象中。
参数 | 描述 |
---|---|
k | I格式,未经确认的APDU数。发送者将在k个未确认的I消息后停止发送。 |
w | I格式,未经确认的APDU数。接收者将在收到w条消息后确认最新消息 |
t0 | 建立连接的超时时间(以s为单位) |
t1 | 以I / U格式传输的APDU的超时时间(以秒为单位)。如果超时没有经过确认,连接将被关闭。发送方使用它来确定接收方是否未能确认消息。 |
t2 | 确认消息超时(以s为单位)。接收者使用此超时时间来确定必须发送消息确认的时间。 |
t3 | 连接空闲时发送测试电报的超时 |
该库支持以下ASDU(应用程序服务数据单元)类型。
讯息类型 | 描述 | C | C# |
---|---|---|---|
M_SP_NA_1(1) | 单点信息(布尔) | + | + |
M_SP_TA_1(2) | CP24Time2a的单点信息(BOOLEAN) | + | + |
M_DP_NA_1(3) | 双点信息(开/关/瞬态) | + | + |
M_DP_TA_1(4) | CP24Time2a的双点信息(ON / OFF /瞬态) | + | + |
M_ST_NA_1(5) | 脚步位置信息(-64…63,是瞬态的) | + | + |
M_ST_TA_1(6) | CP24Time2a的步位置信息(-64…63,是瞬态的) | + | + |
M_BO_NA_1(7) | Bitstring32(32位位串) | + | + |
M_BO_TA_1(8) | 使用CP24Time2a的Bitstring32(32位位串) | + | + |
M_ME_NA_1(9) | 标准化测量值(-1.0…+1.0) | + | + |
M_ME_TA_1(10) | 用CP24Time2a归一化的测量值(-1.0…+1.0) | + | + |
M_ME_NB_1(11) | 标定的测量值(-32768…+32767) | + | + |
M_ME_TB_1(12) | 使用CP24Time2a的标定测量值(-32768…+32767) | + | + |
M_ME_NC_1(13) | 短测量值(FLOAT32) | + | + |
M_ME_TC_1(14) | CP24Time2a的短测量值(FLOAT32) | + | + |
M_IT_NA_1(15) | 综合总计(带有质量指标的INT32) | + | + |
M_IT_TA_1(16) | CP24Time2a的累计总计(带有质量指标的INT32) | + | + |
M_EP_TA_1(17) | 保护设备事件 | + | + |
M_EP_TB_1(18) | 保护设备的打包启动事件 | + | + |
M_EP_TC_1(19) | 包装输出电路信息 | + | + |
M_PS_NA_1(20) | 带SCD的单点包装 | + | + |
M_ME_ND_1(21) | 归一化的测量值(-1.0…+1.0)无质量 | + | + |
M_SP_TB_1(30) | 使用CP56Time2a的单点信息(BOOLEAN) | + | + |
M_DP_TB_1(31) | CP56Time2a的双点信息(开/关/瞬态) | + | + |
M_ST_TB_1(32) | 使用CP56Time2a的步位置信息(-64…63是瞬态的) | + | + |
M_BO_TB_1(33) | 使用CP56Time2a的Bitstring32(32位位串) | + | + |
M_ME_TD_1(34) | 用CP56Time2a归一化的测量值(-1.0…+1.0) | + | + |
M_ME_TE_1(35) | 使用CP56Time2a的缩放测量值(-32768…+32767) | + | + |
M_ME_TF_1(36) | 使用CP56Time2a的短测量值(FLOAT32) | + | + |
M_IT_TB_1(37) | 使用CP56Time2a的累计总计(带有质量指标的INT32) | + | + |
M_EP_TD_1(38) | 使用CP56Time2a保护设备的事件 | + | + |
M_EP_TE_1(39) | CP56Time2a保护设备的打包启动事件 | + | + |
M_EP_TF_1(40) | CP56Time2a的打包输出电路信息 | + | + |
C_SC_NA_1(45) | 单指令(BOOLEAN) | + | + |
C_DC_NA_1(46) | 双指令(ON / OFF /瞬态) | + | + |
C_RC_NA_1(47) | 步骤指令 | + | + |
C_SE_NA_1(48) | 设定值指令,归一化值(-1.0…+1.0) | + | + |
C_SE_NB_1(49) | 设定值命令,标定值(-32768…+32767) | + | + |
C_SE_NC_1(50) | 设定值命令,短值(FLOAT32) | + | + |
C_BO_NA_1(51) | 位串命令(32位位串) | + | + |
C_SC_TA_1(58) | 带有CP56Time2a的单个命令(BOOLEAN) | + | + |
C_DC_TA_1(59) | CP56Time2a的双指令(ON / OFF /瞬态) | + | + |
C_RC_TA_1(60) | CP56Time2a的步进命令 | + | + |
C_SE_TA_1(61) | 设定值命令,使用CP56Time2a的归一化值(-1.0…+1.0) | + | + |
C_SE_TB_1(62) | 设定值命令,带有CP56Time2a的标定值(-32768…+32767) | + | + |
C_SE_TC_1(63) | 设定值命令,带CP56Time2a的短值(FLOAT32) | + | + |
C_BO_TA_1(64) | 使用CP56Time2a的位串命令(32位位串) | + | + |
M_EI_NA_1(70) | 初始化结束 | + | + |
C_IC_NA_1(100) | 询问命令 | + | + |
C_CI_NA_1(101) | 反询问命令 | + | + |
C_RD_NA_1(102) | 读命令 | + | + |
C_CS_NA_1(103) | 时钟同步命令 | + | + |
C_TS_NA_1(104) | 测试指令 | + | + |
C_RP_NA_1(105) | 重置过程命令 | + | + |
C_CD_NA_1(106) | 延迟采集命令 | + | + |
C_TS_TA_1(107) | 使用CP56Time2a的测试命令 | + | + |
P_ME_NA_1(110) | 测量值参数,归一化值 | + | + |
P_ME_NB_1(111) | 测量值参数,标定值 | + | + |
P_ME_NC_1(112) | 测量值参数,短浮点数 | + | + |
P_AC_NA_1(113) | 激活参数 | + | + |
F_FR_NA_1(120) | 准备好文件 | + | + |
F_SR_NA_1(121) | 准备就绪 | + | + |
F_SC_NA_1(122) | 呼叫/选择目录/文件/部分 | + | + |
F_LS_NA_1(123) | 最后一段 | + | + |
F_AF_NA_1(124) | ACK文件/节 | + | + |
F_SG_NA_1(125) | 文件段 | + | + |
F_DR_TA_1(126) | 文件目录 | + | + |
F_SC_NB_1(127) | 查询日志 | + | + |