Example #1
0
        public override bool ParseResponse(byte[] buffer)
        {
            UInt16 networkAddress;
            UInt64 macAddress;

            if (!IsResponseOK(buffer))
            {
                return(false);
            }

            // verify network address matches with payload (requested network address)
            int offset = GetZdoPayloadOffset();

            // skip 1st byte (ZDO command ref)
            offset++;

            // get network and Mac address
            networkAddress = AdapterHelper.UInt16FromZigBeeFrame(buffer, offset);
            offset        += sizeof(UInt16);
            macAddress     = AdapterHelper.UInt64FromZigBeeFrame(buffer, offset);

            // ignore capability (last byte)

            if (null != OnReception)
            {
                // execute notification callback asynchronously
                // can't determine is device is an end device from DeviceAnnce => assume it is one by default
                Task.Run(() => { OnReception(networkAddress, macAddress, true); });
            }

            return(true);
        }
Example #2
0
        public override bool ParseResponse(byte[] buffer)
        {
            if (!IsResponseOK(buffer))
            {
                return(false);
            }

            // get number of neighbor
            int offset = GetZdoPayloadOffset();

            m_nbOfNeighbors = Convert.ToInt32(buffer[offset]);
            if (m_nbOfNeighbors == 0)
            {
                return(true);
            }

            // get start index and count in neighbor list
            offset++;
            int startIndex    = Convert.ToInt32(buffer[offset]);
            int neighborCount = Convert.ToInt32(buffer[offset + 1]);

            // get neighbors from table
            offset += 2;
            for (int index = 0; index < neighborCount; index++)
            {
                // get mac address and network address from neighbor table entry
                DeviceDescriptor descriptor = new DeviceDescriptor();
                descriptor.networkAddress = AdapterHelper.UInt16FromZigBeeFrame(buffer, offset + NEIGHBOR_TABLE_ENTRY_NETWORK_ADDRESS_OFFSET);
                descriptor.macAddress     = AdapterHelper.UInt64FromZigBeeFrame(buffer, offset + NEIGHBOR_TABLE_ENTRY_MAC_ADDRESS_OFFSET);
                byte deviceType = buffer[offset + NEIGHBOR_TABLE_ENTRY_DEVICE_TYPE_OFFSET];
                descriptor.isEndDevice = ((deviceType & NEIGHBOR_TABLE_ENTRY_DEVICE_TYPE_MASK) == END_DEVICE_TYPE);

                // add device descriptor in device list
                m_neighborList.Add(descriptor);

                // set offset of next entry
                offset += SIZEOF_NEIGHBOR_TABLE_ENTRY;
            }

            return(true);
        }
Example #3
0
        public static bool GetValue(byte type, ref byte[] buffer, ref int offset, out object value)
        {
            value = null;

            switch (type)
            {
            case BOOLEAN_TYPE:
            {
                if (buffer.Length >= offset + sizeof(bool))
                {
                    bool tempVal = Convert.ToBoolean(buffer[offset]);
                    value   = tempVal;
                    offset += sizeof(bool);
                }
            }
            break;

            case CHAR_STRING_TYPE:
            {
                if (buffer.Length >= offset + sizeof(byte))
                {
                    int length = Convert.ToInt32(buffer[offset]);
                    if (length != 0 &&
                        buffer.Length >= (offset + (length + 1) * sizeof(byte)))
                    {
                        offset += sizeof(byte);
                        String tempVal = Encoding.UTF8.GetString(buffer, offset, length);
                        value   = tempVal;
                        offset += (length + 1) * sizeof(byte);
                    }
                }
            }
            break;

            case INT8_TYPE:
            {
                if (buffer.Length >= offset + sizeof(sbyte))
                {
                    sbyte tempVal = (sbyte)buffer[offset];
                    value   = tempVal;
                    offset += sizeof(sbyte);
                }
            }
            break;

            case ENUMERATION_8_BIT_TYPE:            // expected fall through
            case BITMAP_8_BIT_TYPE:                 // expected fall through
            case UINT8_TYPE:
            {
                if (buffer.Length >= offset + sizeof(byte))
                {
                    byte tempVal = buffer[offset];
                    value   = tempVal;
                    offset += sizeof(byte);
                }
            }
            break;

            case INT16_TYPE:
            {
                if (buffer.Length >= offset + sizeof(Int16))
                {
                    value   = AdapterHelper.Int16FromZigBeeFrame(buffer, offset);
                    offset += sizeof(Int16);
                }
            }
            break;

            case ENUMERATION_16_BIT_TYPE:            // expected fall through
            case BITMAP_16_BIT_TYPE:                 // expected fall through
            case UINT16_TYPE:
            {
                if (buffer.Length >= offset + sizeof(UInt16))
                {
                    value   = AdapterHelper.UInt16FromZigBeeFrame(buffer, offset);
                    offset += sizeof(UInt16);
                }
            }
            break;

            case INT32_TYPE:
            {
                if (buffer.Length >= offset + sizeof(Int32))
                {
                    value   = AdapterHelper.Int32FromZigBeeFrame(buffer, offset);
                    offset += sizeof(Int32);
                }
            }
            break;

            case UINT32_TYPE:
            {
                if (buffer.Length >= offset + sizeof(UInt32))
                {
                    value   = AdapterHelper.UInt32FromZigBeeFrame(buffer, offset);
                    offset += sizeof(UInt32);
                }
            }
            break;

            case IEEE_ADDRESS_TYPE:
            {
                if (buffer.Length >= offset + sizeof(UInt64))
                {
                    value   = AdapterHelper.UInt64FromZigBeeFrame(buffer, offset);
                    offset += sizeof(UInt64);
                }
            }
            break;
            }

            if (value != null)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }