public Device CreateWriteNfcTag(Device device = null, bool makeReadOnly = true)
        {
            var createdDevice = this.CreateNfcTag(device);

            if (createdDevice == null)
                throw new NullReferenceException("The device must not be null.");

            try
            {
                this.EncodeNfcTag(createdDevice, makeReadOnly);
            }
            catch (Exception ex)
            {
                if (createdDevice != null)
                    this.PlatformClient.DeleteDevice(createdDevice.Id);

                throw ex;
            }

            return createdDevice;
        }
		/// <summary>
		/// Searches the server for results matching the values set on the query.
		/// The query can be null to search for all Device documents.
		/// </summary>
		public TypedArray<Device> GetDevices(Device query)
		{
			return Request<Device>(query);
		}
		public Device UpdateDevice(Device value)
		{
			//value.Validate();
			return Request<Device>(value.Id, "PUT", value);
		}
		public Device CreateDevice(Device value)
		{
			//value.Validate();
			return Request<Device>(null, "POST", value);
		}
        public Device CreateNfcTag(Device device = null)
        {
            if (device == null)
                device = new Device();

            if (!string.IsNullOrWhiteSpace(device.Id))
                throw new ArgumentException("The device must be a new device.");

            var nfcTag = this.GetNfcTag();
            this.CheckForNfcTag(nfcTag);

            using (var ndef = NdefTechnology.Get(nfcTag))
            {
                ndef.Connect();

                var nfcTagUid = ndef.TagUIDString();
                device.Uid = nfcTagUid;

                if (string.IsNullOrWhiteSpace(device.Identity))
                    device.Identity = nfcTagUid;

                device.DeviceType = DeviceType.Tag;
                device.TagType = TagType.Nfc;

                // tags can not have these properties
                device.Browser = null;
                device.Os = null;

                device.Hardware = new DeviceHardware()
                {
                    Name = nfcTag.TagType.GetDescription()
                };

                device = this.PlatformClient.CreateDevice(device);
            }

            return device;
        }
        public PlatformNfcTag EncodeNfcTag(Device device, bool makeReadOnly = true)
        {
            var nfcTag = this.GetNfcTag();
            this.CheckForNfcTag(nfcTag);

            var platformNfcTag = new PlatformNfcTag();

            using (var ndef = NdefTechnology.Get(nfcTag))
            {
                ndef.Connect();

                if (!ndef.IsWritable)
                    throw new ApplicationException("The nfc tag is not writable.");

                platformNfcTag.Uid = ndef.TagUIDString();

                var nfcTagRecord = new NfcTagRecord(device);
                ndef.WriteNdefMessage(nfcTagRecord);

                platformNfcTag.Record = nfcTagRecord;

                if (makeReadOnly && ndef.CanMakeReadOnly)
                {
                    ndef.MakeReadOnly();
                    platformNfcTag.ReadOnly = true;
                }
                else
                {
                    platformNfcTag.ReadOnly = false;
                }
            }

            return platformNfcTag;
        }