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(); byte nodeId = ReceivedAchData.SrcNodeId; byte[] command = ReceivedAchData.Command; var scheme = (SecuritySchemes)ReceivedAchData.SecurityScheme; bool isSuportedScheme = IsSupportedScheme(_network, command, scheme); if (command != null && command.Length > 1 && isSuportedScheme) { if (command[1] == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GET.ID) { var cmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GET)command; if (cmd.groupingIdentifier == _groupId) { var rpt = new COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_REPORT() { groupingIdentifier = _groupId, nodeId = _associatedNodeIds, maxNodesSupported = _maxNodesSupported }; var sendData = new SendDataExOperation(nodeId, rpt, TxOptions, scheme); ou.SetNextActionItems(sendData); } } else if (command[1] == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GROUPINGS_GET.ID) { var cmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GROUPINGS_GET)command; { var rpt = new COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_GROUPINGS_REPORT() { supportedGroupings = 0x01 }; var sendData = new SendDataExOperation(nodeId, rpt, TxOptions, scheme); ou.SetNextActionItems(sendData); } } else if (command[1] == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_REMOVE.ID) { var cmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_REMOVE)command; if (cmd.groupingIdentifier == _groupId) { foreach (var associateNodeId in cmd.nodeId) { if (!_associatedNodeIds.Contains(associateNodeId)) { _associatedNodeIds.Remove(associateNodeId); } } } } else if (command[1] == COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_SET.ID) { var cmd = (COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3.MULTI_CHANNEL_ASSOCIATION_SET)command; if (cmd.groupingIdentifier == _groupId) { foreach (var associateNodeId in cmd.nodeId) { if (!_associatedNodeIds.Contains(associateNodeId)) { _associatedNodeIds.Add(associateNodeId); } } } } } }