-
-
-
-
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.
-
Ok i successfully managed to trigger the X.on("data"...) event, but it is not evoked when I tried to send again another message.
Bluetooth.on('data', function(d) { g.clear(); g.setFont("Vector", 20); g.setColor(0,255,0); //buf += d; //var l = buf.split("\n"); //buf = l.pop(); //l.forEach(onLine); //console.log(value); //c = d.getInt16(0); const buffer = new ArrayBuffer(16); const view = new DataView(buffer); c = view.getInt16(0); g.drawString(c, g.getWidth()/2, g.getHeight()/2); setTimeout(()=>g.clear(),1500); });
Does the function(d) return a dataview?
-
The same error is returned when trying to get the primary service of my laptop from bangle js. I implemented a Gattserver solution on my laptop advertsing a costant value (as explained in UWP sample on Microsoft website): the bangle successuflly connects to my laptop but on finding primary services the code run into the same error. I suppose it's not able to find the service even if on scanning BLE devices nearby with relative services it seems to be visible. Here my JS code:
function ReceiveData(d) { g.drawString(d, g.getWidth()/2, g.getHeight()/2); } Bluetooth.on('data', function(d) { g.clear(); g.setFont("Vector", 10); g.setColor(0,255,0); setTimeout( () => (g.drawString(Serial.read(), g.getWidth()/2, g.getHeight()/2)), 5000); setTimeout( () => (g.drawString('Data received', g.getWidth()/2, g.getHeight()/2)), 2000); }); NRF.on('connect', function(addr) { g.clear(); g.setFont("Vector",10); 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), 3000); setTimeout(()=>g.clear(),1000); Connect(macaddress); }); 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); }); function Scandevices(){ var devices; NRF.findDevices(function(d) { devices = d; console.log(devices); }, {timeout : 2000, filters : [{ manufacturer: "6"}] }); } 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 gatt.getPrimaryService(serviceUid).catch(onRejected); } 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)); }); } function onRejected(event){ console.log('The code run into a problem: '+ event); } // Code g.setFontAlign(0,0); g.setFont("Vector",25); delay = 5000; var gatt; macaddress = "58:74:96:7c:53:b0" + " private-resolvable"; serviceUid = 'f150e6c7-0db4-4645-ae74-023c39598372'; characteristicUid = "b952f9c0-218d-42b6-8ee6-4aab35753922"; Scandevices(); setTimeout(Connect, delay);
After printing "Connected" the error appears!
-
-
-
-
I tried but anyway the connection print the data received to my C# console and not the bangle. I tried even by deactivating the console with the code below, same results:
setInterval(() => (console.log(E.getTemperature())), 1000); g.setFontAlign(0,0); g.setFont("Vector",25); var gatt; E.setConsole(null); NRF.on('connect', function(addr) { g.clear(); g.setFont("Vector",10); 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), 3000); setTimeout(()=>g.clear(), 1000); }); 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); }); Bluetooth.on('data', function(d) { g.clear(); Bluetooth.println(d); g.setColor(0,0,0); g.drawString('Data received', g.getWidth()/2, g.getHeight()/2); g.drawString(s); g.drawString(s, g.getWidth()/2, g.getHeight()/2); });
this is instead the C# console class:
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 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(); 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("-------------------------------- "); var writer = new DataWriter(); writer.WriteString("Data received"); 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; } } } private static void DeviceWatcher_Stopped(DeviceWatcher sender, object args) { //throw new NotImplementedException(); } private static void DeviceWatcher_EnumerationCompleted(DeviceWatcher sender, object args) { //throw new NotImplementedException(); } private static void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args) { //throw new NotImplementedException(); } private static void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args) { //throw new NotImplementedException(); } private static void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args) { if (args.Name == "Bangle.js 0ea8") { Console.WriteLine(args.Name); _device = args; } } private static void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args) { //An Indicate or Notify reported that the value has changed. var value = Utilities.FormatValue(args.CharacteristicValue, _dataFormat); if (value.Contains('J')) { string[] values = value.Split('J'); Console.WriteLine(values[1]); } else { Console.WriteLine(value); } }
Any other suggestion?
-
No actually I didn't call the E.setConsole(), I'll try even if I'd like to keep the console on my logic to double check the response. As for your first suggestion, did you mean to implement a callback function 'X' which will accept the data sent as parametr and which is call when something is received? Basically adding this function within Bluetooth.on()?
-
Hi,
I'll remove the line of code concerning thewriter.WriteByte(0x01);
and test as you suggest!
This is instead my js code running on Bangle:g.setFontAlign(0,0); g.setFont("Vector",25); var gatt; NRF.on('connect', function(addr) { g.clear(); g.setColor(255,0,0); g.drawString("Connected", g.getWidth()/2, g.getHeight()/2); setTimeout(()=>g.clear(), 1000); }); Bluetooth.on('data', function(d) { g.drawString(d, g.getWidth()/2, g.getHeight()/2); }); 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); });
Is Bluetooth.on() called once the BLE received packets ?
-
Hi! Thanks for your prompt repyl: where can I find reference to the
Bluetooth.on('data', function(d) { ... })
method? I couldn't find anything on the doc. Anyway, regarding the first method, do you think this is correct in my c# console? This is just a test:
else if (properties.HasFlag(GattCharacteristicProperties.Write)) { Console.WriteLine($"\t \t Characteristic {characteristic.Uuid} has a write property "); Console.WriteLine("-------------------------------- "); var writer = new DataWriter(); // WriteByte used for simplicity. Other common functions - WriteInt16 and WriteSingle writer.WriteByte(0x01); writer.WriteString("\\x10X({my:\"data\"})\\n"); GattCommunicationS
-
Hi there,
I am implementing a BLE connection between my pc and the Bangle js 2 to stream data from the Bangle to the pc and send back responses to the bangle. I successfully managed to connect the two devices (the bangle is acting as a server device streaming the data I need to a C# console), but I'd like to send back a response string. Data is wrapped in my C# and sent to the bangle but I cannot find a way to read it on the device: do I need to create a specific characteristic on my pc to which connect the bangle or am I missing something? Connection actually is successfull but is it biunivocal?
Thanks in advance! -
-
-
Hi guys,
I'm encountering problems in implementing my own custom module for the Bangle js 2. I have a public Github repo where I am uploading my code, but the web Ide continues on saying that my modules do not exist. Here my example code.var happy = require("https://github.com/riccardokhm/Human-Monitoring-Technologies/tree/main/Projects/Bangle%26Puck%20Js/Modules/Icons.js"); console.log(happy._happyIcon);
Moreover, I have no possibility from my Web Ide of loading the module from a local folder:any suggestion?
Thanks in advance!
-
-
-
-
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?