nRF52832蓝牙iBeacon广播
开发环境
SDK版本:nRF5_SDK_15.0.0
芯片:nRF52832-QFAA
蓝牙iBeacon实现
iBeacon的核心就是广播,不需要进行连接,通过在广播包中插入信息然后广播出去。
广播数据包最多仅可以包含31字节数据,所以设计者必须慎重选择需要包含的数据。蓝牙SIG组织在Core Specification Supplement (CSS)文件中将这31个字节数据分成多个AD Type结构,每个AD Type都有相同的结构,分别为长度字节,类型字节以及数据域。
Beacon设备可以在一个或多个标准广播数据包中编码数据,传递信息。但是编码原理可能有所差异,即帧格式不同。目前主流的三种帧格式分别为苹果公司的iBeacon,Radius Networks公司的AltBeacon以及谷歌公司的Eddystone。
因此为了与不同的beacon设备进行交互,应用开发者在开发beacon应用时需要了解对应设备的帧格式。
iBeacon帧格式

AD Field Length 表示 advertisement data的长度,即广播包有用信息的总长度;
Type 广播类型
Company ID 厂商数据字段的数据域前2字节为公司识别码。由蓝牙SIG组织分配给各公司,指示后续数据的解码方式。在上图中,0x004C为苹果公司的ID。
0x02 指明该设备为“proximity beacon”,该值在iBeacon设备中均为0x02。
UUID指明拥有该beacon设备的机构。
Major 和 Minor 主次字段用来编码位置信息,通常主字段指明某个建筑,而次字段指明在这栋建筑中的特定位置。例如“伦敦中心商场,运动产品区”。
Tx Power 发送功率字段帮助应用进行距离估算。
有关iBeacon的详细内容可以参考Getting started with iBeacon
具体代码实现
#if (GNT_IBEACON_EN)
#define APP_BEACON_INFO_LENGTH 0x17 /**< Total length of information advertised by the Beacon. */
#define APP_ADV_DATA_LENGTH 0x15 /**< Length of manufacturer specific data in the advertisement. */
#define APP_DEVICE_TYPE 0x02 /**< 0x02 refers to Beacon. */
#define APP_MEASURED_RSSI 0xC3 /**< The Beacon's measured RSSI at 1 meter distance in dBm. */
#define APP_COMPANY_IDENTIFIER 0x0059 /**< Company identifier for Nordic Semiconductor ASA. as per www.bluetooth.org. */
#define APP_MAJOR_VALUE 0x01, 0x02 /**< Major value used to identify Beacons. */
#define APP_MINOR_VALUE 0x03, 0x04 /**< Minor value used to identify Beacons. */
#define APP_BEACON_UUID 0x01, 0x12, 0x23, 0x34, \
0x45, 0x56, 0x67, 0x78, \
0x89, 0x9a, 0xab, 0xbc, \
0xcd, 0xde, 0xef, 0xf0 /**< Proprietary UUID for Beacon. */ #define MAJ_VAL_OFFSET_IN_BEACON_INFO 18 /**< Position of the MSB of the Major Value in m_beacon_info array. */
#define UICR_ADDRESS 0x10001080 /**< Address of the UICR register used by this example. The major and minor versions to be encoded into the advertising data will be picked up from this location. */ static uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH] = /**< Information advertised by the Beacon. */
{
APP_DEVICE_TYPE, // Manufacturer specific information. Specifies the device type in this
// implementation.
APP_ADV_DATA_LENGTH, // Manufacturer specific information. Specifies the length of the
// manufacturer specific data in this implementation.
APP_BEACON_UUID, // 128 bit UUID value.
APP_MAJOR_VALUE, // Major arbitrary value that can be used to distinguish between Beacons.
APP_MINOR_VALUE, // Minor arbitrary value that can be used to distinguish between Beacons.
APP_MEASURED_RSSI // Manufacturer specific information. The Beacon's measured TX power in
// this implementation.
};
#endif /**@brief Function for initializing the Advertising functionality. */
static void advertising_init(void)
{
ret_code_t err_code;
ble_advertising_init_t init; memset(&init, 0, sizeof(init)); // 使用iBeacon广播,由于广播包长度需要控制好,部分信息可放置到广播应答包中
#if (GNT_IBEACON_EN)
ble_advdata_manuf_data_t manuf_specific_data; //厂商自定义信息
manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER; //厂商ID
uint16_t major_value = (uint16_t)((UICR_ADDRESS & 0xFFFF0000) >> 16);
uint16_t minor_value = (uint16_t)(UICR_ADDRESS & 0x0000FFFF); uint8_t index = MAJ_VAL_OFFSET_IN_BEACON_INFO; m_beacon_info[index++] = MSB_16(major_value);
m_beacon_info[index++] = LSB_16(major_value); m_beacon_info[index++] = MSB_16(minor_value);
m_beacon_info[index++] = LSB_16(minor_value); NRF_LOG_HEXDUMP_INFO(m_beacon_info, APP_BEACON_INFO_LENGTH); manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info;
manuf_specific_data.data.size = APP_BEACON_INFO_LENGTH;
init.advdata.p_manuf_specific_data = &manuf_specific_data;
#endif
//注意advdata长度不能超过 BLE_GAP_ADV_SET_DATA_SIZE_MAX (31)
init.advdata.name_type = BLE_ADVDATA_NO_NAME; //广播iBeacon信息,长度有限 --广播时的名称显示类型(全名)BLE_ADVDATA_FULL_NAME
// init.advdata.include_appearance = true; //是否需要图标
init.advdata.flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED; //蓝牙设备普通发现模式 BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE
// init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); //广播UUID
// init.advdata.uuids_complete.p_uuids = m_adv_uuids;
// init.advdata.p_tx_power_level = &tx_power_level; //设置发射功率 init.srdata.name_type = BLE_ADVDATA_FULL_NAME; init.config.ble_adv_fast_enabled = true; //快速广播使能
init.config.ble_adv_fast_interval = APP_FAST_ADV_INTERVAL; //快速广播间隔 30ms
init.config.ble_adv_fast_timeout = APP_FAST_ADV_DURATION; //默认快速广播超时 20s init.config.ble_adv_slow_enabled = true; //慢速广播使能
init.config.ble_adv_slow_interval = APP_SLOW_ADV_INTERVAL; //慢速广播间隔 200ms
// init.config.ble_adv_slow_timeout = APP_SLOW_ADV_DURATION; //默认慢速广播超时 40s if(nrf_gpio_pin_read(USBVIN_CHECK) == 1) //USB插入
{
gnt_led_indication_set(LED_USB_IN);
g_gnt_info.gnt_usbvin_flag = 1;
init.config.ble_adv_slow_timeout = 0;
}
else
{
gnt_led_indication_set(LED_USB_OUT);
g_gnt_info.gnt_usbvin_flag = 0;
init.config.ble_adv_slow_timeout = APP_SLOW_ADV_DURATION; //默认慢速广播超时 40s
} init.evt_handler = on_adv_evt; err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code); ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}
nRF52832蓝牙iBeacon广播的更多相关文章
- 蓝牙Ibeacon室内定位和微信摇一摇周边原理分析
苹果推出Ibeacon室内定位技术是为了弥补GPS无法覆盖室内定位这种场景.苹果意味着创新,在其推动下,蓝牙Ibeacon得到了极大的应用.而腾讯则是利用蓝牙Ibeacon在场景体验方面进行了创新,实 ...
- Nordic Semiconductor nRF52832 蓝牙智能多协议单芯片解决方案荣获《中国电子商情》编辑选择奖
挪威奥斯陆 – 2016年4月11日 – Nordic Semiconductor ASA (OSE: NOD) 赢得<中国电子商情>颁发的"2015年编辑选择奖",其 ...
- 蓝牙Beacon广播数据包格式以及解析
目录 1. 获取原始蓝牙广播包 2. 安装WireShark软件 3. 分析Beacon广播包数据 3.1 第一个数据包格式 3.2 第二个数据包格式 3.3 Android程序开发中的蓝牙广播包 4 ...
- nrf52832蓝牙开发踩过的坑
接触nrf52832芯片已经有一段时间了,记录我踩过的坑.这些坑大多都补回来了,愿后来的开发者没有坑~ 先来点开胃小菜 一.环境问题 安装离线包遇到的错误--svdconv exited with a ...
- iOS 作为蓝牙外设广播信息
苹果蓝牙后台的限制,原本广播会有两个段分别是localName和serviceUUID这两块,但现在后台广播时,是不发送在这两段的 手机app可以作为一个蓝牙外设端来模拟外设硬件,但广播包里的数据只能 ...
- BLE蓝牙的广播类型
广播的类型一般分为四种,见如下表格: 1. 可连接的非定向广播(Connectable Undirected Event Type): 这是一种用途最广的广播类型,包括广播数据和扫描响应数据,它表示当 ...
- NRF52832初步使用
开发环境搭建 开发环境涉及到协议栈SDK版本.keil PACK版本的匹配问题,目前测试通过的环境如下: windows系统:win10 硬件:NRF52832测试板.JLINK-V8仿真器 Keil ...
- android BLE Peripheral 模拟 ibeacon 发出ble 广播
Android对外模模式(peripheral)的支持: 从Android 5.0+开始才支持. api level >= 21 所以5.0 之前设备,是不能向外发送广播的. Android中心 ...
- iOS蓝牙开发之iBeacon技术
iBeacon组成信息: 1 .UUID(universally unique identifier):一个128位的唯一标识一个或多个Beacon基站为特定类型或特定的组织. 2. Major:一个 ...
随机推荐
- cmd MySQL登录
mysql -uroot -p >Mysql -P 3306 -h 0.0.0.0 -u root -p 可远程访问
- VSCode远程免密登录
VSCode远程免密登录 本地生成密钥 生成命令如下: ssh-keygen -t rsa 会生成id_rsa, id_rsa.pub两个文件 公钥拷贝到服务器 将公钥id_rsa.pub拷贝到服务器 ...
- Hadoop 3.1.1 - Yarn 服务 - 总览
YARN 服务 总览 Yarn 服务框架为在 Yarn 原生环境里长时间运行的服务,提供了一流的支持和接口.简言之,它扮演了容器编排系统的角色,统一管理 Yarn 上运行的容器化服务.它同时支持 Do ...
- 🏆【Java技术专区】「延时队列专题」教你如何使用【精巧好用】的DelayQueue
延时队列前提 定时关闭空闲连接:服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之. 定时清除额外缓存:缓存中的对象,超过了空闲时间,需要从缓存中移出. 实现任务超时处理:在网络协议滑动窗口请求 ...
- awk文本
目录 1.awk概念 2. 基本格式 3. 工作原理 4. 常见的内建变量(可直接用) 5. 按行输出文本 实例1:输出全部内容 实例2:输出第1到第3行的内容 实例3:输出第1行和第3行的内容,输出 ...
- C++ 继承方式 //语法:class 子类 :继承方式 父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承
1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...
- JVM G1GC的算法与实现
G1GC 是什么? 一些基本概念 实时性 G1GC 有什么特点? G1GC 的堆结构是什么样的? G1GC 的执行过程是什么样的? 并发标记 并发标记是什么 标记位图 执行步骤 步骤 1--初始标记阶 ...
- SpringCloud-技术专区-从源码层面让你认识Feign工作流程和运作机制
Feign工作流程源码解析 什么是feign:一款基于注解和动态代理的声明式restful http客户端. 原理 Feign发送请求实现原理 微服务启动类上标记@EnableFeignClients ...
- CNVD-2021-14536 锐捷 RG-UAC 统一上网行为管理审计系统信息泄露漏洞
漏洞简介 锐捷 RG-UAC 统一上网行为管理审计系统存在信息泄露,攻击者通过网页源代码可间接获取管理用户账号密码,登录管理后台. 漏洞复现 fofa搜索以下关键字 title="RG-UA ...
- 武器级工具包 Immunity Canvas 7.26 泄露事件 | 附下载地址
关于Immunity Canvas Immunity CANVAS是Immunity公司的一款商业级漏洞利用和渗透测试工具,包含了480多个以上的漏洞利用,该工具并不开源,其中文版介绍如下: &quo ...