static void timer_handler_update_data(void *p_context)
if (!(count % AIQBIO_DATA_UPDATE_BATTERY))
{
m_adv_aiqbio[AIQBIO_DATA_IDX_BATTERY] = aiqbio_battery_level_in_percent();
#if defined (GPIO_BATTERY_EN)
// turn off power to protect battery if battery is below 3.2V which is defined in battery_voltage.c
if (m_adv_aiqbio[AIQBIO_DATA_IDX_BATTERY] == 0)
nrf_gpio_pin_clear(GPIO_BATTERY_EN); // output: set BAT_EN low
#endif
}
if (m_is_dc_power_on)
{
m_adv_aiqbio[AIQBIO_DATA_IDX_HR] = max30003_get_hr();
m_adv_aiqbio[AIQBIO_DATA_IDX_RESP] = max30003_get_br();
}
else
m_adv_aiqbio[AIQBIO_DATA_IDX_HR] = 0;
#if TMP117_ENABLED
if (!(count % AIQBIO_DATA_UPDATE_TEMP))
{
m_adv_aiqbio[AIQBIO_DATA_IDX_TEMP] = aiqbio_temperature_in_degree_c();
debug_Main.temperature = m_adv_aiqbio[AIQBIO_DATA_IDX_TEMP];
advertising_update(&m_adv_aiqbio[APP_ADV_DATA_START], QUUPPA_ADV_PACKET_SIZE - APP_ADV_DATA_START);
动态更新广播内容
动态更新广播内容实际就是更新第四节中 manuf_specific_data.data.p_data 的值,
manuf_specific_data.data.p_data = (uint8_t *) p_data;
manuf_specific_data.data.size = QUUPPA_ADV_PACKET_SIZE - APP_ADV_DATA_START;
// Build and set advertising data.
memset(&advdata, 0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_NO_NAME;
advdata.flags = flags;
advdata.p_manuf_specific_data = &manuf_specific_data;
typedef struct
{
uint16_t service_uuid; /< Service UUID. */
uint8_array_t data; /< Additional service data. */
} ble_advdata_service_data_t;
/* Advertising data: refer to QUUPPA document “QuuppaTagEmulationSpecification_v1p2.pdf” /
static uint8_t m_adv_quuppa[QUUPPA_ADV_PACKET_SIZE] =
{
QUUPPA_ADV_AD_STRUCTURE1,
QUUPPA_ADV_AD_STRUCTURE2, / floow by AD Data (Manufacturer Specific data) /
QUUPPA_ADV_COMPANY_ID,
QUUPPA_ADV_PACKET_ID,
QUUPPA_ADV_DEVICE_TYPE,
QUUPPA_ADV_TX_HEADER,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 / Quuppa Tag ID -> BLE device address /,
0x00 / Checksum: CRC-8 calculated over fields of (1) QUUPPA_ADV_DEVICE_TYPE (2) QUUPPA_ADV_TX_HEADER (3) Quuppa Tag ID /,
QUUPPA_ADV_DF_FIELD / The DF field consists of 14 fixed octets defined by QUUPPA */
};
然后停止广播,再更新广播内容,再开启广播,这里涉及到三个函数:
advertising_stop():停止广播
static void advertising_start(void) //开启广播
static void advertising_update(uint8_t *p_data, uint16_t size) //更新广播内容
static void radio_notification_interleave(bool active)
advertising_update(&m_adv_quuppa[APP_ADV_DATA_START], QUUPPA_ADV_PACKET_SIZE - APP_ADV_DATA_START);
advertising_update(&m_adv_aiqbio[APP_ADV_DATA_START], QUUPPA_ADV_PACKET_SIZE - APP_ADV_DATA_START);
int main(void)
ble_radio_notification_init(APP_IRQ_PRIORITY_LOWEST, NRF_RADIO_NOTIFICATION_DISTANCE_5500US, radio_notification_interleave)
;
static void aiqbio_adv_data_init()
{
uint8_t crc_data[8];
/* update BLE device address (BDA) to m_adv_aiq/m_adv_quuppa */
ble_gap_addr_t maddr;
sd_ble_gap_addr_get(&maddr);
for (int i = 0; i < 6; i++)
{
m_adv_aiqbio[14 - i] = maddr.addr[i];
m_adv_quuppa[15 - i] = maddr.addr[i];
crc_data[7 - i] = maddr.addr[i];
sprintf(debug_Main.maddr, "%02X:%02X:%02X:%02X:%02X:%02X", maddr.addr[5], maddr.addr[4], maddr.addr[3], maddr.addr[2], maddr.addr[1], maddr.addr[0]);
}
/* update QUUPPA adv checksum field */
crc_data[0] = m_adv_quuppa[AIQBIO_QPA_IDX_DEVICETYPE];
crc_data[1] = m_adv_quuppa[AIQBIO_QPA_IDX_HEADER];
m_adv_quuppa[AIQBIO_QPA_IDX_CHECKSUM] = crc8(0x00, 0x97, crc_data, 8);
//sd_ble_gap_adv_data_set(m_adv_quuppa, QUUPPA_ADV_PACKET_SIZE, NULL, 0);
advertising_update(&m_adv_quuppa[APP_ADV_DATA_START], QUUPPA_ADV_PACKET_SIZE - APP_ADV_DATA_START);
}