藍牙從機,顧名思義,就是一個藍牙從設備,可以不斷發送廣播等待與主機建立連接進行通信,建立連接后,可以通知主機,也可以收到主機發的信息,
一般使用BLE調試助手(安卓應用市場可下載),ios可使用Lightblue來進行調試通信等的基礎功能。
如果用Central例程來連接Peripheral例程的話,需要將Peripheral例程中宏BLE_MAC設置成TRUE,否則的話Peripheral例程使用自帶的MAC,與主機例程中的目標設備MAC不對應,主機不會發起連接。
首先講解一下Peripheral例程的藍牙收發接口吧,這樣的話比較方便上手,大多數需要修改的都在peripheral.c中修改,
從機給主機發送數據例程是通過一個一秒執行一次的tmos任務來實現的,接口函數如下:
藍牙從機的收發接口:
一、藍牙從設備例程(Peripheral例)發送藍牙數據:
tmos_start_task(Peripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
這個任務第一次調用是在藍牙連接后,因為不連接調用它也沒什么意義,
任務里會調用此藍牙發送函數performPeriodicTask();
二、藍牙從設備例程(Peripheral例)接收藍牙數據:
接收主機的數據也已經包裝好了,例程只打印輸出了一段標識,代表接收到數據了,可以自己添加處理下,
三、藍牙串口例程(BLE_UART)接收藍牙數據:
四、此例程藍牙發送數據的方式是將串口3收到的數據通過藍牙發送給主機,當然也可以自己調用notify函數發送實現。
藍牙主機的收發接口:
一、當主機是手機時,使用BLE調試助手:
二、當主機為CH573時:
藍牙主機例程(Central)接收藍牙數據:
藍牙主機例程(Central)發送藍牙數據:
此主機例程在不修改的情況下只適用於與Peripheral例程通信,原因是枚舉服務是針對Peripheral例程服務去寫的,
如果需要和別的從機通信可以將主機寫成像手機那樣枚舉從機的所有服務,獲取其handle進行通信,例程可發送郵件至hy@wch.cn獲取,
也可像主機例程這樣,已經知曉從機的UUID根據UUID去獲取handle進行通信。。
藍牙包大小修改:
在config.h文件中BLE_BUFF_MAX_LEN默認是27,此時默認的MTU只有23,一包數據最大20字節,
默認例程實際傳輸就寫的一個字節,可以修改gattprofile.h宏定義SIMPLEPROFILE_CHAR1_LEN為20,
如果想修改的再大一點的,那么有兩種方法,一種是主機發起交互,還有種是從機發起交互,
主機分三種:手機電腦平板等設備,沁恆的藍牙主機,其他廠商的藍牙主機,
首先需要將從機端代碼中BLE_BUFF_MAX_LEN可以直接修改到最大值251,
1.手機電腦平板等設備的話,直接通過軟件去配置即可,
ps后期加圖:在BLE調試助手右上角的三個點里面,
2.沁恆的藍牙主機的話,將主從的BLE_BUFF_MAX_LEN修改為251,此時在連接后,協議棧底層會交互MTU為247,SIMPLEPROFILE_CHAR1_LEN修改為244,
若是別的從機可以主機調用交互:
attExchangeMTUReq_t req;
req.clientRxMTU = 247;
GATT_ExchangeMTU(centralConnHandle, &req, centralTaskId);
3.其他廠商的主機,可以通過代碼實現。
從機發起交互:
步驟1:BLE_BUFF_MAX_LEN需要修改為251,
步驟2:在初始化函數Peripheral_Init()中添加GATT_InitClient();
步驟3:在藍牙連接后調用GATT_ExchangeMTU來修改MTU。
attExchangeMTUReq_t req;
req.clientRxMTU = 247;
GATT_ExchangeMTU(peripheralConnList.connHandle, &req, Peripheral_TaskID);