type
status
date
slug
summary
tags
category
icon
password
试着写一篇案例分析,可能有些地方有问题后续会慢慢修改
1.1. 简介功能
这是一个 iBeacon 定位示例。
iBeacon 技术主要应用于室内定位和导航、基于位置的广告推送以及客户行为分析等场景。
iBeacon 广播数据包包含以下关键信息:
- 主 UUID:用来标识一组 iBeacon,比如一整个连锁店的标识。
- 可变 UUID:用来区分不同的具体设备,比如某个具体店铺的设备。
- Major 和 Minor:再进一步细分场景,可能用来标识某个楼层或者某个区域。
- 信号强度 (RSSI):这个值可以帮助判断用户离这个 beacon 的距离。"
信号强度(Measured Power):这个值用于确定设备与Beacon的距离。通过比较广播信号的强度(RSSI)和Measured Power,应用可以估算出用户设备与Beacon的距离。
结合实际应用举例,比如博物馆的某个展厅(主 UUID),里面的特定展品(可变 UUID),不同展品的信息用 Major/Minor 来区分。
1.2. 软硬件平台
硬件平台:nordic的nrf5x系列开发板nrf52832
软件平台:采用的是nrf5x系列芯片的RT-Thread嵌入式系统工程,使用了nimble软件包
1.3. 试验
1.3.1. 试验板
1.3.2. 程序配置设置
环境准备:
RTThread BSP源码:https://www.rt-thread.org/page/download.html
RT-Thread开发辅助工具Env:https://www.rt-thread.org/page/download.html
下载好rtthread的源码和工具到电脑上
打开RTThread源码里对应的nrf52832 bsp文件夹\rt-thread\bsp\nrf5x\nrf52832
打开env配置工具
在工程中右击选择ConEmu Here
输入menuconfig进入配置界面
来到开启nimble的选项这里回车打开
然后按照我的选项路径来到nimble的配置页面
打开本次实验用到的实例beacon
1.3.3. 配置编译
完成配置后按ESC返回,会弹出一个对话框询问是否保存,按下键盘的Y就可以了
然后输入scons -j4就会开始编译了(-j的参数取决于电脑cpu的线程数,比如32个线程可以用-j32)
按下回车等待编译完成,然后就可以开始下载程序到开发板上了
1.3.4.下载程序
下载程序之前需要提前准备好vscode以及Cortex-Debug拓展
然后关闭vscode窗口,在scons里输入code .就能在bsp项目路径的文件夹里来打开vscode
插上开发板,来到运行和调试里开始下载程序
下载到开发板后会自动运行并停在main函数上
这时点击全速运行,程序就可以正常运行了
由于实例默认是需要以命令的形式开启的,所以还需要在串口软件里输入命令,设置好板子的串口以及115200波特率就可以看到输出信息了
1.3.5. 手机连接验证
手机端下载nRF Connect工具。下载地址是
打开手机蓝牙功能,打开该app,搜索到ibeacon
1.4. 软件结构
1.5. 程序
RT-Thread启动后,首先会自动运行初始化函数nimble_port_rtthread_init,然后需要通过串口终端手动启动iBeacon任务。
本文将以iBeacon案例为主进行分析。
iBeacon任务主要完成两项工作:设置广播数据包并开始广播
其中,设置和开始广播数据包的功能被封装在名为ble_app_on_sync的同步回调函数中。
当蓝牙主机堆栈与控制器同步完成后,
ble_app_on_sync
函数将被调用,以便执行后续的初始化步骤。1.5.1. 初始化函数
这部分代码实现了NimBLE蓝牙协议栈的基础初始化过程,包括事件队列、主机栈和控制器的初始化,为后续的蓝牙通信功能提供必要的运行环境。
1.5.2. ibeacon主要的功能函数
ble_app_on_sync是一个蓝牙同步回调函数,当蓝牙主机堆栈与控制器同步完成后被调用,负责设置随机地址并启动iBeacon广播。
总结归纳
分析比较浅,后续可能还会在整理一遍
有关题目或文章的问题,欢迎您在底部评论区留言,一起交流~
- Author:小彦同学
- URL:https://alicization.site/article/2024/11/25/148aaa90-4859-8087-b370-eafea5e533be
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!