Esempio n. 1
0
        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)
            };
        }
Esempio n. 2
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;
        }
Esempio n. 3
0
        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);
                        }
                    }
                }
            }
        }
Esempio n. 4
0
        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);
        }