コード例 #1
0
ファイル: MultiChannelSupport.cs プロジェクト: jimzrt/hyper
        private byte[] UnboxAndGetResponce(byte[] encapedCommand)
        {
            byte[] data     = null;
            var    encapCmd = (COMMAND_CLASS_MULTI_CHANNEL_V4.MULTI_CHANNEL_CMD_ENCAP)encapedCommand;
            var    destEPId = encapCmd.properties2.destinationEndPoint;

            if (destEPId > 0 && destEPId <= END_POINTS_COUNT)
            {
                var command = new List <byte>();
                command.Add(encapCmd.commandClass);
                command.Add(encapCmd.command);
                command.AddRange(encapCmd.parameter);

                #region Security and Capability
                if (encapCmd.commandClass == COMMAND_CLASS_SECURITY_2.ID &&
                    encapCmd.command == COMMAND_CLASS_SECURITY_2.SECURITY_2_COMMANDS_SUPPORTED_GET.ID)
                {
                    var rpt = new COMMAND_CLASS_SECURITY_2.SECURITY_2_COMMANDS_SUPPORTED_REPORT()
                    {
                        commandClass = new List <byte>(_network.GetSecureFilteredCommandClasses(ENDPOINTS_COMMAND_CLASSES, true))
                    };
                    data = EncapData(rpt, destEPId);
                }
                else if (encapCmd.commandClass == COMMAND_CLASS_SECURITY.ID &&
                         encapCmd.command == COMMAND_CLASS_SECURITY.SECURITY_COMMANDS_SUPPORTED_GET.ID)
                {
                    var rpt = new COMMAND_CLASS_SECURITY.SECURITY_COMMANDS_SUPPORTED_REPORT()
                    {
                        commandClassSupport = new List <byte>(_network.GetSecureFilteredCommandClasses(ENDPOINTS_COMMAND_CLASSES, true))
                    };
                    data = EncapData(rpt, destEPId);
                }
                else if (encapCmd.commandClass == COMMAND_CLASS_MULTI_CHANNEL_V4.ID &&
                         encapCmd.command == COMMAND_CLASS_MULTI_CHANNEL_V4.MULTI_CHANNEL_CAPABILITY_GET.ID)
                {
                    var rpt = new COMMAND_CLASS_MULTI_CHANNEL_V4.MULTI_CHANNEL_CAPABILITY_REPORT()
                    {
                        genericDeviceClass  = GENERIC_DEVICE_CLASS,
                        specificDeviceClass = SPECIFIC_DEVICE_CLASS,
                        properties1         = new COMMAND_CLASS_MULTI_CHANNEL_V4.MULTI_CHANNEL_CAPABILITY_REPORT.Tproperties1()
                        {
                            endPoint = destEPId
                        },
                        commandClass = GetCapability(destEPId)
                    };
                    data = EncapData(rpt, destEPId);
                }
                #endregion

                #region MULTI CHANNEL ASSOCIATIONS
                else if (encapCmd.commandClass == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.ID)
                {
                    if (encapCmd.command == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GET.ID)
                    {
                        var unboxedCmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GET)command.ToArray();
                        if (unboxedCmd.groupingIdentifier == _groupId)
                        {
                            var rpt = new COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_REPORT()
                            {
                                groupingIdentifier = _groupId,
                                nodeId             = _associatedNodeIds[destEPId - 1],
                                maxNodesSupported  = _maxNodesSupported
                            };
                            data = EncapData(rpt, destEPId);
                        }
                    }
                    else if (encapCmd.command == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GROUPINGS_GET.ID)
                    {
                        var unboxedCmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GROUPINGS_GET)command.ToArray();
                        {
                            var rpt = new COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GROUPINGS_REPORT()
                            {
                                supportedGroupings = 0x01
                            };
                        }
                    }
                    else if (encapCmd.command == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_REMOVE.ID)
                    {
                        var unboxedCmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_REMOVE)command.ToArray();
                        if (unboxedCmd.groupingIdentifier == _groupId)
                        {
                            foreach (var associateNodeId in unboxedCmd.nodeId)
                            {
                                if (!_associatedNodeIds[destEPId - 1].Contains(associateNodeId))
                                {
                                    _associatedNodeIds[destEPId - 1].Remove(associateNodeId);
                                }
                            }
                        }
                    }
                    else if (encapCmd.command == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_SET.ID)
                    {
                        var unboxedCmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_SET)command.ToArray();
                        if (unboxedCmd.groupingIdentifier == _groupId)
                        {
                            foreach (var associateNodeId in unboxedCmd.nodeId)
                            {
                                if (!_associatedNodeIds[destEPId - 1].Contains(associateNodeId))
                                {
                                    _associatedNodeIds[destEPId - 1].Add(associateNodeId);
                                }
                            }
                        }
                    }
                }
                #endregion

                #region Association GRP
                else if (encapCmd.commandClass == COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ID)
                {
                    if (encapCmd.command == COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_NAME_GET.ID)
                    {
                        var associationNameGetCmd = (COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_NAME_GET)command.ToArray();
                        var requestedGroupId      = associationNameGetCmd.groupingIdentifier;
                        if (requestedGroupId == _groupId)
                        {
                            var rpt = new COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_NAME_REPORT()
                            {
                                groupingIdentifier = _groupId,
                                lengthOfName       = (byte)Encoding.UTF8.GetByteCount(_groupName),
                                name = Encoding.UTF8.GetBytes(_groupName)
                            };
                            data = EncapData(rpt, destEPId);
                        }
                    }
                    else if (encapCmd.command == COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_INFO_GET.ID)
                    {
                        var associationInfoGetCmd = (COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_INFO_GET)command.ToArray();
                        var requestedGroupId      = associationInfoGetCmd.groupingIdentifier;
                        var rpt = new COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_INFO_REPORT()
                        {
                            properties1 = new COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_INFO_REPORT.Tproperties1()
                            {
                                listMode   = associationInfoGetCmd.properties1.listMode,
                                groupCount = 0x01
                            },
                            vg1 = new List <COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_INFO_REPORT.TVG1>()
                            {
                                new COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_INFO_REPORT.TVG1()
                                {
                                    groupingIdentifier = _groupId,
                                    mode     = 0,
                                    profile1 = 0,
                                    profile2 = 1
                                }
                            }
                        };
                        data = EncapData(rpt, destEPId);
                    }
                    else if (encapCmd.command == COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_COMMAND_LIST_GET.ID)
                    {
                        var associationCommandListGetCmd = (COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_COMMAND_LIST_GET)command.ToArray();
                        var requestedGroupId             = associationCommandListGetCmd.groupingIdentifier;
                        var rpt = new COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3.ASSOCIATION_GROUP_COMMAND_LIST_REPORT()
                        {
                            groupingIdentifier = _groupId,
                            listLength         = 0x02,
                            command            = new List <byte>()
                            {
                                COMMAND_CLASS_BASIC.ID,
                                COMMAND_CLASS_BASIC.BASIC_GET.ID,
                            }
                        };
                        data = EncapData(rpt, destEPId);
                    }
                }
                #endregion

                #region Multichannel Association
                else //if (encapCmd.commandClass == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.ID)
                {
                }
                #endregion
            }
            return(data);
        }
コード例 #2
0
        protected override void OnHandledInternal(DataReceivedUnit ou)
        {
            ou.SetNextActionItems();
            if (!ou.DataFrame.IsSkippedSecurity)
            {
                if (_securityManagerInfo.IsActive && _securityManagerInfo.Network.HasSecurityScheme(SecuritySchemes.S0))
                {
                    byte[] command = ReceivedAchData.Command;
                    if (command != null && command.Length > 1)
                    {
                        byte[] dataToSend         = null;
                        bool   isSubstituteDenied = false;
                        if ((command[1] == COMMAND_CLASS_SECURITY.SECURITY_NONCE_GET.ID ||
                             command[1] == COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION_NONCE_GET.ID) &&
                            handlingNonceGetFromNode != ReceivedAchData.SrcNodeId)
                        {
                            handlingNonceGetFromNode = ReceivedAchData.SrcNodeId;
                            var destNodeId = ReceivedAchData.DestNodeId > 0 ? ReceivedAchData.DestNodeId : _securityManagerInfo.Network.NodeId;
                            if (_securityManagerInfo.IsSenderNonceS0Disabled)
                            {
                                handlingNonceGetFromNode = 0;
                            }
                            else
                            {
                                dataToSend = _securityS0CryptoProvider.GenerateNonceReport(new OrdinalPeerNodeId(ReceivedAchData.SrcNodeId, destNodeId));
                            }
                            isSubstituteDenied = true;
                            if (_securityManagerInfo.DelaysS0.ContainsKey(SecurityS0Delays.NonceReport))
                            {
                                Thread.Sleep(_securityManagerInfo.DelaysS0[SecurityS0Delays.NonceReport]);
                            }
                        }
                        else if (command[1] == COMMAND_CLASS_SECURITY.SECURITY_COMMANDS_SUPPORTED_GET.ID && handlingNonceGetFromNode != ReceivedAchData.SrcNodeId)
                        {
                            handlingNonceGetFromNode = ReceivedAchData.SrcNodeId;
                            var scheme = (SecuritySchemes)ReceivedAchData.SecurityScheme;
                            if (scheme == SecuritySchemes.S0)
                            {
                                if (!_securityManagerInfo.Network.IsSecuritySchemesSpecified(ReceivedAchData.SrcNodeId) || _securityManagerInfo.Network.HasSecurityScheme(ReceivedAchData.SrcNodeId, SecuritySchemes.S0))
                                {
                                    var ccReport = new COMMAND_CLASS_SECURITY.SECURITY_COMMANDS_SUPPORTED_REPORT();
                                    if (!_securityManagerInfo.Network.HasSecurityScheme(SecuritySchemeSet.ALLS2))
                                    {
                                        if (ReceivedAchData.DestNodeId > 0 && ReceivedAchData.DestNodeId != _securityManagerInfo.Network.NodeId)
                                        {
                                            ccReport.commandClassSupport = new List <byte>(_securityManagerInfo.Network.GetVirtualSecureCommandClasses());
                                        }
                                        else
                                        {
                                            var secureCommandClasses = _securityManagerInfo.Network.GetSecureCommandClasses();
                                            if (secureCommandClasses != null)
                                            {
                                                ccReport.commandClassSupport = new List <byte>(secureCommandClasses);
                                            }
                                        }
                                        dataToSend = ccReport;
                                    }
                                    else
                                    {
                                        dataToSend = new byte[] { 0x98, 0x03, 0x00 };
                                    }
                                }
                            }
                        }

                        if (dataToSend != null)
                        {
                            ApiOperation sendData = null;

                            if (ReceivedAchData.DestNodeId > 0)
                            {
                                sendData = new SendDataBridgeOperation(ReceivedAchData.DestNodeId, ReceivedAchData.SrcNodeId, dataToSend, _securityManagerInfo.TxOptions);
                            }
                            else
                            {
                                sendData = new SendDataOperation(ReceivedAchData.SrcNodeId, dataToSend, _securityManagerInfo.TxOptions);
                            }


                            if (isSubstituteDenied)
                            {
                                sendData.SubstituteSettings.SetFlag(SubstituteFlags.DenySecurity);
                            }
                            sendData.CompletedCallback = (x) =>
                            {
                                var action = x as ActionBase;
                                if (action != null)
                                {
                                    handlingNonceGetFromNode = 0;
                                    SpecificResult.TotalCount++;
                                    if (action.Result.State != ActionStates.Completed)
                                    {
                                        SpecificResult.FailCount++;
                                    }
                                }
                            };
                            ou.SetNextActionItems(sendData);
                        }
                        else
                        {
                            ou.SetNextActionItems();
                        }
                    }
                }
                else
                {
                    "REJECT, {0}, {1} (IsNodeSecure[S0]={2}, IsActive={3}"._DLOG(
                        _securityManagerInfo.IsInclusion,
                        _securityManagerInfo.Network.HasSecurityScheme(ReceivedAchData.SrcNodeId, SecuritySchemes.S0),
                        _securityManagerInfo.Network.HasSecurityScheme(SecuritySchemes.S0),
                        _securityManagerInfo.IsActive);
                }
            }
        }