4.3.6. APP - IBEACON

4.3.6.1. 概述

  • 蓝牙beacon即蓝牙信标,是通过BLE广播特定数据格式的广播包,接收终端通过扫描获取BLE广播包信息,再根据协议进行解析。接收终端和蓝牙beacon之间的通信,不需要建立蓝牙连接。目前的应用:1.蓝牙信标室内定位,具有简单,低功耗,手机兼容性好的优点。2.消息推送,见于大型商场的推销活动等。3.考勤打卡,身份识别。

  • 支持板级:bd19、br23、br25

  • 支持芯片:AC632N、AC635N、AC636N

4.3.6.2. 工程配置

  • 代码工程:apps/spp_and_le/board/bdxx/AC63xN_spp_and_le.cbp

  • 在app_config.文件中进行IBEACON应用的配置。

//app case 选择,只能选1个,要配置对应的board_config.h
#define CONFIG_APP_BEACON 1 //蓝牙BLE ibeacon

4.3.6.3. 主要代码说明

  • 配置应用case之后,根据定义好的数据格式,制作信标数据包,该函数位于le_beacon.c文件。

static u8 make_beacon_packet(u8 \*buf, void \*packet, u8 packet_type, u8 \*web)
{
switch (packet_type) {
case IBEACON_PACKET:
case EDDYSTONE_UID_PACKET:
case EDDYSTONE_TLM_PACKET:
        memcpy(buf, (u8 \*)packet, packet_type);
        break;
case EDDYSTONE_EID_PACKET:
        memcpy(buf, (u8 \*)packet, packet_type);
        break;

case EDDYSTONE_ETLM_PACKET:
        memcpy(buf, (u8 \*)packet, packet_type);
        break;

case EDDYSTONE_URL_PACKET:.
        packet_type = make_eddystone_url_adv_packet(buf, packet, web);
        break;
}

return packet_type;
}
  • 例如下面是eddystone_etlm的数据格式,将该数据制作成数据包后,通过make_set_adv_data()将数据发送出去,该函数同样位于le_beacon.c文件中,同时信标的广播类型应是广播不连接的ADV_NONCONN_IND类型。

static const EDDYSTONE_ETLM eddystone_etlm_adv_packet = {
.length = 0x03,
.ad_type1 = 0x03,
.complete_list_uuid = 0xabcd,
.length_last = 0x15,
.ad_type2 = 0x16,
.eddystone_uuid = 0xfeaa,
.frametype = 0x20,
.tlm_version = 0x01,
.etml = {
        0, 0, 0, 0,
        0, 0, 0, 0,
        0, 0, 0, 0
}, //12字节加密数据

.random = 1, //随机数,要与加密时用到的随机数相同
.check = 2, //AES-EAX计算出来的校验和
};
  • 将数据以广播包的形式发送出去,客户端通过扫描获取到信标发出去的数据。

static int make_set_adv_data(void)
{
u8 offset = 0;
u8 \*buf = adv_data;
/\* offset += make_eir_packet_val(&buf[offset], offset, HCI_EIR_DATATYPE_FLAGS, 0x06, 1);
\*/offset+=make_beacon_packet(&buf[offset],&eddystone_etlm_adv_packet,EDDYSTONE_ETLM_PACKET, NULL);
offset+=make_beacon_packet(&buf[offset],&eddystone_eid_adv_packet,EDDYSTONE_EID_PACKET, NULL); \*/
//offset+=make_beacon_packet(&buf[offset],&eddystone_url_adv_packet,EDDYSTONE_URL_PACKET, "https://fanyi.baidu.com/");
//offset+=make_beacon_packet(&buf[offset],&eddystone_tlm_adv_packet,EDDYSTONE_TLM_PACKET, NULL);
//offset+=make_beacon_packet(&buf[offset],&eddystone_uid_adv_packet,EDDYSTONE_UID_PACKET, NULL);
// offset += make_beacon_packet(&buf[offset], &ibeacon_adv_packet, IBEACON_PACKET, NULL);
if (offset > ADV_RSP_PACKET_MAX) {
puts("**adv_data overflow!!!!!!\n");
return -1;