/// <summary>
        /// Decode a Device Connect packet from the byte stream
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private static string DecodeDeviceConnectPacket(byte[] buffer, ref int index)
        {
            DeviceConnectPacket device = DeserializePacket <DeviceConnectPacket>(buffer, ref index);

            unsafe
            {
                return(DeserializeFixedString((IntPtr)device.uid.value, sizeof(DeviceUID)));
            }
        }
        /// <summary>
        /// Encode a Connect to Device packet into the specified buffer
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="index"></param>
        /// <param name="uid"></param>
        /// <exception cref="InvalidOperationException"></exception>
        public static void EncodeConnectToDevice(byte[] buffer, ref int index, string uid)
        {
            // Encode header
            PacketHeader header = new PacketHeader(PacketTypeCode.ConnectToDevice);

            SerializePacket(buffer, ref index, header);

            // Encode payload
            DeviceConnectPacket packet = new DeviceConnectPacket();

            unsafe
            {
                SerializeFixedString(uid, (IntPtr)packet.uid.value, DeviceUID.Length);
            }
            SerializePacket(buffer, ref index, packet);

            // Encode footer
            SerializePacket(buffer, ref index, _footer);
        }