1.简介
第一部分开篇还是要说一下资源与开发环境。
目前使用的是keil5,使用keil5则需要下载相应的pack包才能编译程序。
资源:
1.pack包:链接
2.nrfgo studio:链接
3.蓝牙协议栈:链接
需要ARM.CMSIS.4.5.0的包,也是在pack包中下载的,为了防止网站屏蔽,把网址列出来:
http://www.keil.com/dd2/Pack/#/third-party-download-dialog%5D(http://www.keil.com/dd2/Pack/#%2Fthird-party-download-dialog
2.程序下载
由于是用的带蓝牙协议栈的代码,而nrf芯片是将协议栈与app代码分开存放的,所以需要分别下载他们的代码。
先将协议栈代码烧写进去,可以从sdk中找到这样的目录结构:
F:\nrf52832\nRF5_SDK_15.0.0_a53641a\components\softdevice\s132\hex
里面包含的hex文件就是协议栈的代码了。
而app可以直接在keil工程中用swd/jtag烧写进去。
3.开发步骤
按照新手的角度,可以按照如下步骤进行开发:
1.参照sdk的基础工程.
2.添加led灯亮灭的功能(基于蓝牙控制)
3.添加串口功能(基于蓝牙控制)
4.进行更大的工程开发
4.实际开发
4.1 uuid
由于开发LED控制程序是一个私有服务,这个私有服务是需要包含profile和服务的,每一个服务都有一个uuid,共128bit,也就是16bytes。目前有蓝牙技术联盟定义了一个基本的uuid,为了简化,所以只使用了其中的16bit。
所以,可以照搬,先生成一个128bit的uuid,然后再使用其中的16bit,区别于各个不同的服务。这个uuid可以使用nRFgo studio生成。
4.2 属性
属性可以包含如下:
1.写
2.没有回应的写
3.读
4.通知:客户端发请求给服务器,不需要服务器回应响应
5.指示:客户端发送请求给服务器,需要服务器返回响应
4.3 编程
4.3.1 服务添加
由于增加的led灯点亮熄灭功能也是一个服务,所以需要在main()中services_init()里面添加自己的私有服务。
可以先不区别是SIG定义的服务还是私有服务,可以直接添加自己想要实现的效果的代码。
在代码中的具体步骤是:
1.添加服务
2.将属性添加到服务中
这些步骤其实可以从nRF Connect工具的界面中找到线索。
5.基础知识
5.1 蓝牙设备
蓝牙设备分为广播者,观察者,外围设备与中央设备。区别如下:
设备 | 备注 |
---|---|
广播者 | 广播发送者,不是可连接的的设备 |
观察者 | 扫描广播,不能够启动连接,例如 usb dongle抓包器 |
外围设备 | 广播发送者,是可连接的设备,在单一链路连接时作为从机 |
中央设备 | 扫描广播并启动连接,在单一或者多链路层连接时作为主机,支持3个同时连接 |
5.2 广播
蓝牙的广播有2种包名称,1种是广播包,1种是响应包。响应是可选的。
5.3 信道
对于BLE设备,广播有3个广播信道,分别为37、38、38。对应的也有数据信道,共有37个。
5.4 蓝牙地址
蓝牙地址有3种类型,分别为public device address、random device address。
public device address其实相当与mac地址,是需要向ieee申请的。
random device address分为static device address和private device address,private device address分为non-resolvable private address和resolvable private address。
5.5 usb dongle(抓包)
通过抓包,可以知道蓝牙传输了什么数据,方便开发。
注意使用dongle,需要先安装驱动,驱动名称为cebal驱动。
然后再pc上安装Smart Packet Sniffer软件,为了区分开某一个蓝牙设备,可以使用display filter中的过滤功能来过滤数据。
需要分析几种类型的广播含义:
Adv PDU Type | 含义 |
---|---|
ADV_IND | 可以建立连接的广播 |
ADV_DIRECT_IND | 快速广播,最长发射间隔1.28s |
ADV_NONCONN_IND | 不能建立连接的广播信号,ibeacon类似这种 |
ADV_SCAN_IND | 扫描帧,由scanner发出的 |
ADV_SCAN_REQ | 扫描请求帧,由sanncer发出请求更多广播数据 |
ADV_SCAN_RSP | 为ADV_SCAN_REQ的回应 |
然后是AD_type分析:
type | meaning |
---|---|
0x01 | 标志 |
0x03 | 完整的16位的uuid |
0x09 | 完整的local name |
0x19 | 蓝牙外观appearance |
标志 (位) | 含义 |
---|---|
bit0 | LE有限发现模式 |
bit1 | LE普通发现模式 |
bit2 | 支持BR/EDR |
bit3 | 对控制器同时支持LE和BR/EDR |
bit4 | 对主机同时支持LE和BR/EDR |
bit5~7 | 保留 |
6.问题解决
1.RTE\Device\nRF52832_xxAA\system_nrf52.c(29): error: #5: cannot open source input file "nrf_erratas.h": No such file or directory
该问题出现的前提是环境:pack 8.29.0,这个时候需要在keil5中将该pack卸载并且删除,然后重新去编译整个项目。
网友评论