private async void _comms_FrameReady(object sender, Frame frame) { if (_currentState == States.Disposed) { return; } if (frame.FrameType == Frame.FrameTypes.RxAtCommandResponse) { if (frame.ATCommandString == "WR") { HandleWriteEPROMFrame(frame); } else if (frame.Payload != null && frame.Payload.Length > 0) { HandleATReadFrame(frame); } else { HandleATWriteFrame(frame); } } else if (frame.FrameType == Frame.FrameTypes.RxReceivePacket) { if (frame.ClusterId == 0x0005) { var endpointFrame = new Frame(); endpointFrame.FrameType = Frame.FrameTypes.TxExplicitAddressCommand; endpointFrame.ClusterId = Convert.ToUInt16(0x8000 | frame.ClusterId); endpointFrame.DestinationAddress64Bit = 0x00000000; endpointFrame.DestinationAddress16Bit = 0x0000; endpointFrame.SourceEndPoint = 0x00; endpointFrame.DestinationEndPoint = 0x00; endpointFrame.Payload = new byte[6]; endpointFrame.Payload[0] = frame.Payload[0]; endpointFrame.Payload[1] = 0x00; /* OK */ endpointFrame.Payload[2] = frame.Payload[1]; endpointFrame.Payload[3] = frame.Payload[2]; endpointFrame.Payload[4] = 1; /* Number of end points */ endpointFrame.Payload[5] = LOCAL_ENDPOINT; /* Address of the end point */ await _comms.SendFrameAsync(endpointFrame); } else if (frame.ClusterId == 0x0004) { var endpointFrame = new Frame(); endpointFrame.FrameType = Frame.FrameTypes.TxExplicitAddressCommand; endpointFrame.ClusterId = Convert.ToUInt16(0x8000 | frame.ClusterId); endpointFrame.DestinationAddress64Bit = 0x00000000; endpointFrame.DestinationAddress16Bit = 0x0000; endpointFrame.SourceEndPoint = 0x00; endpointFrame.DestinationEndPoint = 0x00; var inClusters = GetInClusters(); endpointFrame.Payload = new byte[13 + (inClusters.Count * 2)]; endpointFrame.Payload[0] = frame.Payload[0]; endpointFrame.Payload[1] = 0x00; /* OK */ endpointFrame.Payload[2] = frame.Payload[1]; endpointFrame.Payload[3] = frame.Payload[2]; endpointFrame.Payload[4] = Convert.ToByte(endpointFrame.Payload.Length - 5); /* Bytes Sent */ endpointFrame.Payload[5] = frame.Payload[3]; endpointFrame.Payload[6] = 0x04; /* HA Client */ endpointFrame.Payload[7] = 0x01; endpointFrame.Payload[8] = 0x02; /* On/Off Output */ endpointFrame.Payload[9] = 0x00; endpointFrame.Payload[10] = 0x30; /* Version */ endpointFrame.Payload[11] = Convert.ToByte(inClusters.Count); /* Number of Cluster Types We Accept */ var payloadIndex = 12; foreach (var inCluster in inClusters) { endpointFrame.Payload[payloadIndex++] = Convert.ToByte(inCluster & 0xFF); /* Cluster Type => Basic */ endpointFrame.Payload[payloadIndex++] = Convert.ToByte(inCluster >> 8); } endpointFrame.Payload[payloadIndex] = 0x00; await _comms.SendFrameAsync(endpointFrame); } else if (frame.DestinationEndPoint == LOCAL_ENDPOINT && frame.ProfileId == 0x0104) { var myAddr = BitConverter.ToUInt16(_deviceATSettings["MY"], 0); var endpointFrame = new Frame(); endpointFrame.FrameType = Frame.FrameTypes.TxExplicitAddressCommand; //endpointFrame.ClusterId = Convert.ToUInt16(0x8000 | frame.ClusterId); endpointFrame.ClusterId = frame.ClusterId; endpointFrame.DestinationAddress64Bit = 0x00000000; endpointFrame.DestinationAddress16Bit = 0x0000; endpointFrame.SourceEndPoint = frame.DestinationEndPoint; endpointFrame.DestinationEndPoint = frame.SourceEndPoint; endpointFrame.ProfileId = 0x0104; /* endpointFrame.Payload[0] = frame.Payload[0]; * endpointFrame.Payload[1] = 0x00; /* OK */ //endpointFrame.Payload[2] = frame.Payload[1]; /* Return Our Address */ //endpointFrame.Payload[3] = frame.Payload[2]; /* Return Our Address */ /* * endpointFrame.Payload[2] = Convert.ToByte((myAddr >> 8)); * endpointFrame.Payload[3] = Convert.ToByte(myAddr & 0xFF); * endpointFrame.Payload[4] = Convert.ToByte(endpointFrame.Payload.Length - 5); // Bytes Sent * endpointFrame.Payload[5] = frame.DestinationEndPoint; * endpointFrame.Payload[6] = (byte)'o' ; * endpointFrame.Payload[7] = (byte)'f'; * endpointFrame.Payload[8] = (byte)'f'; * endpointFrame.Payload[9] = 0x00;*/ endpointFrame.Payload = new byte[8]; endpointFrame.Payload[0] = 0x18; endpointFrame.Payload[1] = frame.Payload[1]; endpointFrame.Payload[2] = 0x01; // Read response endpointFrame.Payload[3] = frame.Payload[3]; // ATTR LSB endpointFrame.Payload[4] = 0x00; // ATTR MSB endpointFrame.Payload[5] = 0x00; // Status Success endpointFrame.Payload[6] = 0x10; // Attr Type (Binary) endpointFrame.Payload[7] = 0x00; // Attr VBalue - Off /* endpointFrame.Payload[4] = 1; * endpointFrame.Payload[5] = 0x10; */ await _comms.SendFrameAsync(endpointFrame); } else { HandleFrame(frame); } } else if (frame.FrameType == Frame.FrameTypes.RxModemStatus) { switch (frame.ModemStatus) { case Frame.ModemStatuss.JoinedNetwork: IsJoinedToNetwork = true; break; case Frame.ModemStatuss.Disassociated: IsJoinedToNetwork = false; break; case Frame.ModemStatuss.WatchdogTimerReset: lock (this) { if (_resetCompletionSource != null) { _resetCompletionSource.SetResult(true); _resetCompletionSource = null; } } break; } } }