1.什么是服務
藍牙通信中,我們就是需要對各個服務中的特征值進行交流,現在嘗試自定義一個服務。
2.創建TEMProfile.c、TEMProfile.h
這是服務的主體文件。
其里面大致無非是定義特征值,創建讀寫值的函數,注冊函數,增添服務函數,以及包裝一些回調函數。
具體如下。
(1)所有定義的變量其實都是和特征值相關的,具體詳見上篇文章:http://www.cnblogs.com/asam/p/6535374.html
(2)創建函數
需要創建的函數如下:
全局函數:
extern bStatus_t TEMProfile_GetParameter( uint8 param, void *value); extern bStatus_t TEMProfile_SetParameter( uint8 param, uint8 len, void *value); extern bStatus_t TEMProfile_RegisterAppCBs( TEMProfileCBs_t *appCallback); extern bStatus_t TEMProfile_AddService( uint32 services );
本地函數:
static uint8 TEMProfile_ReadAttrCB(uint16 connHandle, gattAttribute_t *pAttr,uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); static bStatus_t TEMProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, uint8 *pValue, uint8 len, uint16 offset ); static void TEMProfile_HandleConnStatusCB( uint16 connHandle, uint8 changeType );
==小注解===============================================================================
其中讀寫的四個函數在此前已經見過。
這兩個回調函數 TEMProfile_ReadAttrCB(),TEMProfile_WriteAttrCB(),是封裝在一起的。
跟蹤下去,發現其是在ADDService函數中被調用,這個函數是一開始任務初始化時,調用的。
故猜想,大概是這個回調函數的指針在初始化增添服務的時候,已經被記錄,當通信時其他設備請求讀寫這個服務時才調用到兩個函數。
======================================================================================
除了四個認識的,還有兩個服務初始化用的函數
bStatus_t TEMProfile_RegisterAppCBs( TEMProfileCBs_t *appCallback);
bStatus_t TEMProfile_AddService( uint32 services );
這兩個在任務初始化時,被調用。
前者調用的是在應用層寫的。具體后面再講。
3.應用層的相關代碼
(1)添加頭文件 #include "XXXprofile.h"
(2)服務初始化
在應用層simpleBLEPeripheral.c中的SimpleBLEPeripheral_Init()函數中,增添
1 //Templete_Service 2 TEMProfile_ADDService(GATT_ALL_SERVICES); 3 // Set the TEMProfile Characteristic Values 4 5 uint8 TEMProfile_Char1Vaule=1; 6 uint8 TEMProfile_Char2Value[TEMPROFILE_CHAR2_LEN]="2017.03.11\0"; 7 TEMProfile_SetParameter( TEMPROFILE_CHAR1, sizeof(uint8), &TEMProfile_Char1Vaule ); 8 TEMProfile_SetParameter( TEMPROFILE_CHAR2, TEMPROFILE_CHAR2_LEN, TEMProfile_Char2Value ); 9 10 //register 11 VOID TEMProfile_RegisterAppCBs(&simpleBLEPeripheral_TEMProfileCBs);
這時就用到了上面說的兩個函數。
TEMProfile_RegisterAppCBs是注冊回調函數。simpleBLEPeripheral_TEMProfileCBs()在WriteAtrr中被調用。被調用的那個函數的含義是當特征值變化時則做出相應動作。但具體依然不理解。
(3)定義回調函數
1 static void simpleProfileChangeCB( uint8 paramID ) 2 { 3 uint8 newValue; 4 5 switch( paramID ) 6 { 7 case SIMPLEPROFILE_CHAR1: 8 SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, &newValue ); 9 10 #if (defined HAL_LCD) && (HAL_LCD == TRUE) 11 HalLcdWriteStringValue( "Char 1:", (uint16)(newValue), 10, HAL_LCD_LINE_3 ); 12 #endif // (defined HAL_LCD) && (HAL_LCD == TRUE) 13 14 break; 15 16 case SIMPLEPROFILE_CHAR3: 17 SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR3, &newValue ); 18 19 #if (defined HAL_LCD) && (HAL_LCD == TRUE) 20 HalLcdWriteStringValue( "Char 3:", (uint16)(newValue), 10, HAL_LCD_LINE_3 ); 21 #endif // (defined HAL_LCD) && (HAL_LCD == TRUE) 22 23 break; 24 25 default: 26 // should not reach here! 27 break; 28 } 29 }
(4)包裝一下回調函數
1 static TEMProfileCBs_t simpleBLEPeripheral_TEMProfileCBs = 2 { 3 TEMProfileChangeCB 4 };
至此,完成一個服務的建立