private async void InitializeInternal() { mInitializationCancelTokenSource = new CancellationTokenSource(ACCEPTANCE_TIMEOUT); try { var serviceProviderResult = await GattServiceProvider.CreateAsync(mServiceUUID).AsTask(mInitializationCancelTokenSource.Token); if (serviceProviderResult.Error != BluetoothError.Success) { Utils.Error("failed to create service provider: {0}", serviceProviderResult.Error.ToString()); if (serviceProviderResult.Error == BluetoothError.RadioNotAvailable) { mCallback.OnBluetoothRequire(); } HandleError(); return; } mServiceProvider = serviceProviderResult.ServiceProvider; mServiceProvider.AdvertisementStatusChanged += OnAdvertisementStatusChanged; var uploadParameters = new GattLocalCharacteristicParameters() { CharacteristicProperties = GattCharacteristicProperties.Write, }; var uploadCharacteristicResult = await mServiceProvider.Service.CreateCharacteristicAsync(mUploadUUID, uploadParameters). AsTask(mInitializationCancelTokenSource.Token); if (uploadCharacteristicResult.Error != BluetoothError.Success) { Utils.Error("failed to create uploading characteristic: {0}", uploadCharacteristicResult.Error.ToString()); HandleError(); return; } mUploadCharacteristic = uploadCharacteristicResult.Characteristic; mUploadCharacteristic.WriteRequested += OnCharacteristicWriteRequested; var downloadParameters = new GattLocalCharacteristicParameters { CharacteristicProperties = GattCharacteristicProperties.Read | GattCharacteristicProperties.Indicate, }; var downloadCharacteristicResult = await mServiceProvider.Service.CreateCharacteristicAsync(mDownloadUUID, downloadParameters). AsTask(mInitializationCancelTokenSource.Token); if (downloadCharacteristicResult.Error != BluetoothError.Success) { Utils.Error("failed to create downloading characteristic: {0}", downloadCharacteristicResult.Error.ToString()); HandleError(); return; } mDownloadCharacteristic = downloadCharacteristicResult.Characteristic; mDownloadCharacteristic.SubscribedClientsChanged += OnCharacteristicSubscribedClientsChanged; mDownloadCharacteristic.ReadRequested += OnCharacteristicReadRequested; } catch (OperationCanceledException) { Utils.Info("canceled"); HandleError(); return; } catch (Exception e) { Utils.Error(e.ToString()); HandleError(); return; } lock (mLockObject) { SetStatus(Status.Ready); mCallback.OnReady(); } }