ble_error_t Gap::accumulateAdvertisingPayloadTxPower(int8_t power) { GapAdvertisingData advPayloadCopy = _advPayload; ble_error_t rc; if ((rc = advPayloadCopy.addTxPower(power)) != BLE_ERROR_NONE) { return rc; } rc = setAdvertisingData(advPayloadCopy, _scanResponse); if (rc == BLE_ERROR_NONE) { _advPayload = advPayloadCopy; } return rc; }
ble_error_t Gap::accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) { GapAdvertisingData advPayloadCopy = _advPayload; ble_error_t rc; if ((rc = advPayloadCopy.addAppearance(app)) != BLE_ERROR_NONE) { return rc; } rc = setAdvertisingData(advPayloadCopy, _scanResponse); if (rc == BLE_ERROR_NONE) { _advPayload = advPayloadCopy; } return rc; }
ble_error_t Gap::accumulateScanResponse( GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len ) { GapAdvertisingData scanResponseCopy = _scanResponse; ble_error_t rc; if ((rc = scanResponseCopy.addData(type, data, len)) != BLE_ERROR_NONE) { return rc; } rc = setAdvertisingData(_advPayload, scanResponseCopy); if (rc == BLE_ERROR_NONE) { _scanResponse = scanResponseCopy; } return rc; }
ble_error_t Gap::updateAdvertisingPayload( GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len ) { GapAdvertisingData advPayloadCopy = _advPayload; ble_error_t rc; if ((rc = advPayloadCopy.updateData(type, data, len)) != BLE_ERROR_NONE) { return rc; } rc = setAdvertisingData(advPayloadCopy, _scanResponse); if (rc == BLE_ERROR_NONE) { _advPayload = advPayloadCopy; } return rc; }
int main(void) { *(uint32_t *)0x40000504 = 0xC007FFDF; *(uint32_t *)0x40006C18 = 0x00008000; /* Setup blinky: led1 is toggled in main, led2 is toggled via Ticker */ led1=1; led2=1; flipper.attach(&tickerCallback, 1.0); /* Initialise the nRF51822 */ pc.printf("Initialising the nRF51822\n\r"); nrf.init(); GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED ); GapAdvertisingData advData; GapAdvertisingData scanResponse; /* Define an iBeacon payload -------------------------------------------------------------- 128-Bit UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 Major/Minor = 0000 / 0000 Tx Power = C8 */ uint8_t iBeaconPayload[25] = { 0x4C, 0x00, 0x02, 0x15, 0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61, 0x00, 0x00, 0x00, 0x00, 0xC8 }; /* Make sure we get a clean start */ nrf.reset(); /* iBeacon includes the FLAG and MSD fields */ advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED); advData.addData(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, iBeaconPayload, sizeof(iBeaconPayload)); /* Start advertising! */ nrf.getGap().setAdvertisingData(advData, scanResponse); nrf.getGap().startAdvertising(advParams); /* Do blinky on LED1 while we're waiting for BLE events */ for (;;) { led1 = !led1; wait(1); } }
ble_error_t nRF5xGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) { /* Make sure we don't exceed the advertising payload length */ if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) { return BLE_ERROR_BUFFER_OVERFLOW; } /* Make sure we have a payload! */ if (advData.getPayloadLen() == 0) { return BLE_ERROR_PARAM_OUT_OF_RANGE; } /* Check the scan response payload limits */ //if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED)) //{ // /* Check if we're within the upper limit */ // if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) // { // return BLE_ERROR_BUFFER_OVERFLOW; // } // /* Make sure we have a payload! */ // if (advData.getPayloadLen() == 0) // { // return BLE_ERROR_PARAM_OUT_OF_RANGE; // } //} /* Send advertising data! */ ASSERT_TRUE(ERROR_NONE == sd_ble_gap_adv_data_set(advData.getPayload(), advData.getPayloadLen(), scanResponse.getPayload(), scanResponse.getPayloadLen()), BLE_ERROR_PARAM_OUT_OF_RANGE); /* Make sure the GAP Service appearance value is aligned with the *appearance from GapAdvertisingData */ ASSERT_TRUE(ERROR_NONE == sd_ble_gap_appearance_set(advData.getAppearance()), BLE_ERROR_PARAM_OUT_OF_RANGE); /* ToDo: Perform some checks on the payload, for example the Scan Response can't */ /* contains a flags AD type, etc. */ return BLE_ERROR_NONE; }
ble_error_t GenericGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) { ble_error_t err = _pal_gap.set_advertising_data( advData.getPayloadLen(), pal::advertising_data_t(advData.getPayload(), advData.getPayloadLen()) ); if (err) { return err; } return _pal_gap.set_scan_response_data( scanResponse.getPayloadLen(), pal::advertising_data_t(scanResponse.getPayload(), scanResponse.getPayloadLen()) ); }