private void ConvertAttributesToCharacteristics(BlePeripheralService service) { #region Example attr table // *=== Service: 42 48 12 4a 7f 2c 48 47 b9 de 04 a9 02 00 06 d5 // *====== Att: 26 - 00 28 // *====== Att: 27 - 03 28 // *====== Att: 28 - 42 48 12 4a 7f 2c 48 47 b9 de 04 a9 02 04 06 d5 // *====== Att: 29 - 02 29 // *====== Att: 30 - 03 28 // *====== Att: 31 - 42 48 12 4a 7f 2c 48 47 b9 de 04 a9 02 05 06 d5 // *====== Att: 32 - 02 29 #endregion BlePeripheralCharacteristic current = null; bool createCharacteristic = false; foreach (BlePeripheralAttribute attr in service.Attributes) { if (attr.AttributeUUID.Equals(BlePeripheralAttribute.SERVICE_UUID)) { // defines service - do nothing } else if (attr.AttributeUUID.Equals(BlePeripheralAttribute.CHARACTERISTIC_UUID)) { // finish previous characteristic current = null; // crete characteristic from next attribute createCharacteristic = true; } else if (attr.AttributeUUID.Equals(BlePeripheralAttribute.CHARACTERISTIC_CCC_UUID)) { // add ccc capabilities to characteristic current.SetCCCHandle(attr.Handle); } else { // if new characteristic begins - create it else skip and do nothing if (createCharacteristic) { current = new BlePeripheralCharacteristic(attr.AttributeUUID, attr.Handle); createCharacteristic = false; service.Characteristics.Add(current); } } } }
private void FindAttributes(BlePeripheralService service) { byte[] findInfo = Ble.Lib.BLECommandATTClientFindInformation(this.Connection, service.StartHandle, service.EndHandle); FindInformationFoundEventHandler infoHandler = (sender, e) => this.AttributeFound(service, e); Ble.Lib.BLEEventATTClientFindInformationFound += infoHandler; ProcedureCompletedEventArgs procedureResponse = null; ProcedureCompletedEventHandler handler = (sender, e) => { procedureResponse = e; }; Ble.Lib.BLEEventATTClientProcedureCompleted += handler; Ble.SendCommand(this.Port, findInfo); this.WaitEvent(() => procedureResponse != null); Ble.Lib.BLEEventATTClientFindInformationFound -= infoHandler; Ble.Lib.BLEEventATTClientProcedureCompleted -= handler; }
private void AttributeFound(BlePeripheralService service, FindInformationFoundEventArgs e) { service.Attributes.Add(new BlePeripheralAttribute(e.uuid, e.chrhandle)); }