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;