示例#1
0
        // 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());
                    }
                }
            }
        }