BLE4.0教程三 自定義服務(CC2541)


 

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 };

 

 

 

 

 

至此,完成一個服務的建立


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM