protected override void CreateInstance() { var firstSegmentCmd = CreateFirstSegmentCmd(_data); _firstSegmentSendOperation = new SendDataOperation(NodeId, firstSegmentCmd, TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; _nextSegmentSendOperation = new SendDataOperation(NodeId, null, TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; var completeCmd = new COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_SEGMENT_COMPLETE(); completeCmd.properties2.sessionId = _sessionId; byte[] completeCmdData = completeCmd; _segmentCompleteExpect = new ExpectDataOperation(0, NodeId, new ByteIndex[] { completeCmdData[0], completeCmdData[1], completeCmdData[2] }, SEGMENT_COMPLETE_TIMEOUT ) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0), Name = "ExpectData-SegmentComplete" }; var requestCmd = new COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_SEGMENT_REQUEST(); _segmentRequestResponse = new ResponseDataOperation(new ResponseDataDelegate(OnRequestSegment), _transportServiceManagerInfo.TxOptions, NodeId, ((byte[])requestCmd)[0], ((byte[])requestCmd)[1] ) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; var waitCmd = new COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_SEGMENT_WAIT(); _waitSegmentResponse = new ResponseDataOperation(new ResponseDataDelegate(OnWaitSegment), _transportServiceManagerInfo.TxOptions, NodeId, ((byte[])waitCmd)[0], ((byte[])waitCmd)[1] ) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; }
public SetupNodeLifelineTask(NetworkViewPoint network) : base() { _network = network; WakeUpInterval = 5 * 60; // In Seconds. IsFullSetup = true; _requestNodeInfo = new NodeInfoTask(_network, 0); _requestRoleType = new RequestDataOperation(0, 0, new COMMAND_CLASS_ZWAVEPLUS_INFO_V2.ZWAVEPLUS_INFO_GET(), _txOptions, new COMMAND_CLASS_ZWAVEPLUS_INFO_V2.ZWAVEPLUS_INFO_REPORT(), 2, 10000) { Name = "ReguestData (ZWavePlus)" }; _deleteReturnRoute = new DeleteReturnRouteOperation(0); _assignReturnRoute = new AssignReturnRouteOperation(0, 0); _sendAssociationCreate = new SendDataOperation(0, null, _txOptions); _sendMultichannelAssociationCreate = new SendDataOperation(0, null, _txOptions); _requestWakeUpCapabilities = new RequestDataOperation(0, 0, new COMMAND_CLASS_WAKE_UP_V2.WAKE_UP_INTERVAL_CAPABILITIES_GET(), _txOptions, new COMMAND_CLASS_WAKE_UP_V2.WAKE_UP_INTERVAL_CAPABILITIES_REPORT(), 2, 2000) { Name = "ReguestData (WakeUpCapabilites)" }; _sendWakeUpInterval = new SendDataOperation(0, null, _txOptions); SpecificResult.NodeInfo = _requestNodeInfo.SpecificResult; SpecificResult.SetWakeUpInterval = _sendWakeUpInterval.SpecificResult; SpecificResult.RequestRoleType = _requestRoleType.SpecificResult; Actions = new ActionBase[] { _requestNodeInfo, _requestRoleType, _deleteReturnRoute, _assignReturnRoute, _sendAssociationCreate, _sendMultichannelAssociationCreate, _requestWakeUpCapabilities, _sendWakeUpInterval }; _onActionCompleted = OnActionCompleted; }
public override void OnIncomingSubstituted(CustomDataFrame dataFrameOri, CustomDataFrame dataFrameSub, List <ActionHandlerResult> ahResults) { if (IsActive) { bool hasSendData = ahResults.FirstOrDefault( x => x.NextActions != null && x.NextActions.FirstOrDefault( y => y is SendDataOperation || y is SendDataExOperation) != null) != null; if (!hasSendData) { byte[] cmdData; byte srcNodeId; byte destNodeId; int lenIndex; if (TryParseCommand(dataFrameOri, out destNodeId, out srcNodeId, out lenIndex, out cmdData)) { if (cmdData[0] == COMMAND_CLASS_SUPERVISION.ID && cmdData[1] == COMMAND_CLASS_SUPERVISION.SUPERVISION_GET.ID) { COMMAND_CLASS_SUPERVISION.SUPERVISION_GET cmd = cmdData; var data = new COMMAND_CLASS_SUPERVISION.SUPERVISION_REPORT() { duration = 0, properties1 = new COMMAND_CLASS_SUPERVISION.SUPERVISION_REPORT.Tproperties1() { sessionId = cmd.properties1.sessionId }, status = 0xFF }; var tempAction = new SendDataOperation(srcNodeId, data, TxOptions); if ((((SubstituteIncomingFlags)dataFrameOri.SubstituteIncomingFlags) & SubstituteIncomingFlags.Security) > 0) { tempAction.SubstituteSettings.SetFlag(SubstituteFlags.UseSecurity); } var ahRes = new ActionHandlerResult(null); ahRes.NextActions.Add(tempAction); ahResults.Add(ahRes); } } } } }
protected override CustomDataFrame SubstituteIncomingInternal(CustomDataFrame packet, byte destNodeId, byte srcNodeId, byte[] cmdData, int lenIndex, out ActionBase additionalAction, out ActionBase completeAction) { CustomDataFrame ret = packet; additionalAction = null; completeAction = null; if (IsActive) { if (cmdData.Length > 1 && cmdData[0] == COMMAND_CLASS_TRANSPORT_SERVICE_V2.ID && ValidateCRC16Checksum(cmdData)) { byte id = (byte)(cmdData[1] & COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_FIRST_SEGMENT.ID_MASK); if (id == (COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_FIRST_SEGMENT.ID) && TransportServiceManagerInfo.TestNeedToIgnoreFirstSegment.CanBeUsed && TransportServiceManagerInfo.TestNeedToIgnoreFirstSegment.PullValue().Value ) { return(ret); } if (id == (COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_SUBSEQUENT_SEGMENT.ID) && TransportServiceManagerInfo.TestNeedToIgnoreSubsequentSegment.CanBeUsed && TransportServiceManagerInfo.TestOffset.CanBeUsed ) { var datagramOffset = SegmentsContainer.GetSegmentOffset(cmdData); var payloadLength = SegmentsContainer.GetSegmentPayloadLength(cmdData); if (TransportServiceManagerInfo.TestOffset.PullValue( val => { return(val >= datagramOffset && val <= (datagramOffset + payloadLength)); }) != null && TransportServiceManagerInfo.TestNeedToIgnoreSubsequentSegment.PullValue().Value ) { return(ret); } } lock (_lockObject) { if (_reassemblingData == null || _reassemblingData.SegmentsContainer.IsCompleted) { if (id == (COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_FIRST_SEGMENT.ID)) { RxReset(); _srcNodeId = srcNodeId; var cmdHeader = new byte[lenIndex]; Array.Copy(packet.Data, 0, cmdHeader, 0, cmdHeader.Length); var cmdFooter = new byte[packet.Data.Length - cmdHeader.Length - cmdData.Length - 1]; Array.Copy(packet.Data, lenIndex + packet.Data[lenIndex] + 1, cmdFooter, 0, cmdFooter.Length); _reassemblingData = new ReassemblingData { SegmentsContainer = new SegmentsContainer(cmdData), CompletedCmdHeader = cmdHeader, CompletedCmdFooter = cmdFooter }; if (_reassemblingData.SegmentsContainer.IsCompleted) { additionalAction = new SendDataOperation(srcNodeId, CreateSegmentCompletedCmd(), TransportServiceManagerInfo.TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; ret = CreateDataFrameOnReassemblingCompleted(packet); } else { // Start fragment rx timer. _rxTimerAction = CreateRxTimerAction(); additionalAction = _rxTimerAction; } } else if (id == (COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_SUBSEQUENT_SEGMENT.ID)) { if (_reassemblingData != null && _reassemblingData.SegmentsContainer.CheckForLastSegment(cmdData)) { additionalAction = new SendDataOperation(srcNodeId, CreateSegmentCompletedCmd(), TransportServiceManagerInfo.TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; } else if (srcNodeId != _nodeIdWaitResponded) { _nodeIdWaitResponded = srcNodeId; additionalAction = new SendDataOperation(srcNodeId, CreateSegmentWaitCmd(1), TransportServiceManagerInfo.TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; } } } else if (_srcNodeId == srcNodeId && id == (COMMAND_CLASS_TRANSPORT_SERVICE_V2.COMMAND_SUBSEQUENT_SEGMENT.ID)) { if (_rxTimerAction != null) { _rxTimerAction.Actions[0].Token.Reset(FRAGMENT_RX_TIMEOUT); // Reset fragment rx timer. } else { _rxTimerAction = CreateRxTimerAction(); additionalAction = _rxTimerAction; } _reassemblingData.SegmentsContainer.AddSegment(cmdData); if (_reassemblingData.SegmentsContainer.IsLastSegmentReceived) { if (_reassemblingData.SegmentsContainer.IsCompleted) { _rxTimerAction.Token.SetCompleted(); // Complete fragment rx timer. completeAction = _rxTimerAction; _rxTimerAction = null; additionalAction = new SendDataOperation(srcNodeId, CreateSegmentCompletedCmd(), TransportServiceManagerInfo.TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; ret = CreateDataFrameOnReassemblingCompleted(packet); } else { ushort missingOffset = _reassemblingData.SegmentsContainer.GetFirstMissingFragmentOffset(); additionalAction = new SendDataOperation(srcNodeId, CreateSegmentRequestCmd(missingOffset), TransportServiceManagerInfo.TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; } } } else { if (srcNodeId != _nodeIdWaitResponded) { _nodeIdWaitResponded = srcNodeId; additionalAction = new SendDataOperation(srcNodeId, CreateSegmentWaitCmd(_reassemblingData.SegmentsContainer.PendingSegmentsCount), TransportServiceManagerInfo.TxOptions) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }; } } } } } return(ret); }