目前博主主要在开发IoT相关的项目,在室内IoT领域用到最多的通讯方式无非就是Wi-Fi和BLE蓝牙。而目前市面上有一些芯片,它既支持Wi-Fi也支持BLE,这种芯片也就是我们常说的Combo芯片,像平头哥的TG7100C,上海博通的BL2028N,都是这一类芯片。
蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低功耗和成本。(参见:百度百科)
在 BLE 系统中不仅仅是物理层和硬件内容,根据整个 BLE 从上到下,大致分为了 Profile,Host,HCI,Controller 以及 硬件部分的 Baseband 和 RF。
两个 BLE 通信,从逻辑上来看,是每个层的单独通信,从数据的流向来看,发送是自上而下,数据接收是自下而上。
Profile:主要是根据不同的应用场景,制定了最上层的协议交互。比如,心率的 Profile,电池电量检测的 Profile 等。
Host:为上层提供接口支持,自身维护了一些软件层次的协议和加密流程等等控制,纯软件行为。
HCI 的全称是:Host Interface Controller,是 Host 和 Controller 通信之间的接口。那么问题来了,Host 与 app 之间是直接的 Function call,那为啥 Host 与 Controller 之间要专门的定义两层软件之间的通信协议呢?这就要从 BLE 的产品形态说起了。稍后呈现。
Controller:向上负责向 Host 汇报状态,向下,接收 Host 的指令,与 Baseband 交互,协调、控制、管理硬件资源。
Modem:负责调制解调
RF:收发机负责接收/发送空中的数据包。
HCI 的全称是:Host Interface Controller,是 Host 和 Controller 通信之间的接口。
更为详细的介绍,可以参考:https://cxymm.net/article/zhoutaopower/96477626
实战开发中,经常遇到BLE协议栈抛上来的ErrorCode,如果你不了解其中的含义,那么你将不能更进一步地去分析和解决问题。
这些ErrorCode其实是BLE协议中已经定义好的,具体如下所示:
#define BLE_HCI_STATUS_CODE_SUCCESS 0x00 #define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01 #define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 #define BLE_HCI_AUTHENTICATION_FAILURE 0x05 #define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06 #define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07 #define BLE_HCI_CONNECTION_TIMEOUT 0x08 #define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C #define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12 #define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13 #define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14 #define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15 #define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16 #define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A #define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E #define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F #define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 #define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 #define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 #define BLE_HCI_INSTANT_PASSED 0x28 #define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29 #define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A #define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 #define BLE_HCI_CONTROLLER_BUSY 0x3A #define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B #define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C #define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D #define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E
欢迎关注我的github仓库01workstation,日常分享一些开发笔记和项目实战,欢迎指正问题。
同时也非常欢迎关注我的CSDN主页和专栏:
【CSDN主页:架构师李肯】
【RT-Thread主页:架构师李肯】
【C/C++语言编程专栏】
【GCC专栏】
【信息安全专栏】
【RT-Thread开发笔记】
【freeRTOS开发笔记】
【BLE蓝牙学习开发笔记】
有问题的话,可以跟我讨论,知无不答,谢谢大家。