Goodday. Im trying to extract the 31 byte payload from i-beacons and particle.publish them. Using a central example I manage to only publish the “scanResults[i].advertisingData.deviceName();” correctly.
In Segger with the Nordic libs I use the following snipit to get the 31 byte payload
memmove(RX_Data, p_gap_evt->params.adv_report.data.p_data, p_gap_evt->params.adv_report.data.len);
//use this to check and print all
/* NRF_LOG_RAW_INFO("%02x%02x%02x%02x%02x%02x", RX_Data[0], RX_Data[1], RX_Data[2], RX_Data[3], RX_Data[4], RX_Data[5]);
NRF_LOG_RAW_INFO("%02x%02x%02x%02x%02x%02x", RX_Data[6], RX_Data[7], RX_Data[8], RX_Data[9], RX_Data[10], RX_Data[11]);
NRF_LOG_RAW_INFO("%02X%02x%02x%02x%02x%02x", RX_Data[12], RX_Data[13], RX_Data[14], RX_Data[15], RX_Data[16], RX_Data[17]);
NRF_LOG_RAW_INFO("%02x%02x%02x%02x%02x%02x", RX_Data[18], RX_Data[19], RX_Data[20], RX_Data[21], RX_Data[22], RX_Data[23]);
NRF_LOG_RAW_INFO("%02x%02x%02x%02x%02x%02x", RX_Data[24], RX_Data[25], RX_Data[25], RX_Data[26], RX_Data[27], RX_Data[28]);
NRF_LOG_RAW_INFO("%02x%02x%02x%02x%02x%02x\r\n", RX_Data[29], RX_Data[30], RX_Data[31], RX_Data[32], RX_Data[33], RX_Data[34]);
*/
Im having trouble figuring out how to extract it from the code below. I presume the payload is the buf string. I would then like to particle.publish the entire string or sections of it. Any guidance would be appreciated.
#include "Particle.h"
// This example does not require the cloud so you can run it in manual mode or
// normal cloud-connected mode
//SYSTEM_MODE(MANUAL);
const size_t SCAN_RESULT_MAX = 30;
BleScanResult scanResults[SCAN_RESULT_MAX];
uint8_t buf[BLE_MAX_ADV_DATA_LEN]; // buffer that hold the 30 characters
const char *EVENT_NAME = "test";
void subscriptionHandler(const char *event, const char *data);
void setup()
{
//selectExternalMeshAntenna(); // set the external antenna
Serial.begin();
while (!Serial.available()) delay(10);
}
void loop()
{
// Only scan for 500 milliseconds
BLE.setScanTimeout(50);
int count = BLE.scan(scanResults, SCAN_RESULT_MAX);
for (int i = 0; i < count; i++)
{
size_t len;
len = scanResults[i].advertisingData.get(BleAdvertisingDataType::MANUFACTURER_SPECIFIC_DATA, buf, BLE_MAX_ADV_DATA_LEN);
// We have manufacturer-specific advertising data (0xff) and it's 7 bytes (without the AD type)
// Byte: BLE_SIG_AD_TYPE_MANUFACTURER_SPECIFIC_DATA
// 16-bit: Company ID
// Byte: Internal packet identifier
Serial.printf("\nindex: %2i RSSI: %d len: %i MANUF: %02X:%02X %02X:%02X MAC: %02X:%02X:%02X:%02X:%02X:%02X ",
i,scanResults[i].rssi,len,buf[1], buf[0], buf[2], buf[3],
scanResults[i].address[0], scanResults[i].address[1], scanResults[i].address[2],
scanResults[i].address[3], scanResults[i].address[4], scanResults[i].address[5]);
String name = scanResults[i].advertisingData.deviceName();
if (name.length() > 0)
{Serial.printlnf("Name: %s", name.c_str());
Particle.publish(EVENT_NAME, name , PRIVATE);
}
else {Serial.println();}
/* Serial.printf("%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X ",
scanResults[i].address[0],scanResults[i].address[1],scanResults[i].address[2],scanResults[i].address[3],scanResults[i].address[4],scanResults[i].address[5],
scanResults[i].address[6],scanResults[i].address[7],scanResults[i].address[8],scanResults[i].address[9],scanResults[i].address[10],scanResults[i].address[11],
scanResults[i].address[12],scanResults[i].address[13],scanResults[i].address[14],scanResults[i].address[15],scanResults[i].address[16],scanResults[i].address[17],
scanResults[i].address[18],scanResults[i].address[19],scanResults[i].address[20],scanResults[i].address[21],scanResults[i].address[22],scanResults[i].address[23],
scanResults[i].address[24],scanResults[i].address[25],scanResults[i].address[26],scanResults[i].address[27],scanResults[i].address[29],scanResults[i].address[29],
scanResults[i].address[30]);*/
}
delay(1000);
}
//applies to BT as well as mesh
void selectExternalMeshAntenna()
{
#if (PLATFORM_ID == PLATFORM_ARGON)
digitalWrite(ANTSW1, 1);
digitalWrite(ANTSW2, 0);
#elif (PLATFORM_ID == PLATFORM_BORON)
digitalWrite(ANTSW1, 0);
#elif (PLATFORM_ID == PLATFORM_XENON)
digitalWrite(ANTSW1, 0);
digitalWrite(ANTSW2, 1);
#endif
}
void subscriptionHandler(const char *event, const char *data)
{
Log.info("received %s", data);
}