蓝牙技术(BLE)与开发点滴总结

一、名词缩写
1)VCP(虚拟串口)
2)CDC(通信设备类)
3)FCC:美国的联邦通信委员会、欧洲的电信标准委员会(ETSI)
4)RSSI :Received Signal Strength Indication 
5)OSAL:OS Abstraction layer
6)SNV:simple non-volatile
7)SBP:Simple BLE Peripheral
8)NPI:network processor interface
9)SVC:Service discovery
10)LTK : long-term key
11)pairing/bonding : 配对与绑定
 
二、蓝牙(一种近距离无线技术)
蓝牙技术:
1、从机、主机、主从一体机(同一时间只能充当一种角色,通常由AT指令进行切换),串口透传模块;
2、HID蓝牙专用协议,应用在蓝牙耳机(传统蓝牙协议:A2DP profile)、蓝牙键盘、蓝牙鼠标等应用领域;
3、双模(BLE+传统蓝牙)与单模(指传统蓝牙或低功耗蓝牙) ;
4、双模蓝牙:发送:+-10dbm  接受:-90dbm;
5、低功耗蓝牙:传输速率100kb/s   传统蓝牙:传输速率3M/s   WIFI:传输速率50M/s
6、OAD的原理:采用BIM(bootloader)引导新固件和旧固件在flash上的位置,并根据最新bin文件的版本号作为系统的启动;
7、无线通信工作频段:Zigbee、蓝牙以及 WIFI 标准都是工作在 2.4GHz 频段的无线通信标准;
8、采用自适应调频技术;
 
协议栈:
1、协议栈:是传输协议的软件集合(基于操作系统,一般是FreeRTOS),一般厂商会封装重要的底层协议,只提供最外层的开发接口;
2、协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发;协议栈是协议的具体实现形式,通俗的理解就是用代码实现的函数库。
3、所谓的协议栈数据实质就是一种标准的通讯协议,它应该可以被组织成一个清晰的表格;
4、协议栈中profile文件定义了各种应用场景;
    a、一个或多个service组成;
    b、service由一个或多个characteristic(结构体)组成;
 
BLE规范:
1、BLE规范中定义了两个十分重要且基本的配置文件:
    1) GAP(generic access profile):负责设备访问模式和进程,包括设备发现,建立连接,终止连接,初始化安全特征和设备配置。
    2) GATT(generic attribute):用于已连接的蓝牙设备之间的数据通讯。
2、GATT服务器和GATT客户端,它们完全独立于GAP的角色。提供数据的设备称为GATT服务器,访问GATT服务器而获得数据的设备称为GATT客户端。
3、设备的GAP和GATT的角色都可能在数据的交换过程中改变,因此,这个文件应该包含广播的种类、所使用的连接间隔、所需的安全等级等信息;
4、特性的性质:写  没有回应的写  读  通知  指示
5、通知和指示性质允许GATT服务器在其某个特性改变的时候对GATT客户端进行提醒,通知和指示之间不同之处在于指示有应用层上的确认,而通知没有。
6、蓝牙技术联盟所用的基本UUID不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用另外完整的128位UUID;
7、先增加一个特定的基本UUID(128位),再定义一个16位的UUID(类似于一个别名),再加载在基本UUID之上;
8、集中器发送一个连接请求来发起连接之前,必须接收到一个广播数据包,外围设备发送一个广播数据包之后一小段时间内只监听连接请求;
9、蓝牙最多只能一次(在一次连接中)发送20个字节的应用数据;
10、在一个连接中,除了广播信道,设备间在频带的所有信道中进行通信。当然对于应用层,这是完全透明的;
11、EEE802.15.4-2006指定 16个通道,它们位于 2.4GHz频段之内。步长为 5 MHz,编号为 11~26;
 
蓝牙与Zigbee的区别比较:
2、RF调制方式不一致;
3、Zigbee:发送的比特流->比特到符号->符号到芯片->O-QPSK调制器->已调制的信号到ADC;
4、加密功能(鉴权)Zigbee灵活一点(三种选择方式);
5、应为cc254x 与cc2530 都是同样的结构,仅无线不一样, 所以可以参考;
6、组网方式:BLE 网络可以点对点或者点对多点,一个 ble 主机可以连接多个(最多三个) ble 从机,组成星型网络,另外还有一种有广播设备和多个扫描设备组成的广播组结构,不同的网络拓扑对应不同的应用领域;
7、协调器、路由器、终端;组网十分灵活并且组网节点巨大;
 
蓝牙连接方式:
1、指定从机地址;  
2、随机连接(按照扫描到的从机列表顺序);
 
蓝牙广播类型:
1、蓝牙角色类型、密码类型、广播类型:https://blog.csdn.net/ljp1205/article/details/53698767
 
BLE设备角色:
1、peripheral  central :需要相互连接(心率计与手机)
2、broadercaster  observe : 不需要建立连接,采用广播模式传播和接收广播形式(温度传感器与温度显示屏);
 
蓝牙的三种蓝牙类型以及应用:
2、bluetooth BR/EDR(蓝牙耳机,车载蓝牙)
3、bluetooth smart(蓝牙低功耗BLE)
4、bluetooth smart ready (智能手机、平板)
 
 
二、项目开发实践杂记
1、基于协议栈,一般会做以下开发修改:
    a、添加串口打印、按键动作;
    b、、自定义消息;
    c、添加服务;
    d、自定义profile;//定义新的特征值
 
2、CC2540采用8051内核,与C51和其他单片机的区别,CC2541比40低功耗降低33%:
    a、IO口复位状态:配置引脚为具有上拉电阻的通用I/O输入。
    b、电源管理:使用不同供电模式的长电池寿命的低功耗应用运行。
    c、随机数发生器、AES协处理器:实现128位密匙的AES算法加密和解密数据;
    d、CC253x设备系列提供了一个IEEE802.15.4兼容无线收发器。 RF内核控制模拟无线模块。另外,它提供了MCU和无线设备之间的一个接口,这使得可以发出命令、读取状态、自动操作和确定无线设备事件的顺序。无线设备还包括一个数据包过滤和地址识别模块。
    e、128/256KB FLASH;
    f、RX、TX(128KB FIFO);
    g、帧过滤和源匹配(源地址匹配),采用128字节来存储本地地址信息;
    h、低位符号首先传输。 对于多字节域,低字节首先传输,除了与安全相关的域是高字节首先传输;
 
3、蓝牙天线设计:
    a、四种常用天线:http://www.elecfans.com/d/686538.html
 
1、蓝牙协议栈的开发重点在于熟悉应用接口,制定从机和主机的通讯流程去实现不同的应用;
2、profile 就是一系列服务(service)的集合;
3、初步了解OSAL的执行流程(比一般的RTOS系统实现的机制原理简单);
4、无论是协议栈(封装了起来,不开放源码)还是HAL、还是OSAL,都已经封装好常用的API接口;只要熟练练习即可;
5、基于系统的开发:实质就是清晰了解好该系统搭建好的框架以及组件(硬件驱动、应用API接口);善于修改和重用;
6、熟悉一个系统就是需要一点一滴地剖析这个系统本身的架构(循序渐进的过程);
7、如果是一个比较有经验的软件开发者,得到一份源码后,首先需要按照说明跑一跑,然后用代码对比工具做下对比,基本就了解别人做了什么修改了。
8、蓝牙协议栈跟IAR是有着对应关系的(实质上所有的开发平台都绑定相应的编译器(版本)进行开发的);
9、基于OSAL开发,只需要了解几个概念:任务、事件、消息机制、回调函数、HAL;
10、一些重要的开发工具:
    a、IAR:编程
    b、smart flash:烧写固件
    c、BLE device Monitor(直观)/Btool(高级模式):模拟蓝牙主机:实现连接、断开、读写服务操作(通过封装的HCI接口);
    d、studio:配置蓝牙射频寄存器(高级模式);
    e、packet sniffer:捕捉蓝牙空中信号;
    f、硬件: 1) CC debuger  2) 抓包器  3) sensor tag
11、蓝牙名称如何才能设置为中文名?  要转下URL格式就行
12、蓝牙低功耗的实现:1)硬件IO;  2)蓝牙协议栈低功耗模式;  3)连接参数;4)需要在OPTION里面设置(开启宏定义);
13、无线蓝牙透数据传均存在丢包率的问题,所以用户朋友们一定要做好应用层的数据校验。
14、密码连接是从机发起的;
15、重要的连接参数:
    a、connection interval;
    b、slave latency;
    c、supervision timeout;
16、服务端、客户端  主从机究竟是如何定义的?应用场合是? 连接后将会确定谁是GATT服务端 和GATT客户端,也可以同时处于这两种角色(主从一体);
17、TX FIFO储存器也位于RAM中?位于RAM中的XREG(1KB)  X FIFO存储器区域位于地址 0x6000到0x607F,所以是 128字节。尽管这一存储器区域用于 RX FIFO,
但是它不以任何方式保护,因此它在XREG存储区域中仍然是可以访问的。一般地,只有指定的指令能用于操作RXFIFO的内容。 RXFIFO一次可以包括多个帧
18、蓝牙连接后就不广播了      解决:采用L2CAP层或者真正的用户通讯数据进行通信;
19、蓝牙的连接、配对、绑定、通讯的数据在哪里,过程的源码实现?   解决:在协议层内部实现了(赋值过程不可见);
20、蓝牙的数据接收在某个地方实现?根据不同的状态,进入不同的处理函数?  解决:接收过程不可见,根据返回的结果进行相应的处理;
21、网路教程:
    a、一个简单的BLE应用:https://www.cnblogs.com/tan-v/p/4271579.html
    b、蓝牙BLE简单介绍:http://blog.sina.com.cn/s/blog_b4ce638e0102ux9v.html
    c、蓝牙新手常见问题:https://blog.csdn.net/feilusia/article/details/70238789
    d、蓝牙开发项目经验浅谈:https://blog.csdn.net/Jake_cai/article/details/53895737
    e、一主三从的项目实现:https://blog.csdn.net/hechao3225/article/details/53931748
22、蓝牙设备与手机通信不稳定现象调试 - 不同品牌/型号手机对蓝牙的兼容性也不一样(蓝牙普遍存在的通病)
    a、第一,抓取连接、交互那部分的打印信息,看是卡顿在哪个地方;
    b、第二,用蓝牙分析仪去抓取信息(专用仪器可以获取蓝牙在空中的所有通信过程);
 
 
四、其它蓝牙应用学习
1、按键例程比较完整体现系统的流转( 按键事件通过消息,通知应用程序处理按键事件 );
2、防止超长数据语句:
    a、numBytes = (osal_strlen(strTemp) > SIMPLEPROFILE_CHAR6_LEN) ? SIMPLEPROFILE_CHAR6_LEN : osal_strlen(strTemp);
3、UUID( 类似枚举的作用一样 )作为一个switch的一个判断分支,来确定是属于哪个服务(执行相应的函数);
4、蓝牙鼠标的实现(基于TI demo工程实现):
    a、蓝牙接受端完全不用修改(官方固件),发送约定的数据( 鼠标数据结构体 );
    b、主机端:主要对按键的处理:按键数据的产生处理、打包发送处理;
5、在进行蓝牙协议栈开发时,切记事件处理不能超过蓝牙的连接间隔,否则蓝牙会出现广播停止,连接断开异常;
6、开发板试验总结:
    a、iBeacon实质就是从机广播特定的数据;
    b、实现的蓝牙功能:主从一体、实现透传、掉电数据保存、自动重连;
    c、蓝牙透传实现函数(都是通过GATT的CHAR6进行读写):
            1)主机:GATT_WriteCharValue( 0, &AttReq, simpleBLETaskId );
            2)从机:SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR6,numBytes, buf );
            3)如果你发送的数据要超过 SIMPLEPROFILE_CHAR6_LEN, 那么最好的办法, 就是启动一个定时器,然后每定时器到, 就发送一段数据
    d、主机接受的关键代码: if( pMsg->msg.handleValueNoti.handle == simpleBLECharHd6/*0x0035*/)
     e、主机的接收和从机的发送都只是通过一个API实现的;
     f、匹配和绑定:从机发起验证密码请求给主机->主机输入密码,发送给从机->从机验证密码对或错->通过后进行MAC绑定,记录在内存中;
     g、AT指令和透传数据的区分: 然后根据当前的状态决定执行, 如果没有连接上, 就把所有数据当做 AT 命令处理, 如果连接;
     h、心率计的实现:
            1)采集pulse_sensor 的adc值,并将其转换成对应的数据结构,通过Notification传输到主机;
            2)需要构造GATT服务:HeartRate_AddService(GATT_ALL_SERVICE);
    i、蓝牙鼠标的实现:按键产生动作(哪个按键被按下,按下了多少,将这些数据放到结构体中去)->发送到USBDongle(烧写了原版TI的HID程序),实现控制蓝牙鼠标的功能;
            1)hidMouseSendReport(uint8 mouseStates, int8 micKeysX, int8 micKeysY);
            2)按下产生事件->释放也产生事件(同时上报); 连续按下( keyRepeated++,非连续则keyRepeated+1 )
            3)空中鼠标,区别是计算欧拉角算出( x , y )坐标;
    j、防丢器:蓝牙断线后报警(靠近会自动连接);
    k、魔方:mpu6050上传dmp数据(欧拉角和四元数据),APP进行解释演示;
            1)开发板端10ms读取一次mp输出,app 100ms读取一次开发板数据;
            2)安卓源码:
                    *readCharacteristic(读取开发板上的数据);
                    *onReceive(解释数据);
                    *getablePacket(显示图形函数);
    l、RGB调灯:
                    *灯泡是共阳极的,采用nmos管控制;
                 *手机端发现灯泡设备,自动连接;
                 *音乐律动功能;
    m、一主三从的实现(具有参考价值):
                主机端:
                1)设置主机最大连接数为3(最大也只能是3);
                2)自动连接设置(设置定时器->自动增加连接序号->连接);
                3)配置三个结构体用于存放三个不同的从机数据;
                4)数据的接受和发送;
                5)主机连接从机后就需要发现特征值handle (扫描回应、读数据回应等);
 
                从机端:
                1)设置连接参数;
                2)设置连接模式(无鉴权等待连接,鉴权连接);
                3)数据的接受和发送(通知、指示形式);
 
 
7、Notification相当于socket的udp传输,只管传输,不管是否对方接收到;
 
 
五、蓝牙选型
1、NORDIC   nRF52832
 
2、TI :CC2640
 
蓝牙技术(BLE)与开发点滴总结转存失败重新上传取消蓝牙技术(BLE)与开发点滴总结
 
 
 
六、结构/协议框图
1、内核:
蓝牙技术(BLE)与开发点滴总结转存失败重新上传取消蓝牙技术(BLE)与开发点滴总结
 
 
2、BLE标准协议栈:
蓝牙技术(BLE)与开发点滴总结转存失败重新上传取消蓝牙技术(BLE)与开发点滴总结
 
 
 
3、TI提供的协议栈:
蓝牙技术(BLE)与开发点滴总结转存失败重新上传取消蓝牙技术(BLE)与开发点滴总结
 
4、ATT:
蓝牙技术(BLE)与开发点滴总结转存失败重新上传取消蓝牙技术(BLE)与开发点滴总结
 
 
5、GATT(将ATT定义的Attribute实例化(根据各种不同的应用场景实化),提供给上层的profile使用):
蓝牙技术(BLE)与开发点滴总结转存失败重新上传取消蓝牙技术(BLE)与开发点滴总结