/**
         * Get the current network parameters
         *
         * @return the {@link EmberNetworkParameters} or null on error
         */
        private EmberNetworkParameters GetNetworkParameters()
        {
            EzspGetNetworkParametersRequest networkParms = new EzspGetNetworkParametersRequest();
            EzspSingleResponseTransaction   transaction  = new EzspSingleResponseTransaction(networkParms, typeof(EzspGetNetworkParametersResponse));

            _protocolHandler.SendEzspTransaction(transaction);
            EzspGetNetworkParametersResponse getNetworkParametersResponse = (EzspGetNetworkParametersResponse)transaction.GetResponse();

            Log.Debug(getNetworkParametersResponse.ToString());
            if (getNetworkParametersResponse.GetStatus() != EmberStatus.EMBER_SUCCESS)
            {
                Log.Debug("Error during retrieval of network parameters: {Response}", getNetworkParametersResponse);
                return(null);
            }
            return(getNetworkParametersResponse.GetParameters());
        }
        /**
         * Rejoins an existing ZigBee network as a router.
         *
         * @param haveCurrentNetworkKey true if we already know the network key
         * @param channelMask the channel mask to scan.
         * @return true if the network was joined successfully
         */
        private bool DoRejoinNetwork(bool haveCurrentNetworkKey, ZigBeeChannelMask channelMask)
        {
            EzspFindAndRejoinNetworkRequest rejoinNetwork = new EzspFindAndRejoinNetworkRequest();

            rejoinNetwork.SetHaveCurrentNetworkKey(haveCurrentNetworkKey);
            rejoinNetwork.SetChannelMask(channelMask.ChannelMask);
            EzspSingleResponseTransaction transaction = new EzspSingleResponseTransaction(rejoinNetwork, typeof(EzspFindAndRejoinNetworkResponse));

            _protocolHandler.SendEzspTransaction(transaction);

            EzspFindAndRejoinNetworkResponse rejoinNetworkResponse = (EzspFindAndRejoinNetworkResponse)transaction.GetResponse();

            Log.Debug(rejoinNetworkResponse.ToString());
            if (rejoinNetworkResponse.GetStatus() != EmberStatus.EMBER_SUCCESS)
            {
                Log.Debug("Error rejoining network: {Response}", rejoinNetworkResponse);
                return(false);
            }

            return(true);
        }
        /**
         * Forms the ZigBee network as a coordinator
         *
         * @param networkParameters the {@link EmberNetworkParameters}
         * @return true if the network was formed successfully
         */
        private bool DoFormNetwork(EmberNetworkParameters networkParameters)
        {
            networkParameters.SetJoinMethod(EmberJoinMethod.EMBER_USE_MAC_ASSOCIATION);

            EzspFormNetworkRequest formNetwork = new EzspFormNetworkRequest();

            formNetwork.SetParameters(networkParameters);
            EzspSingleResponseTransaction transaction = new EzspSingleResponseTransaction(formNetwork, typeof(EzspFormNetworkResponse));

            _protocolHandler.SendEzspTransaction(transaction);
            EzspFormNetworkResponse formNetworkResponse = (EzspFormNetworkResponse)transaction.GetResponse();

            Log.Debug(formNetworkResponse.ToString());
            if (formNetworkResponse.GetStatus() != EmberStatus.EMBER_SUCCESS)
            {
                Log.Debug("Error forming network: {Response}", formNetworkResponse);
                return(false);
            }

            return(true);
        }
        /**
         * Sets the initial security state
         *
         * @param linkKey the initial {@link ZigBeeKey}
         * @param networkKey the initial {@link ZigBeeKey}
         * @return true if the security state was set successfully
         */
        private bool SetSecurityState(ZigBeeKey linkKey, ZigBeeKey networkKey)
        {
            EzspSetInitialSecurityStateRequest securityState = new EzspSetInitialSecurityStateRequest();
            EmberInitialSecurityState          state         = new EmberInitialSecurityState();

            state.AddBitmask(EmberInitialSecurityBitmask.EMBER_TRUST_CENTER_GLOBAL_LINK_KEY);

            EmberKeyData networkKeyData = new EmberKeyData();

            if (networkKey != null)
            {
                networkKeyData.SetContents(Array.ConvertAll(networkKey.Key, c => (int)c));
                state.AddBitmask(EmberInitialSecurityBitmask.EMBER_HAVE_NETWORK_KEY);
                if (networkKey.SequenceNumber.HasValue)
                {
                    state.SetNetworkKeySequenceNumber(networkKey.SequenceNumber.Value);
                }
            }
            state.SetNetworkKey(networkKeyData);

            EmberKeyData linkKeyData = new EmberKeyData();

            if (linkKey != null)
            {
                linkKeyData.SetContents(Array.ConvertAll(linkKey.Key, c => (int)c));
                state.AddBitmask(EmberInitialSecurityBitmask.EMBER_HAVE_PRECONFIGURED_KEY);
                state.AddBitmask(EmberInitialSecurityBitmask.EMBER_REQUIRE_ENCRYPTED_KEY);
            }
            state.SetPreconfiguredKey(linkKeyData);

            state.SetPreconfiguredTrustCenterEui64(new IeeeAddress());

            securityState.SetState(state);
            EzspSingleResponseTransaction transaction = new EzspSingleResponseTransaction(securityState, typeof(EzspSetInitialSecurityStateResponse));

            _protocolHandler.SendEzspTransaction(transaction);
            EzspSetInitialSecurityStateResponse securityStateResponse = (EzspSetInitialSecurityStateResponse)transaction.GetResponse();

            Log.Debug(securityStateResponse.ToString());
            if (securityStateResponse.GetStatus() != EmberStatus.EMBER_SUCCESS)
            {
                Log.Debug("Error during retrieval of network parameters: {Response}", securityStateResponse);
                return(false);
            }

            EmberNcp ncp = new EmberNcp(_protocolHandler);

            if (networkKey != null && networkKey.OutgoingFrameCounter.HasValue)
            {
                EzspSerializer serializer = new EzspSerializer();
                serializer.SerializeUInt32(networkKey.OutgoingFrameCounter.Value);
                if (ncp.SetValue(EzspValueId.EZSP_VALUE_NWK_FRAME_COUNTER, serializer.GetPayload()) != EzspStatus.EZSP_SUCCESS)
                {
                    return(false);
                }
            }
            if (linkKey != null && linkKey.OutgoingFrameCounter.HasValue)
            {
                EzspSerializer serializer = new EzspSerializer();
                serializer.SerializeUInt32(linkKey.OutgoingFrameCounter.Value);
                if (ncp.SetValue(EzspValueId.EZSP_VALUE_APS_FRAME_COUNTER, serializer.GetPayload()) != EzspStatus.EZSP_SUCCESS)
                {
                    return(false);
                }
            }

            return(true);
        }