目录
- 核心概念:什么是 Beacon?
- 技术基石:蓝牙 Beacon 如何工作?
- 实现步骤:从零到一构建 Beacon 应用
- 应用场景举例
- 开发注意事项与挑战
核心概念:什么是 Beacon?
Beacon(信标) 是一种小型的、低功耗的蓝牙设备,它本身不连接到互联网,也不存储数据,它的唯一作用是周期性地、单向地广播一个微小的数据包。

你可以把它想象成一个“永不疲倦的、低成本的广播站”,它不断地喊:“我在这里,我的ID是XXX!”,附近的智能手机等设备“收音机”可以接收到这个信号。
关键特性:
- 低功耗: 通常使用一枚纽扣电池可以工作1-2年。
- 低成本: 硬件制造成本非常低。
- 单向通信: Beacon 只广播,不接收,所有数据处理和决策都在接收端(如手机App)完成。
- proximity(邻近性): 核心价值在于它能感知设备与自身的距离远近(近、中、远)。
技术基石:蓝牙 Beacon 如何工作?
Beacon 的实现主要基于 蓝牙低功耗 技术,具体来说是 BLE Advertising(广播) 功能。
a. 广播数据包的结构
一个 Beacon 广播的数据包通常包含三个关键部分,它们共同构成了一个标准的 Beacon 协议,最著名的就是 iBeacon 协议(由苹果定义)。

一个典型的 iBeacon 广播数据包结构如下:
| 字段 | 长度 | 描述 | 示例值 |
|---|---|---|---|
| UUID | 16字节 | 一个唯一的标识符,用于 Beacon 的群组或品牌。 | E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 |
| Major | 2字节 | UUID 的子分类,通常用于标识一个地点或区域。 | 1 (代表“北京王府井店”) |
| Minor | 2字节 | Major 的更细分类,通常用于标识该区域内的特定设备或位置。 | 1 (代表“入口处”) |
| RSSI | 1字节 | 接收信号强度指示,这是设备在 1米 距离处接收到的信号强度(负值,如 -59 dBm)。 |
-59 |
注意: RSSI 并不是广播包的一部分,而是 Beacon 设备在广播时附带的关于自身信号强度的参考值,接收端会利用这个参考值来估算距离。
b. 距离估算原理
Beacon 本身不知道手机在哪里,它只是不停地广播,手机通过测量接收到的信号强度 RSSI 来估算距离。
- RSSI (Received Signal Strength Indicator): 接收信号强度,RSSI 值越大(负得越少),表示信号越强,距离越近。
- 距离估算: 手机 App 接收到 Beacon 的广播后,会记录下 RSSI 值,通过一个经验公式(如对数路径损耗模型)将 RSSI 值换算成一个距离。
简单估算逻辑(通常由 App 实现):

- Near (近): RSSI > -70dBm (在 1-2 米内)
- Immediate (即时的): -70dBm > RSSI > -90dBm (在 2-5 米内)
- Far (远): RSSI < -90dBm (距离较远或信号受阻)
重要提示: RSSI 受环境因素影响很大(墙壁、人群、金属物体等),因此距离估算只是一个概率性的参考,而非精确测量。
实现步骤:从零到一构建 Beacon 应用
一个完整的 Beacon 应用通常包含两个部分:Beacon 端(硬件) 和 接收端(软件)。
选择并部署 Beacon 硬件
- 购买 Beacon 设备: 市面上有很多成熟的 Beacon 硬件,如 Estimote, Kontakt.io, RadBeacon 等,它们通常都支持 iBeacon 和 Eddystone 等主流协议。
- 配置 Beacon:
- 大多数 Beacon 厂商都提供配套的手机 App。
- 通过 App 将 Beacon 配置为你自定义的 UUID, Major, Minor 值。
- 可以设置广播功率(影响有效距离)和广播间隔(影响电池续航)。
- 部署 Beacon: 将配置好的 Beacon 固定在需要的位置,如商店货架、博物馆展品旁、会议室门口等。
开发接收端应用程序(以手机 App 为例)
这是 Beacon 应用的核心逻辑所在,通常在 iOS 或 Android 平台上开发。
开发流程(以 Android 为例,iOS 类似):
-
添加蓝牙权限: 在
AndroidManifest.xml中声明必要的权限。<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 关键!扫描需要位置权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-
初始化蓝牙适配器: 在代码中获取系统的
BluetoothAdapter对象。 -
设置扫描回调: 使用
BluetoothAdapter.getLeScanner()获取蓝牙扫描器,并设置一个ScanCallback。 这个回调函数会在扫描到符合条件的 Beacon 时被触发。 -
启动扫描: 调用
startScan()方法开始扫描,可以设置一个ScanFilter来只监听特定 UUID 的 Beacon,减少不必要的回调。 -
处理扫描结果: 在
ScanCallback的onScanResult()方法中,你会接收到一个ScanResult对象,从中可以解析出:- 设备地址:
ScanResult.getDevice().getAddress() - 信号强度:
ScanResult.getRssi() - 广播数据包:
ScanResult.getScanRecord().getBytes()
- 设备地址:
-
解析数据包和计算距离:
- 从字节数组中解析出 UUID, Major, Minor,对于 iBeacon,其数据格式是固定的。
- 结合 RSSI 和设备自身广播的 1米参考 RSSI,计算距离。
-
实现应用逻辑: 根据计算出的距离和 Beacon 的 ID,触发不同的业务逻辑,这是应用价值所在。
- 当检测到手机进入了 Major=1 (北京王府井店), Minor=1 (入口处) 的 Beacon 的 "Near" 范围内时,App 可以自动推送一条欢迎优惠券的弹窗。
-
停止扫描: 当不再需要扫描时(如 App 进入后台),务必调用
stopScan()以节省电量。
代码示例 (Android - Kotlin 简化版):
val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
val scanner = bluetoothAdapter?.bluetoothLeScanner
// 定义要扫描的 Beacon 的 UUID
val targetUUID = UUID.fromString("E2C56DB5-DFFB-48D2-B060-D0F5A71096E0")
// 创建扫描过滤器
val filter = ScanFilter.Builder()
.setServiceUuid(ParcelUuid(UUID.fromString("FEAA"))) // iBeacon 的服务 UUID
.build()
// 设置扫描回调
val callback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val scanRecord = result.scanRecord
val bytes = scanRecord?.bytes
// 解析 bytes,提取 UUID, Major, Minor, RSSI
// ... (这里需要根据 iBeacon 协议规范进行解析)
// 假设已经解析出 beaconId 和 rssi
val distance = calculateDistance(rssi, -59) // -59 是该 Beacon 的 1米参考 RSSI
if (distance < 2.0) { // 距离小于2米
// 触发应用逻辑,例如显示通知
showNotification("您已进入店内!")
}
}
}
// 开始扫描
scanner?.startScan(listOf(filter), ScanSettings.Builder().build(), callback)
// 停止扫描
// scanner?.stopScan(callback)
应用场景举例
Beacon 技术的应用非常广泛,核心都是基于位置的触发服务。
- 零售业:
- 个性化推送: 当顾客走过某货架时,App 推送该商品的折扣信息或详情。
- 导航导购: 在大型商场内,根据 Beacon 信号为顾客提供室内导航,找到特定店铺。
- 智能试衣间: 顾客进入试衣间,试衣间内的 Beacon 触发 App,展示该衣服的搭配建议或允许呼叫服务员。
- 博物馆与展览:
- 语音导览: 当游客靠近某件展品时,App 自动播放关于该展品的介绍音频。
- 互动体验: 通过扫描展品 Beacon,可以解锁 AR(增强现实)内容,让展品“活”起来。
- 会场与活动:
- 签到与会务: 参会者进入会场时自动签到,或在手机上显示会议议程。
- 社交互动: 基于邻近性,推荐可能认识的人,帮助参会者社交。
- 智慧办公:
- 会议室预订: 当人进入会议室时,门口的 Beacon 自动在日历上创建或更新会议状态。
- 资产追踪: 将 Beacon 贴在设备上,通过 App 查找设备位置。
- 交通与物流:
- 公交到站提醒: 当公交车接近站台时,站台的 Beacon 向乘客手机发送“车辆即将到达”的通知。
开发注意事项与挑战
- 功耗问题:
- Beacon 端: 优化广播间隔可以延长电池寿命。
- 手机端: 持续扫描 BLE 会非常耗电,最佳实践是使用前台服务,或者利用地理围栏 技术,当用户进入大概的地理区域时,才启动 Beacon 扫描,离开时停止。
- 距离估算不准:
- RSSI 易受环境干扰,不要依赖它来做精确定位,而是用来判断“相对远近”和“进入/离开”状态。
- 系统兼容性:
iOS 和 Android 对 BLE 的支持、权限管理和后台处理机制不同,需要分别进行适配和测试。
- 用户隐私与权限:
扫描 BLE 需要位置权限,这在最新的 Android 和 iOS 版本中管理得非常严格,App 必须有合理的理由向用户申请此权限,并清晰告知用途,否则很容易被拒绝。
- 干扰与拥堵:
在 Beacon 密集的区域(如大型展会),多个 Beacon 信号可能会相互干扰,选择合适的广播信道和功率可以缓解此问题。
实现一个 Beacon 应用,本质上就是搭建一个“信号发射-接收-响应”的闭环系统。
- 发射端: 使用低成本的 BLE 硬件,配置好唯一的身份信息(UUID/Major/Minor)并持续广播。
- 接收端: 开发一个手机 App,在合适的时机扫描这些信号,解析身份,根据信号强度判断距离,并据此触发有价值的用户交互。
虽然技术本身不复杂,但要打造一个成功的 Beacon 应用,关键在于精心的场景设计、良好的用户体验和稳健的后台逻辑。
