Ejemplo n.º 1
0
        bool IWcfPeripheralHost.StartAdvertising(string deviceName)
        {
            Utils.Info("StartAdvertising: {0}", deviceName); // ただしWindows10ではdeviceNameは反映できないのであった

            lock (mLockObject)
            {
                if (mStatus == Status.Advertise)
                {
                    Utils.Error("already advertising");
                    return(false);
                }

                if (mStatus != Status.Ready)
                {
                    Utils.Error("invalid status: {0}", mStatus.ToString());
                    return(false);
                }

                var advertisingParameters = new GattServiceProviderAdvertisingParameters
                {
                    IsDiscoverable = true,
                    IsConnectable  = true,
                };

                mServiceProvider.StartAdvertising(advertisingParameters);

                SetStatus(Status.Advertise);
            }

            return(true);
        }
Ejemplo n.º 2
0
        internal async Task <bool> Initialize()
        {
            try
            {
                GattServiceProviderResult result = await GattServiceProvider.CreateAsync(_serviceId);

                if (result.Error != BluetoothError.Success)
                {
                    Robot.Message("can't create GATT BlueTooth service with id " + _serviceId.ToString(), MessageType.Error);
                    Robot.Message("without bluetooth service, remote controller won't work", MessageType.Warning);
                    return(_init);
                }
                _service = result.ServiceProvider;

                byte[] value = new byte[] { 0x21 };
                var    constantParameters = new GattLocalCharacteristicParameters
                {
                    CharacteristicProperties = (GattCharacteristicProperties.Read),
                    StaticValue         = value.AsBuffer(),
                    ReadProtectionLevel = GattProtectionLevel.Plain,
                };

                GattLocalCharacteristicResult characteristicResult = await _service.Service.CreateCharacteristicAsync(_notifyId, new GattLocalCharacteristicParameters
                {
                    CharacteristicProperties = GattCharacteristicProperties.Notify,
                    ReadProtectionLevel      = GattProtectionLevel.Plain,
                    StaticValue = value.AsBuffer()
                });

                if (characteristicResult.Error != BluetoothError.Success)
                {
                    Robot.Message("can't create GATT BlueTooth service with id " + _serviceId.ToString(), MessageType.Error);
                    Robot.Message("without bluetooth service, remote controller won't work", MessageType.Warning);
                    return(_init);
                }
                _notifyCharacteristic = characteristicResult.Characteristic;
                //_notifyCharacteristic.SubscribedClientsChanged += _btNotify_SubscribedClientsChanged;

                GattServiceProviderAdvertisingParameters advParameters = new GattServiceProviderAdvertisingParameters
                {
                    IsDiscoverable = true,
                    IsConnectable  = true
                };
                _service.StartAdvertising(advParameters);
                Robot.Message("created Bluetooth GATT service with id " + _serviceId.ToString(), MessageType.Success);
                _init = true;
            }
            catch (Exception x)
            {
                while (x != null)
                {
                    Robot.Message(x.Message, MessageType.Error);
                    x = x.InnerException;
                }
                Robot.Message("without bluetooth service, remote controller won't work", MessageType.Warning);
            }
            return(_init);
        }
Ejemplo n.º 3
0
        // Assumes that the lock is being held.
        private void PublishService(GattServiceProvider provider)
        {
            var advertisingParameters = new GattServiceProviderAdvertisingParameters
            {
                IsDiscoverable = true,
                IsConnectable  = true // Peripheral role support is required for Windows to advertise as connectable.
            };

            provider.StartAdvertising(advertisingParameters);
        }
Ejemplo n.º 4
0
        public async void PublishService()
        {
            await CreateService();

            GattServiceProviderAdvertisingParameters advParameters = new GattServiceProviderAdvertisingParameters
            {
                IsDiscoverable = true,
                IsConnectable  = true
            };

            serviceProvider.StartAdvertising(advParameters);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Start GATT Server
 /// </summary>
 public void Start()
 {
     if (_gattServiceProvider.AdvertisementStatus == GattServiceProviderAdvertisementStatus.Created ||
         _gattServiceProvider.AdvertisementStatus == GattServiceProviderAdvertisementStatus.Stopped)
     {
         var advParameters = new GattServiceProviderAdvertisingParameters
         {
             IsDiscoverable = true,
             IsConnectable  = true
         };
         _gattServiceProvider.StartAdvertising(advParameters);
     }
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Start up the bl;uetooth listeners, set UUIDs/ble-specific information.
        /// </summary>
        /// <returns></returns>
        private async Task MainAsync()
        {
            // Check if adapter supports peripheral and bluetooth low energy
            peripheralSupported = await CheckPeripheralRoleSupportAsync();

            if (!peripheralSupported)
            {
                Environment.Exit(1);
            }


            if (serviceProvider == null)
            {
                ServiceProviderInitAsync().Wait();
                if (serviceStarted)
                {
                    // Advertising server as connectable and discoverable.
                    advParameters = new GattServiceProviderAdvertisingParameters
                    {
                        // IsConnectable determines whether a call to publish will attempt to start advertising and
                        // put the service UUID in the ADV packet (best effort)
                        IsConnectable  = peripheralSupported,
                        IsDiscoverable = true
                    };

                    // Start server
                    serviceProvider.StartAdvertising(advParameters);


                    this.hasStarted = true;
                    if (this.setIndicate == true)
                    {
                        this.setIndicate = false;
                        Indicate();
                    }
                }
            }
            else
            {
                // Stops advertising support
                serviceProvider.StopAdvertising();
                serviceProvider = null;
            }
        }
Ejemplo n.º 7
0
        private async void SetupGatt()
        {
            var ba = await BluetoothAdapter.GetDefaultAsync();

            if (ba == null)
            {
                notifyIcon.Text = String.Format("{0} (No Bluetooth adapter found!)", Application.ProductName);
                return;
            }

            if (!ba.IsPeripheralRoleSupported)
            {
                notifyIcon.Text = String.Format("{0} (Peripheral mode not supported!)", Application.ProductName);
                return;
            }

            var sr = await GattServiceProvider.CreateAsync(SVC_UUID);

            if (sr.Error != BluetoothError.Success)
            {
                notifyIcon.Text = String.Format("{0} (Error creating service!)", Application.ProductName);
                return;
            }
            serviceProvider = sr.ServiceProvider;

            var cr = await serviceProvider.Service.CreateCharacteristicAsync(CHR_UUID, CHR_PARAMS);

            if (cr.Error != BluetoothError.Success)
            {
                notifyIcon.Text = String.Format("{0} (Error creating characteristic!)", Application.ProductName);
                return;
            }
            localCharacteristic = cr.Characteristic;

            localCharacteristic.WriteRequested += CharacteristicWriteRequested;
            serviceProvider.StartAdvertising(ADV_PARAMS);
        }
        internal async Task StartAsync()
        {
            if (_gattServiceProvider == null)
            {
                var serviceProviderResult = await GattServiceProvider.CreateAsync(BluetoothConstants.ServiceUuid);

                if (serviceProviderResult.Error != BluetoothError.Success)
                {
                    throw new InvalidOperationException($"Failed to create GATT service with error {serviceProviderResult.Error}");
                }

                _gattServiceProvider = serviceProviderResult.ServiceProvider;

                await CreateCharacteristics(_gattServiceProvider);
            }

            var advertisingParameters = new GattServiceProviderAdvertisingParameters
            {
                IsConnectable  = (await BluetoothAdapter.GetDefaultAsync())?.IsPeripheralRoleSupported ?? false,
                IsDiscoverable = true
            };

            _gattServiceProvider.StartAdvertising(advertisingParameters);
        }
        /// <summary>
        /// Uses the relevant Service/Characteristic UUIDs to initialize, hook up event handlers and start a service on the local system.
        /// </summary>
        /// <returns></returns>
        private async Task <bool> ServiceProviderInitAsync()
        {
            // BT_Code: Initialize and starting a custom GATT Service using GattServiceProvider.
            GattServiceProviderResult serviceResult = await GattServiceProvider.CreateAsync(Constants.CalcServiceUuid);

            if (serviceResult.Error == BluetoothError.Success)
            {
                serviceProvider = serviceResult.ServiceProvider;
            }
            else
            {
                rootPage.NotifyUser($"Could not create service provider: {serviceResult.Error}", NotifyType.ErrorMessage);
                return(false);
            }

            GattLocalCharacteristicResult result = await serviceProvider.Service.CreateCharacteristicAsync(Constants.Op1CharacteristicUuid, Constants.gattOperandParameters);

            if (result.Error == BluetoothError.Success)
            {
                op1Characteristic = result.Characteristic;
            }
            else
            {
                rootPage.NotifyUser($"Could not create operand1 characteristic: {result.Error}", NotifyType.ErrorMessage);
                return(false);
            }
            op1Characteristic.WriteRequested += Op1Characteristic_WriteRequestedAsync;

            result = await serviceProvider.Service.CreateCharacteristicAsync(Constants.Op2CharacteristicUuid, Constants.gattOperandParameters);

            if (result.Error == BluetoothError.Success)
            {
                op2Characteristic = result.Characteristic;
            }
            else
            {
                rootPage.NotifyUser($"Could not create operand2 characteristic: {result.Error}", NotifyType.ErrorMessage);
                return(false);
            }

            op2Characteristic.WriteRequested += Op2Characteristic_WriteRequestedAsync;

            result = await serviceProvider.Service.CreateCharacteristicAsync(Constants.OperatorCharacteristicUuid, Constants.gattOperatorParameters);

            if (result.Error == BluetoothError.Success)
            {
                operatorCharacteristic = result.Characteristic;
            }
            else
            {
                rootPage.NotifyUser($"Could not create operator characteristic: {result.Error}", NotifyType.ErrorMessage);
                return(false);
            }

            operatorCharacteristic.WriteRequested += OperatorCharacteristic_WriteRequestedAsync;

            // Add presentation format - 32-bit unsigned integer, with exponent 0, the unit is unitless, with no company description
            GattPresentationFormat intFormat = GattPresentationFormat.FromParts(
                GattPresentationFormatTypes.UInt32,
                PresentationFormats.Exponent,
                Convert.ToUInt16(PresentationFormats.Units.Unitless),
                Convert.ToByte(PresentationFormats.NamespaceId.BluetoothSigAssignedNumber),
                PresentationFormats.Description);

            Constants.gattResultParameters.PresentationFormats.Add(intFormat);

            result = await serviceProvider.Service.CreateCharacteristicAsync(Constants.ResultCharacteristicUuid, Constants.gattResultParameters);

            if (result.Error == BluetoothError.Success)
            {
                resultCharacteristic = result.Characteristic;
            }
            else
            {
                rootPage.NotifyUser($"Could not create result characteristic: {result.Error}", NotifyType.ErrorMessage);
                return(false);
            }
            resultCharacteristic.ReadRequested            += ResultCharacteristic_ReadRequestedAsync;
            resultCharacteristic.SubscribedClientsChanged += ResultCharacteristic_SubscribedClientsChanged;

            // BT_Code: Indicate if your sever advertises as connectable and discoverable.
            GattServiceProviderAdvertisingParameters advParameters = new GattServiceProviderAdvertisingParameters
            {
                // IsConnectable determines whether a call to publish will attempt to start advertising and
                // put the service UUID in the ADV packet (best effort)
                IsConnectable = peripheralSupported,

                // IsDiscoverable determines whether a remote device can query the local device for support
                // of this service
                IsDiscoverable = true
            };

            serviceProvider.AdvertisementStatusChanged += ServiceProvider_AdvertisementStatusChanged;
            serviceProvider.StartAdvertising(advParameters);
            return(true);
        }
        private async void setup()
        {
            var result = await GattServiceProvider.CreateAsync(cascableBasicUserInputServiceGuid);

            if (result.Error != BluetoothError.Success)
            {
                Debug.WriteLine("Failed to create BLE service!!");
                return;
            }

            cascableService = result.ServiceProvider;

            var continueButtonResult = await cascableService.Service.CreateCharacteristicAsync(continueButtonDownCharacteristicGuid, readAndNotifyParameters);

            if (continueButtonResult.Error != BluetoothError.Success)
            {
                Debug.WriteLine("Failed to create Continue Button Characteristic!!");
                return;
            }

            continueButtonCharacteristic = continueButtonResult.Characteristic;
            continueButtonCharacteristic.ReadRequested            += readContinueButtonValue;
            continueButtonCharacteristic.SubscribedClientsChanged += subscribedClientsChanged;

            var stopButtonResult = await cascableService.Service.CreateCharacteristicAsync(stopButtonDownCharacteristicGuid, readAndNotifyParameters);

            if (stopButtonResult.Error != BluetoothError.Success)
            {
                Debug.WriteLine("Failed to create Stop Button Characteristic!!");
                return;
            }

            stopButtonCharacteristic = stopButtonResult.Characteristic;
            stopButtonCharacteristic.ReadRequested += readStopButtonValue;

            var remoteCanContinueResult = await cascableService.Service.CreateCharacteristicAsync(remoteCanContinueCharacteristicGuid, writeParameters);

            if (remoteCanContinueResult.Error != BluetoothError.Success)
            {
                Debug.WriteLine("Failed to create Remote Can Continue Characteristic!!");
                return;
            }

            remoteCanContinueCharacteristic = remoteCanContinueResult.Characteristic;
            remoteCanContinueCharacteristic.WriteRequested += writeRemoteCanContinue;

            var remoteCanStopResult = await cascableService.Service.CreateCharacteristicAsync(remoteCanStopCharacteristicGuid, writeParameters);

            if (remoteCanStopResult.Error != BluetoothError.Success)
            {
                Debug.WriteLine("Failed to create Remote Can Stop Characteristic!!");
                return;
            }

            remoteCanStopCharacteristic = remoteCanStopResult.Characteristic;
            remoteCanStopCharacteristic.WriteRequested += writeRemoteCanStop;

            var userMessageResult = await cascableService.Service.CreateCharacteristicAsync(userMessageCharacteristicGuid, writeParameters);

            if (userMessageResult.Error != BluetoothError.Success)
            {
                Debug.WriteLine("Failed to create User Message Characteristic!!");
                return;
            }

            userMessageCharacteristic = userMessageResult.Characteristic;
            userMessageCharacteristic.WriteRequested += writeUserMessage;

            cascableService.StartAdvertising(advertisingParameters);
            Debug.WriteLine("Service is now advertising!");
        }
Ejemplo n.º 11
0
        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            var adapter = await BluetoothAdapter.GetDefaultAsync();

            var serviceResult =
                await GattServiceProvider.CreateAsync(Guid.Parse(SensorUUIDs.UUID_ACC_SERV));

            accService = serviceResult.ServiceProvider;
            accService.AdvertisementStatusChanged += AccService_AdvertisementStatusChanged;

            var param = new GattLocalCharacteristicParameters();

            param.CharacteristicProperties =
                GattCharacteristicProperties.Indicate |
                GattCharacteristicProperties.Read;

            param.WriteProtectionLevel = GattProtectionLevel.Plain;

            param.UserDescription = "accelerometer";

            var charResult =
                await accService.Service.CreateCharacteristicAsync(Guid.Parse(SensorUUIDs.UUID_ACC_DATA), param);

            accData = charResult.Characteristic;
            accData.ReadRequested += AccData_ReadRequested;
            accService.StartAdvertising(new GattServiceProviderAdvertisingParameters()
            {
                IsDiscoverable = true, IsConnectable = true
            });

            serviceResult =
                await GattServiceProvider.CreateAsync(Guid.Parse(SensorUUIDs.UUID_ENV_SERV));

            envService = serviceResult.ServiceProvider;

            param = new GattLocalCharacteristicParameters();
            param.CharacteristicProperties =
                GattCharacteristicProperties.Indicate |
                GattCharacteristicProperties.Read;

            param.UserDescription = "temperature";

            charResult =
                await envService.Service.CreateCharacteristicAsync(Guid.Parse(SensorUUIDs.UUID_ENV_TEMP), param);

            tempData = charResult.Characteristic;
            tempData.ReadRequested += TempData_ReadRequested;

            param = new GattLocalCharacteristicParameters();
            param.CharacteristicProperties =
                GattCharacteristicProperties.Indicate |
                GattCharacteristicProperties.Read;

            param.UserDescription = "pressure";

            charResult =
                await envService.Service.CreateCharacteristicAsync(Guid.Parse(SensorUUIDs.UUID_ENV_PRES), param);

            pressData = charResult.Characteristic;
            pressData.ReadRequested += PressData_ReadRequested;
            envService.StartAdvertising(new GattServiceProviderAdvertisingParameters()
            {
                IsDiscoverable = true, IsConnectable = true
            });

            timer          = new DispatcherTimer();
            timer.Interval = new TimeSpan(0, 0, 1);
            timer.Tick    += Timer_Tick;
            //timer.Start();

            base.OnNavigatedTo(e);
        }
Ejemplo n.º 12
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            // FitnessMachine service
            var gattServiceFitnessMachineRequest = await GattServiceProvider.CreateAsync(FitnessMachineServiceUuid);

            if (gattServiceFitnessMachineRequest.Error != BluetoothError.Success)
            {
                throw new Exception("Cannot create Gatt Service Provider");
            }

            _gattServiceProviderFitnessMachine = gattServiceFitnessMachineRequest.ServiceProvider;

            // Fitness Machine Feature characteristic
            var fitnessMachineFeatureData = new byte[]
            {
                0x08, 0x00, 0x00, 0x00
            };
            var targetSettingsData = new byte[]
            {
                0x00, 0x00, 0x00, 0x00
            };
            var fitnessMachineFeatureDataFull = fitnessMachineFeatureData.Concat(targetSettingsData).ToArray();
            var fitnessMachineFeatureCharacteristicRequest = new GattLocalCharacteristicParameters
            {
                CharacteristicProperties = GattCharacteristicProperties.Read,
                StaticValue         = fitnessMachineFeatureDataFull.AsBuffer(),
                ReadProtectionLevel = GattProtectionLevel.Plain,
            };
            var characteristicResult = await _gattServiceProviderFitnessMachine.Service.CreateCharacteristicAsync(
                FitnessMachineFeatureCharacteristicUuid, fitnessMachineFeatureCharacteristicRequest);

            if (characteristicResult.Error != BluetoothError.Success)
            {
                throw new Exception("Cannot create Characteristic");
            }

            // Treadmill Data characteristic
            var treadmillDataCharacteristicRequest = new GattLocalCharacteristicParameters
            {
                CharacteristicProperties = GattCharacteristicProperties.Read | GattCharacteristicProperties.Notify,
                ReadProtectionLevel      = GattProtectionLevel.Plain
            };

            characteristicResult = await _gattServiceProviderFitnessMachine.Service.CreateCharacteristicAsync(TreadmillDataCharacteristicUuid, treadmillDataCharacteristicRequest);

            if (characteristicResult.Error != BluetoothError.Success)
            {
                throw new Exception("Cannot create Characteristic");
            }

            _treadmillDataCharacteristic = characteristicResult.Characteristic;
            _treadmillDataCharacteristic.ReadRequested += TreadmillDataCharacteristic_ReadRequestedAsync;

            // Advertising
            byte[] flagsData =
            {
                0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            };
            byte[] fitnessMachineTypeData =
            {
                0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            };
            var serviceData   = flagsData.Concat(fitnessMachineTypeData).ToArray();
            var advParameters = new GattServiceProviderAdvertisingParameters
            {
                IsDiscoverable = true,
                IsConnectable  = true,
                ServiceData    = serviceData.AsBuffer()
            };

            // Go
            _gattServiceProviderFitnessMachine.StartAdvertising(advParameters);

            while (true)
            {
                await Task.Delay(1000, cancellationToken);

                await _treadmillDataCharacteristic.NotifyValueAsync(GetTreadmillDataPackage(_currentSpeed));
            }
        }