跳转至

IoT—BLE

IoT(Internet of Things)——BLE(Bluetooth Low Energy)

BLE(蓝牙低能耗)是一种2.4G无线技术,始于蓝牙V4.0版本,旨在实现低功耗和短距离的通信。其主要特点包括:

低功耗:BLE设计为超低功耗无线技术,适合需要长时间运行的设备。

快速连接:与经典蓝牙相比,BLE在搜索和连接速度上更快。

应用广泛:BLE被广泛应用于智能家居、健康监测等领域。

一、BLE 低功耗蓝牙协议栈

低功耗蓝牙协议栈预备知识

Host

Controller

二、BLE 低功耗蓝牙开发工具

低功耗蓝牙协议栈入门(四)空中抓包 (WireShark + nRF Sniffer)

Nordic nRF52840 sniffer

NORDIC 官方提供的蓝牙抓包方法,优点就是便宜!整套硬件成本不超过 100RMB,比公司 30W 的 ellisys 专业蓝牙分析仪要便宜得多了。缺点就是在嘈杂的蓝牙环境下,抓包比较困难,但是在家里蓝牙设备不多的情况下还是可以用用的。适合初学者入门学习蓝牙协议栈的数据流!

推荐购买亿佰特EByte的nRF52840 sniffer,比较稳定

如果买的nRF62840没有固件。NORDIC 官网有英文教程文档会介绍如何将你的开发板刷成蓝牙抓包器

WireShark 抓包软件

wireshark

软件配置步骤简述:

  1. python3.7及以上的环境

  2. wireshark环境配置

    NORDIC 官网下载配置文件

    nrf_sniffer_for_bluetooth_le_4.1.0/extcap 目录运行命令: python -m pip install -r requirements.txt

    将 nrf_sniffer_for_bluetooth_le_4.1.0/extcap 目录里的内容原封不动的拷贝到 Wireshark 安装目录里的 extcap 下。

    将 Profile_nRF_Sniffer_Bluetooth_LE 拷贝到wireshark/profiles文件夹下

  3. nRF52840驱动CP2102

TLSR825X

开发建议

TelinkSDK和AiThinkerSDK相互翻看,TelinkSDK为主,AiThinkerSDK为辅

TelinkSDK是官方的,相比AiThinker这种代理商,代码更权威更完善。比如单连接SDK Demo,多连接SDK Demo都配有官方说明文档。能学得更深入。

AiThinker是有AT固件的Demo,最开始用BLE都是AT指令开发的,比较熟悉,可以固件AT指令顺藤摸瓜熟悉功能。

TLSR825X——开发IDE

!!!注意:Telink IDE和Telink Studio是有区别的,TelinkIDE针对TLSR8(例如TLSR8258),而TelinkStudio针对TLSR9

IDE for TLSR8 Chips

BDT Burning and Debugging Tools for all Series

而TLSR8不像TLSR9支持调试,所以TLSR8只能用print打印来交互调试,故编写UART交互对于TLSR8开发是极为重要的。

下面TelinkSDK中,有对于UART交互部SDK开发的着重介绍。这是对TLSR8开发所必须的部分。

泰凌软件文档 Mkdocs

TLSR825x Series - Telink wiki

多连接SDK 4.0.1.3 patch003

!!!注意:Telink的文档更新速度并不快,例如多连接文档是对4.0.1.x的SDK说明,目前的4.0.2.x并不适用。所以github/gitee仓库应该选择早些的发行版(4.0.1.x)。

  • 使用 4.0.1.x SDK开发UART DMA交互接口

    只需要引用b85m_ble_sdk / vendor / common / common_dbg.c即可

    只需要在app_config.h中UART_LOW_POWER_DEBUG_EN置为1即可

    // 多连接SDK 4.0.1.3
    // tc_ble_sdk/ b85m_ble_sdk / vendor / common / common_dbg.c
    #if (UART_LOW_POWER_DEBUG_EN)
        #if (MCU_CORE_TYPE == MCU_CORE_9518)
        //  #define UART0_DMA_CHANNEL_TX            DMA4
        //  #define UART0_BAUDRATE                  1000000  //115200
    
        //  int lp_uart_init = 0;  //attention: can not be retention data !!!
        //  void low_power_uart_debug_init(void)
        //  {
        //      uart0_init(UART0_BAUDRATE);
        //      uart_set_tx_dma_config(UART0, UART0_DMA_CHANNEL_TX);
        //      uart_clr_tx_done(UART0);
        //      dma_clr_irq_mask(UART0_DMA_CHANNEL_TX,TC_MASK|ABT_MASK|ERR_MASK);
    
        //      lp_uart_init = 1;
        //  }
        #elif (MCU_CORE_TYPE == MCU_CORE_825x || MCU_CORE_TYPE == MCU_CORE_827x)
            #define UART_BAUDRATE                   1000000
            #define UART_TRANS_BUFF_LEN             32
    
            __attribute__((aligned(4))) unsigned char uart_trans_buff[UART_TRANS_BUFF_LEN] = {0x0c,0x00,0x00,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc};
    
            int lp_uart_init = 0;  //attention: can not be retention data !!!
            void low_power_uart_debug_init(void)
            {
                reg_dma_uart_tx_size = UART_TRANS_BUFF_LEN >> 4;//set DMA TX buffer size.
                uart_gpio_set(UART_TX_PB1, UART_RX_PB7);// uart tx/rx pin set
                uart_reset();  //uart module power-on again.
                uart_init_baudrate(UART_BAUDRATE, CLOCK_SYS_CLOCK_HZ, PARITY_NONE, STOP_BIT_ONE);
                uart_dma_enable(0, 1);  //uart data in hardware buffer moved by dma, so we need enable them first
                dma_chn_irq_enable(FLD_DMA_CHN_UART_TX, 1);     //uart Tx dma irq enable
    
                lp_uart_init = 1;
            }
        #endif
    #endif
    

    但源文件中low_power_uart_debug_init(void),并不满足我们的debug需求,稍作修改。。

    #define UART_BAUDRATE                   115200
    #define UART_TRANS_BUFF_LEN             128
    
    __attribute__((aligned(4))) unsigned char uart_trans_buff[UART_TRANS_BUFF_LEN] = {0x0c,0x00,0x00,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc};
    
    int lp_uart_init = 0;  //attention: can not be retention data !!!
    void low_power_uart_debug_init(void)
    {
        reg_dma_uart_tx_size = UART_TRANS_BUFF_LEN >> 4;//set DMA TX buffer size.
        uart_gpio_set(UART_TX_PB1, UART_RX_PB7);// uart tx/rx pin set
        uart_reset();  //uart module power-on again.
        uart_init_baudrate(UART_BAUDRATE, CLOCK_SYS_CLOCK_HZ, PARITY_NONE, STOP_BIT_ONE);
        uart_dma_enable(0, 1);  //uart data in hardware buffer moved by dma, so we need enable them first
        dma_chn_irq_enable(FLD_DMA_CHN_UART_TX, 1);     //uart Tx dma irq enable
    
        lp_uart_init = 1;
    }
    

    再添加上uart_send、dma_receive_fifo、uart_dma_irq_handle,和receive_fifo解析函数,就满足了我们的debug需求

TLSR825X——AiThinker SDK

TB 系列模组专题

Ai-Thinker-Open Telink_825X_SDK

!!!注意:请参考 README.MD 与 start_windows.MD,另外Aithinker的SDK很久没更新维护了,所以还是以TelinkSDK为主