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); }
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); } } }