// GattLocalCharacteristic private async void OnCharacteristicWriteRequested(GattLocalCharacteristic characteristic, GattWriteRequestedEventArgs args) { Utils.Info("OnWriteRequested: {0}", args.Session.DeviceId.Id); using (var derferral = args.GetDeferral()) { var request = await args.GetRequestAsync().AsTask(); lock (mLockObject) { if ((mStatus != Status.Ready) && (mStatus != Status.Advertise)) { Utils.Error("invalid status: {0}", mStatus.ToString()); request.RespondWithProtocolError(GattProtocolError.RequestNotSupported); return; } var context = mSubscribedCentrals.Where(ctx => ctx.client.Session.DeviceId.Id == args.Session.DeviceId.Id).FirstOrDefault(); if (context == null) { Utils.Error("not subscribed"); request.RespondWithProtocolError(GattProtocolError.InsufficientAuthentication); return; } if ((request.Option != GattWriteOption.WriteWithResponse) || (request.Offset != 0) || (request.Value == null)) { Utils.Error("invalid parameter"); request.RespondWithProtocolError(GattProtocolError.InvalidPdu); return; } request.Respond(); if (context.connectionId == 0) // Negotiation complete { Utils.Info("negotiation complete"); context.connectionId = mNextConnectionId++; mCallback.OnConnect(context.connectionId); } else { ProcessReceiveBuffer(context, request.Value.AsBytes()); } } } }