Riccardokhm
Member since Sep 2022 • Last active Sep 2023Most recent activity
-
-
- 4 comments
- 578 views
-
-
-
Clear, actually my laptop console application is connected to the Nordic UART service, so it should work. Unfortunately, by now, the bangle receives only the first data buffer: when I tried to send it again, no event is triggered.
internal class Program { static DeviceInformation _device = null; private static string NORDIC_UART_SERVICE = "6e400001-b5a3-f393-e0a9-e50e24dcca9e"; static DataFormat _dataFormat = DataFormat.UTF8; static GattCommunicationStatus result; static GattCharacteristic _characteristic; static GattLocalCharacteristic _readcharacteristic; static GattServiceProvider _serviceProvider; static Guid _serviceuuid= new Guid("F150E6C7-0DB4-4645-AE74-023C39598372"); static Guid _characteristicuuid = new Guid("B952F9C0-218D-42B6-8EE6-4AAB35753922"); static GattLocalCharacteristicParameters _characteristicparameter = new GattLocalCharacteristicParameters(); static DataWriter writer = new DataWriter(); static async Task Main(string[] args) { // Query for extra properties you want returned string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" }; DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher( BluetoothLEDevice.GetDeviceSelectorFromPairingState(false), requestedProperties, DeviceInformationKind.AssociationEndpoint); // Register event handlers before starting the watcher. // Added, Updated and Removed are required to get all nearby devices deviceWatcher.Added += DeviceWatcher_Added; deviceWatcher.Updated += DeviceWatcher_Updated; deviceWatcher.Removed += DeviceWatcher_Removed; // EnumerationCompleted and Stopped are optional to implement. deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted; deviceWatcher.Stopped += DeviceWatcher_Stopped; // Start the watcher. deviceWatcher.Start(); //STARTING CREATING SERVICE GattServiceProviderResult _result = await GattServiceProvider.CreateAsync(_serviceuuid); Console.WriteLine("Creating new service"); if (_result.Error == BluetoothError.Success) { _serviceProvider = _result.ServiceProvider; Console.WriteLine($"{_result.Error}"); } byte[] value = new byte[] { 0x21 }; _characteristicparameter.WriteProtectionLevel = GattProtectionLevel.Plain; _characteristicparameter.ReadProtectionLevel = GattProtectionLevel.Plain; _characteristicparameter.StaticValue = value.AsBuffer(); _characteristicparameter.UserDescription = "Read Characteristic"; _characteristicparameter.CharacteristicProperties = GattCharacteristicProperties.Read; GattLocalCharacteristicResult characteristicResult = await _serviceProvider.Service.CreateCharacteristicAsync(_characteristicuuid, _characteristicparameter); if (characteristicResult.Error != BluetoothError.Success) { Console.WriteLine("Errore nella creazione della caratteristica di Read"); return; } _readcharacteristic = characteristicResult.Characteristic; Console.WriteLine("Characteristic " + _characteristicuuid + " is a " + _readcharacteristic.CharacteristicProperties + " characteristic"); _readcharacteristic.ReadRequested += ReadRequested; GattServiceProviderAdvertisingParameters advParameters = new GattServiceProviderAdvertisingParameters { IsDiscoverable = true, IsConnectable = true }; _serviceProvider.StartAdvertising(advParameters); Console.WriteLine(_serviceProvider.AdvertisementStatus.ToString()); Console.WriteLine("The service started successfully and has " + _serviceProvider.Service.Characteristics.Count + " characteristics"); while (true) { if (_device == null) { Thread.Sleep(200); } else { Console.WriteLine("Press any key to connect to the Bangle. Js"); Console.ReadKey(); BluetoothLEDevice bluetoothLEDevice = await BluetoothLEDevice.FromIdAsync(_device.Id); Console.WriteLine("Pairing with the device"); GattDeviceServicesResult servicesResult = await bluetoothLEDevice.GetGattServicesAsync(); if (servicesResult.Status == GattCommunicationStatus.Success) { Console.WriteLine("Pairing succeed"); var services = servicesResult.Services; foreach (var service in services) { Console.WriteLine($"Service: {service.Uuid}"); Console.WriteLine("-----------------------"); if (service.Uuid.ToString() == NORDIC_UART_SERVICE) { Console.WriteLine("Connected to NUS Service"); Console.WriteLine("----------------------------------"); GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsAsync(); if (characteristicsResult.Status == GattCommunicationStatus.Success) { var characteristics = characteristicsResult.Characteristics; foreach (var characteristic in characteristics) { Console.WriteLine($"Characteristic {characteristic.Uuid}"); Console.WriteLine("--------------------------------"); GattCharacteristicProperties properties = characteristic.CharacteristicProperties; if (properties.HasFlag(GattCharacteristicProperties.Notify)) { Console.WriteLine("Notify property found"); GattCommunicationStatus status = await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify); if (status == GattCommunicationStatus.Success) { Console.WriteLine("Server has been informed of clients interest and has set the client in notify status"); characteristic.ValueChanged += Characteristic_ValueChanged; _characteristic = characteristic; } } else if (properties.HasFlag(GattCharacteristicProperties.Write)) { Console.WriteLine($"\t \t Characteristic {characteristic.Uuid} has a write property "); Console.WriteLine("-------------------------------- "); writer.WriteString("Data sent"); result = await characteristic.WriteValueAsync(writer.DetachBuffer()); if (result == GattCommunicationStatus.Success) { Console.WriteLine("Data sent"); } } else if (properties.HasFlag(GattCharacteristicProperties.WriteWithoutResponse)) { Console.WriteLine($"\t \t Characteristic {characteristic.Uuid} has a write withoutresponse property "); Console.WriteLine("-------------------------------- "); } } } } } } Console.WriteLine("Press space to disconnect or q to exit"); if (Console.ReadKey().Key == ConsoleKey.Spacebar) { bluetoothLEDevice.Dispose(); return; } else if (Console.ReadKey().Key == ConsoleKey.Q) { Console.WriteLine("Closing"); Thread.Sleep(1000); break; } if (Console.ReadKey().Key == ConsoleKey.Enter) { writer.WriteByte(0x12); result = await _characteristic.WriteValueAsync(writer.DetachBuffer()); if (result == GattCommunicationStatus.Success) { Console.WriteLine("Data sent"); } } } } }
-
Yeah sorry, the first connect within the .on('Connect') was removed, actually the only one is the last on the bottom.
Just a question: is the event handler for the 'data' event called each time the Bangle receives something , correct?Here is my final code:
Bluetooth.on('data', function(d) { g.clear(); g.setFont("Vector", 20); g.setColor(0,255,0); f = require("Storage").open(name, 'a'); f.write(d + "\n"); setTimeout(() => (g.drawString("Data", g.getWidth()/2, g.getHeight()/2)), 1000); setTimeout(()=>g.clear(),1500); }); NRF.on('connect', function(addr) { g.clear(); g.setFont("Vector",15); g.setColor(255,0,0); g.drawString(addr,g.getWidth()/2, g.getHeight()/2); g.setFont("Vector",25); setTimeout(()=>g.drawString("Connected", g.getWidth()/2, g.getHeight()/2), 500); setTimeout(()=>g.clear(),1000); E.setConsole(null); }); NRF.on('disconnect', function(reason) { g.clear(); g.setColor(0,0,255); g.drawString("Disconnected", g.getWidth()/2, g.getHeight()/2); setTimeout(()=> g.clear(), 1000); }); // Code g.setFontAlign(0,0); g.setFont("Vector",25); delay = 5000; name = "MyFile"; setInterval(function(){console.log(E.getTemperature());}, 1000);
The thing is that when I send something from my laptop, bangle does not seem to receive it.
-
This is the part of code running after connection.
function Connect(){ NRF.connect(macaddress).then(function(g) { gatt = g; return gatt.startBonding(); }).then(function(service) { try{ console.log(gatt.getSecurityStatus()); console.log("Connected"); return setTimeout(() => (gatt.getPrimaryService(serviceUid).catch(onRejected)), 2000); } catch(exception){ console.log(exception); } console.log("Service"); return service.getCharacteristic(characteristcUid).catch(onRejected);}).then(function(characteristic) { console.log(characteristic); console.log("Got:", JSON.stringify(d.buffer)); }); }
and this is what it is returned by the console:
[
BluetoothDevice: {"id": "5b:93:7d:91:e5:7c private-resolvable", "rssi": -39, "data": new Uint8Array([2, 1, 26, 3, 3, 10, 24, 17, 7, 114, 131, 89, 57, 60, 2, 116, 174, 69, 70, 180, 13, 199, 230, 80, 241]).buffer, "services": [ "180a", "f150e6c7-0db4-4645-ae74-023c39598372" ]
}
]
{ "connected": true, "encrypted": false, "mitm_protected": false, "bonded": true }
Connected
The code run into a problem: Not connected -
Yes the error is that, but in debugging it return that service is null actually. The C# console application successfully creates a service and the associated characteristic, which is connetable and discoverable, but the bangle seems not able to find the primary service. I even tried to get all the primary services after connecting to the laptop but null object is returned.
As for the connect event handler, basically what I want to achieve is that whenever something connects to the bangle a message is display on the bangle screen, as it is already doing.
Clear! Thanks you! What about if I'd like reading bytes or int16 data sent over ble to my bangle?
The bangle encode the data in the ASCII format right? I then need to convert it in string right?