第一周
-
完成环境搭建并下载NCS v2.4.0
-
成功编译并下载peripheral_uart例程并在5340DK板进行验证
-
初步了解BLE广播以及建立连接的流程
根据自己理解,在周报中回答下面问题:
例程中5340DK板是如何通过蓝牙发送数据给手机的?
蓝牙连接后,手机接收5340DK板发送的蓝牙数据前需要做什么?
手机如何通过蓝牙发送数据给5340DK板的?
Q1:创建了一个NUS服务,并在该服务下创建一个TX Characteristic,蓝牙板写入UART数据,属性为notify
Q2:发现NUS服务,搭建TX通道Enable Notifications 使能5340DK板发送数据的蓝牙特征值通知
Q3:蓝牙板创建一个RX Characteristic,写属性,用于接收主机发送的UART数据
第二周
- 通过学习相关例程文档,对BLE的广播、连接和协议栈等概念有初步的了解
- 分析peripheral_uart例程,并阅读相关文档和博客,NUS服务有TX、RX两个特征,TX、RX包含declaration attribute和value attribute,TX多了一个CCCD用于notify
- 通过分析代码初步了解了该例程收发数据的通信流程,对UART传输、服务和特征的概念有了更清晰的认识
第三周
-
了解了广播的类型以及广播数据的数据包格式AD Structure = AD Len+AD Type+AD Data
-
蓝牙项目中的广播参数以及广播数据、扫描响应数据的设置等
-
在peripheral_uart例程进行动态切换广播间隔,上电或者BLE断连后快广播间隔100ms,通过zephyr延时工作队列1分钟后切换为慢广播间隔1S,建立连接后广播停止,并得到验证
-
设置蓝牙全名xxx Test放在扫描响应数据包中
第四周
- 参考蓝牙项目的HCI CMD设置蓝牙发射功率和Mac地址,蓝牙发射功率越小,RSSI越差;
- 简单学习线程的使用,使用K_THREAD_DEFINE创建线程并通过debug了解Zephyr系统上电复位后的启动流程,确定了K_THREAD_DEFINE是在哪边创建的;
首先执行中断向量表vector_table.S中的第一个函数reset,然后进入reset.S汇编调用C函数z_arm_prep_c(),重新分配中断向量表,清除.bss段全局未初始化的变量为0,将全局已初始化的变量从ROM拷贝到RAM中等,最后执行z_cstart(),运行初始化级别为INIT_LEVEL_EARLY的初始化函数,然后进行日志、静态设备的初始化,运行初始化级为INIT_LEVEL_PRE_KERNEL_1、INIT_LEVEL_PRE_KERNEL_2的初始化函数,最后就是创建main函数,在进入main函数之前,还要初始化级别为INIT_LEVEL_POST_KERNEL和INIT_LEVEL_APPLICATION,以及静态初始化线程,最后到达main函数; - 简单学习了信号量、事件以及消息队列的使用,将zephyr定时器回调同步到自定义的Thread中处理,本需求只需要简单的同步和通信,比较适合使用信号量的方式;
在中断中使用这三种通信方式有什么条件? 在获取信号量资源、获取事件和消息队列中的消息时,应当立即返回设置为K_NO_WAIT
第五周
- 信号量大多用于控制对临界资源的访问;事件用于线程间通信和同步;消息队列用于在不同线程之间传递数据;
- 熟悉蓝牙项目中服务和特征值的创建;
- 通过BT_GATT_SERVICE_DEFINE创建了service和characteristic
第六周
-
创建特征值read一次计数加一,调用bt_gatt_attr_read,需要在创建特征值时给read开辟内存空间暂存;notify可以直接发送;
-
项目中是通过handle值找到attr进行notify;
-
理清了特征值各个属性read\write\notify的关系与基本使用;
-
简单了解了配对、绑定的一些概念和流程。
第七周
- 调试peripheral_bms例程,通过nrfconnect绑定并通过BMS服务发送指令删除绑定;
- 不删除绑定信息断开重连时从Flash中读取;发指令删除绑定重连会更新;
- 增加开发板已经与手机绑定,拒绝与另一台主机再次进行配对绑定;
- 配对及绑定的主要概念,目的:配对主要进行加密连接,认证设备,以及生成密钥;绑定是利用配对时生成的LTK进行蓝牙的连接加密;它们的主要目的是确保蓝牙设备之间的通信安全;
- 在配对绑定的基础上,通信数据如何防重放?重放:比如手机App传输给设备一条BLE开启指令进行打开,被第三方通过抓取空中包的方式获取到,虽然指令数据是加密的,但把同样的加密数据再次发给门锁
加时间戳,在收到指令时验证时间戳是否符合范围;或者只让指令只能执行一次
第八周
- 在peripheral_bms例程上添加长按按键3秒删除绑定信息;
- 手机单方面删除绑定信息再次配对时拒绝绑定;
- 简单学习了主从双方流程:扫描、扫描信息过滤、发起连接
第九周
学习了主从双方MTU交换、协商连接参数等;
学习了蓝牙dongle做主机使用的基本指令并与perpherial_uart自建服务进行通信;
根据dongle文档自行焊接并配置为主机模式;
主机扫描参数的设置,连接间隔决定了主从设备之间交换数据的频率,不需要频繁交换数据时拉长连接间隔降低功耗;
主从机进行MTU交换,选取较小的作为MTU;MTU越大会提高BLE通信效率但会增加功耗;
跳过扫描过程通过bt_conn_le_create MAC地址快速连接;