Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add characteristic discovery to BleService #2203

Merged
merged 7 commits into from
Nov 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions user/tests/wiring/api/ble.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,36 +536,49 @@ test(ble_peer_device) {
BleConnectionParams params;

API_COMPILE({ Vector<BleService> services = peer.discoverAllServices(); });
API_COMPILE({ BleService services[1]; size_t ret = peer.discoverAllServices(services, 1); (void)ret; });
API_COMPILE({ BleService services[1]; ssize_t ret = peer.discoverAllServices(services, 1); (void)ret; });

API_COMPILE({ Vector<BleCharacteristic> characteristics = peer.discoverAllCharacteristics(); });
API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.discoverAllCharacteristics(characteristics, 1); (void)ret; });
API_COMPILE({ BleCharacteristic characteristics[1]; ssize_t ret = peer.discoverAllCharacteristics(characteristics, 1); (void)ret; });

API_COMPILE({ Vector<BleCharacteristic> characteristics = peer.discoverCharacteristicsOfService(BleService()); });
API_COMPILE({ BleCharacteristic characteristics[1]; ssize_t ret = peer.discoverCharacteristicsOfService(BleService(), characteristics, 1); (void)ret; });

API_COMPILE({ Vector<BleService> services = peer.services(); });
API_COMPILE({ BleService services[1]; size_t ret = peer.services(services, 1); (void)ret; });
API_COMPILE({ BleService service; bool ret = peer.getServiceByUUID(service, uuid); (void)ret; });
API_COMPILE({ Vector<BleService> services = peer.getServiceByUUID(uuid); });
API_COMPILE({ BleService services[1]; size_t ret = peer.getServiceByUUID(services, 1, uuid); (void)ret; });

API_COMPILE({ Vector<BleCharacteristic> characteristics = peer.characteristics(); });
API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.characteristics(characteristics, 1); (void)ret; });
API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(characteristic, "1234"); (void)ret; });
API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(characteristic, String("1234")); (void)ret; });
API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByUUID(characteristic, uuid); (void)ret; });
API_COMPILE({ Vector<BleCharacteristic> characteristics = peer.getCharacteristicByUUID(uuid); });
API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.getCharacteristicByUUID(characteristics, 1, uuid); (void)ret; });

API_COMPILE({ Vector<BleCharacteristic> characteristics = peer.characteristics(BleService()); });
API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.characteristics(BleService(), characteristics, 1); (void)ret; });
API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(BleService(), characteristic, "1234"); (void)ret; });
API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(BleService(), characteristic, String("1234")); (void)ret; });
API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByUUID(BleService(), characteristic, uuid); (void)ret; });

API_COMPILE({ int ret = peer.connect(addr); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, false); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, &params); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, &params, false); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, params); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, params, false); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, 0 , 0, 0); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, 0, 0, 0); (void)ret; });
API_COMPILE({ int ret = peer.connect(addr, 0, 0, 0, false); (void)ret; });
API_COMPILE({ int ret = peer.connect(); (void)ret; });
API_COMPILE({ int ret = peer.connect(false); (void)ret; });
API_COMPILE({ int ret = peer.connect(&params); (void)ret; });
API_COMPILE({ int ret = peer.connect(&params, false); (void)ret; });
API_COMPILE({ int ret = peer.connect(params); (void)ret; });
API_COMPILE({ int ret = peer.connect(params, false); (void)ret; });
API_COMPILE({ int ret = peer.connect(0 , 0, 0); (void)ret; });
API_COMPILE({ int ret = peer.connect(0, 0, 0); (void)ret; });
API_COMPILE({ int ret = peer.connect(0, 0, 0, false); (void)ret; });
API_COMPILE({ int ret = peer.disconnect(); (void)ret; });
API_COMPILE({ bool ret = peer.connected(); (void)ret; });
Expand Down
79 changes: 78 additions & 1 deletion user/tests/wiring/ble_central_peripheral/ble_central/central.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ const String str7("d4b4249bbbe3");

bool str1Rec = false, str2Rec = false, str3Rec = false, str4Rec = false, str5Rec = false, str6Rec = false, str7Rec = false;

BleAddress peerAddr;

static void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context) {
String str((const char*)data, len);
if (str == str1) {
Expand Down Expand Up @@ -69,7 +71,13 @@ test(BLE_01_Central_Scan_And_Connect) {
BleUuid foundServiceUUID;
size_t svcCount = results[i].advertisingData().serviceUUID(&foundServiceUUID, 1);
if (svcCount > 0 && foundServiceUUID == "6E400000-B5A3-F393-E0A9-E50E24DCCA9E") {
peer = BLE.connect(results[i].address());
assertTrue(results[i].scanResponse().length() > 0);
BleUuid uuids[2];
assertEqual(results[i].scanResponse().serviceUUID(uuids, 2), 2);
assertTrue(uuids[0] == 0x1234);
assertTrue(uuids[1] == 0x5678);
peerAddr = results[i].address();
peer = BLE.connect(peerAddr);
if (peer.connected()) {
assertTrue(peer.getCharacteristicByDescription(peerCharRead, "read"));
assertTrue(peer.getCharacteristicByDescription(peerCharWrite, "write"));
Expand Down Expand Up @@ -213,6 +221,75 @@ test(BLE_18_Central_Received_Characteristic_With_Notify_Indicate_Property_Nack)
wait--;
}
assertTrue(wait > 0);

BLE.disconnect(peer);
int ret = BLE.setScanTimeout(500); // Scan timeout: 5s
assertEqual(ret, 0);
}

test(BLE_19_Central_Discover_All_Services) {
peer = BLE.connect(peerAddr, false);
assertTrue(peer.connected());

Vector<BleService> services = peer.discoverAllServices();
BleService ctrlService;
assertTrue(peer.getServiceByUUID(ctrlService, "6FA90001-5C4E-48A8-94F4-8030546F36FC"));
BleService customService;
assertTrue(peer.getServiceByUUID(customService, "6E400000-B5A3-F393-E0A9-E50E24DCCA9E"));

BLE.disconnect(peer);
}

test(BLE_20_Central_Discover_All_Characteristics) {
peer = BLE.connect(peerAddr, false);
assertTrue(peer.connected());

Vector<BleCharacteristic> allCharacteristics = peer.discoverAllCharacteristics();
BleService ctrlService;
assertTrue(peer.getServiceByUUID(ctrlService, "6FA90001-5C4E-48A8-94F4-8030546F36FC"));
BleService customService;
assertTrue(peer.getServiceByUUID(customService, "6E400000-B5A3-F393-E0A9-E50E24DCCA9E"));

Vector<BleCharacteristic> characteristicsOfCtrlService = peer.characteristics(ctrlService);
assertTrue(characteristicsOfCtrlService[0].UUID() == "6FA90002-5C4E-48A8-94F4-8030546F36FC");
assertTrue(characteristicsOfCtrlService[1].UUID() == "6FA90003-5C4E-48A8-94F4-8030546F36FC");
assertTrue(characteristicsOfCtrlService[2].UUID() == "6FA90004-5C4E-48A8-94F4-8030546F36FC");

Vector<BleCharacteristic> characteristicsOfCustomService = peer.characteristics(customService);
assertTrue(characteristicsOfCustomService[0].UUID() == "6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[1].UUID() == "6E400002-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[2].UUID() == "6E400003-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[3].UUID() == "6E400004-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[4].UUID() == "6E400005-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[5].UUID() == "6E400006-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[6].UUID() == "6E400007-B5A3-F393-E0A9-E50E24DCCA9E");

BLE.disconnect(peer);
}

test(BLE_21_Central_Discover_Characteristics_Of_Service) {
peer = BLE.connect(peerAddr, false);
assertTrue(peer.connected());

Vector<BleService> services = peer.discoverAllServices();
BleService ctrlService;
assertTrue(peer.getServiceByUUID(ctrlService, "6FA90001-5C4E-48A8-94F4-8030546F36FC"));
BleService customService;
assertTrue(peer.getServiceByUUID(customService, "6E400000-B5A3-F393-E0A9-E50E24DCCA9E"));

Vector<BleCharacteristic> characteristicsOfCtrlService = peer.discoverCharacteristicsOfService(ctrlService);
assertTrue(characteristicsOfCtrlService[0].UUID() == "6FA90002-5C4E-48A8-94F4-8030546F36FC");
assertTrue(characteristicsOfCtrlService[1].UUID() == "6FA90003-5C4E-48A8-94F4-8030546F36FC");
assertTrue(characteristicsOfCtrlService[2].UUID() == "6FA90004-5C4E-48A8-94F4-8030546F36FC");

Vector<BleCharacteristic> characteristicsOfCustomService = peer.discoverCharacteristicsOfService(customService);
assertTrue(characteristicsOfCustomService[0].UUID() == "6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[1].UUID() == "6E400002-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[2].UUID() == "6E400003-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[3].UUID() == "6E400004-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[4].UUID() == "6E400005-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[5].UUID() == "6E400006-B5A3-F393-E0A9-E50E24DCCA9E");
assertTrue(characteristicsOfCustomService[6].UUID() == "6E400007-B5A3-F393-E0A9-E50E24DCCA9E");
}

#endif // #if Wiring_BLE == 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,12 @@ test(BLE_01_Peripheral_Advertising) {
temp = BLE.addCharacteristic(charNotifyAndIndicate);
assertTrue(temp.isValid());

BleAdvertisingData data;
data.appendServiceUUID(serviceUuid);
ret = BLE.advertise(&data);
BleAdvertisingData advData;
advData.appendServiceUUID(serviceUuid);
BleAdvertisingData srData;
uint8_t uuids[] = {0x34, 0x12, 0x78, 0x56}; // little endian, i.e. 0x1234 and 0x5678.
srData.append(BleAdvertisingDataType::SERVICE_UUID_16BIT_MORE_AVAILABLE, uuids, sizeof(uuids));
ret = BLE.advertise(&advData, &srData);
assertEqual(ret, 0);

Serial.println("BLE starts advertising...");
Expand Down
25 changes: 21 additions & 4 deletions wiring/inc/spark_wiring_ble.h
Original file line number Diff line number Diff line change
Expand Up @@ -779,17 +779,34 @@ class BlePeerDevice {
Vector<BleCharacteristic> discoverAllCharacteristics();
ssize_t discoverAllCharacteristics(BleCharacteristic* characteristics, size_t count);

// Discover all characteristics of a service
Vector<BleCharacteristic> discoverCharacteristicsOfService(const BleService& service);
ssize_t discoverCharacteristicsOfService(const BleService& service, BleCharacteristic* characteristics, size_t count);

// Fetch the discovered services on peer device.
Vector<BleService> services();
size_t services(BleService* services, size_t count);
Vector<BleService> services() const;
size_t services(BleService* services, size_t count) const;
bool getServiceByUUID(BleService& service, const BleUuid& uuid) const;
// In case that there are several services with the same UUID.
Vector<BleService> getServiceByUUID(const BleUuid& uuid) const;
size_t getServiceByUUID(BleService* services, size_t count, const BleUuid& uuid) const;

// Fetch the discovered characteristics on peer device.
Vector<BleCharacteristic> characteristics();
size_t characteristics(BleCharacteristic* characteristics, size_t count);
Vector<BleCharacteristic> characteristics() const;
size_t characteristics(BleCharacteristic* characteristics, size_t count) const;
bool getCharacteristicByDescription(BleCharacteristic& characteristic, const char* desc) const;
bool getCharacteristicByDescription(BleCharacteristic& characteristic, const String& desc) const;
bool getCharacteristicByUUID(BleCharacteristic& characteristic, const BleUuid& uuid) const;
// In case that there are several characteristics with the same UUID.
Vector<BleCharacteristic> getCharacteristicByUUID(const BleUuid& uuid) const;
size_t getCharacteristicByUUID(BleCharacteristic* characteristics, size_t count, const BleUuid& uuid) const;

// Fetch the discovered characteristics under a service.
Vector<BleCharacteristic> characteristics(const BleService& service) const;
size_t characteristics(const BleService& service, BleCharacteristic* characteristics, size_t count) const;
bool getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const char* desc) const;
bool getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const String& desc) const;
bool getCharacteristicByUUID(const BleService& service, BleCharacteristic& characteristic, const BleUuid& uuid) const;

int connect(const BleAddress& addr, const BleConnectionParams* params, bool automatic = true);
int connect(const BleAddress& addr, const BleConnectionParams& params, bool automatic = true);
Expand Down
Loading