Exemple #1
0
        public bool Notify(AF_INCOMING_MSG msg)
        {
            ZigBeeApsFrame apsFrame = new ZigBeeApsFrame();

            apsFrame.Cluster             = msg.ClusterId;
            apsFrame.DestinationEndpoint = msg.DstEndpoint;
            apsFrame.SourceEndpoint      = msg.SrcEndpoint;
            apsFrame.Profile             = GetEndpointProfile(msg.DstEndpoint);
            apsFrame.SourceAddress       = msg.SrcAddr.Value;
            apsFrame.Payload             = msg.Data;

            _zigBeeNetworkReceive.ReceiveCommand(apsFrame);

            return(true);
        }
Exemple #2
0
        public void XbeeEventReceived(IXBeeEvent xbeeEvent)
        {
            if (xbeeEvent is XBeeReceivePacketExplicitEvent rxMessage)
            {
                ZigBeeApsFrame apsFrame = new ZigBeeApsFrame
                {
                    Cluster             = (ushort)rxMessage.GetClusterId(),
                    DestinationEndpoint = (byte)rxMessage.GetDestinationEndpoint(),
                    Profile             = (ushort)rxMessage.GetProfileId(),
                    SourceEndpoint      = (byte)rxMessage.GetSourceEndpoint(),

                    SourceAddress = (ushort)rxMessage.GetNetworkAddress(),
                    Payload       = rxMessage.GetData().Select(item => (byte)item).ToArray()
                };

                _zigBeeTransportReceive.ReceiveCommand(apsFrame);
                return;
            }

            // Handle dongle status messages
            if (xbeeEvent is XBeeModemStatusEvent modemStatus)
            {
                ModemStatus modemCurrentStatus = modemStatus.GetStatus();
                switch (modemCurrentStatus)
                {
                case ModemStatus.COORDINATOR_STARTED:
                {
                    _coordinatorStarted = true;
                    SetNetworkState(ZigBeeTransportState.ONLINE);
                }
                break;

                case ModemStatus.DISASSOCIATED:
                {
                    SetNetworkState(ZigBeeTransportState.OFFLINE);
                }
                break;

                case ModemStatus.HARDWARE_RESET:
                case ModemStatus.JOINED_NETWORK:
                case ModemStatus.NETWORK_SECURITY_KEY_UPDATED:
                case ModemStatus.WATCHDOG_TIMER_RESET:
                    break;

                default:
                    break;
                }
                return;
            }

            Log.Debug($"Unhandled XBee Frame: {xbeeEvent.ToString()}");
        }
        private async Task ProcessDataIndication()
        {
            var data = await _conbeeInterface.SendAsync(Commands.APS_DATA_INDICATION, 0, 0).ConfigureAwait(false);

            var apsFrame = new ZigBeeApsFrame();
            int offset   = 8;

            switch ((DestinationAddressMode)data[offset++])
            {
            case DestinationAddressMode.GroupAddress:
            case DestinationAddressMode.NwkAddress:
                apsFrame.DestinationAddress = ParseUInt16(data, ref offset);
                break;

            case DestinationAddressMode.IeeeAddress:
                apsFrame.DestinationIeeeAddress = new IeeeAddress(BitConverter.ToUInt64(data, offset));
                offset += 8;
                break;

            default:
                throw new InvalidOperationException();
            }
            apsFrame.DestinationEndpoint = data[offset++];
            switch ((DestinationAddressMode)data[offset++])
            {
            case DestinationAddressMode.IeeeAddress:
                //apsFrame.SourceIeeeAddress = new IeeeAddress(BitConverter.ToUInt64(data, offset));
                offset += 8;
                break;

            case DestinationAddressMode.NwkAddress:
                apsFrame.SourceAddress = ParseUInt16(data, ref offset);
                break;

            case DestinationAddressMode.NwkAddressAndIeeeAddress:
                apsFrame.SourceAddress = ParseUInt16(data, ref offset);
                //apsFrame.SourceIeeeAddress = new IeeeAddress(BitConverter.ToUInt64(data, offset));
                offset += 8;
                break;

            default:
                throw new InvalidOperationException();
            }
            apsFrame.SourceEndpoint = data[offset++];
            apsFrame.Profile        = ParseUInt16(data, ref offset);
            apsFrame.Cluster        = ParseUInt16(data, ref offset);
            apsFrame.Payload        = new byte[ParseUInt16(data, ref offset)];
            Buffer.BlockCopy(data, offset, apsFrame.Payload, 0, apsFrame.Payload.Length);
            _zigBeeTransportReceive.ReceiveCommand(apsFrame);
        }