CC2540自己的配置文件

首先要指出,字段属性有notify的不能同时有read,write属性,别问哥,哥也不知道,反正我做的就不能notify,只能read,write。

分享的程序段第一字段有notify属性,第二字段read,write属性。

费话少说,看代码,H文件:

#ifndef LOCKER_H
#define LOCKER_H

#ifdef __cplusplus
extern "C"
{
#endif

#define SERVAPP_NUM_ATTR_SUPPORTED              (1+4+3)

// Simple Profile Service UUID
#define LOCKERPROFILE_SERV_UUID                 0xFFF0

#define LOCKERPROFILE_NOTIFY_UUID               0xFFF1
#define LOCKERPROFILE_NOTIFY_MAX_LEN            5  

#define LOCKERPROFILE_STREAM_UUID               0xFFF2
#define LOCKERPROFILE_STREAM_MAX_LEN            5  

#define SIMPLEPROFILE_SERVICE               0x00000001
/*********************************************************************
 * Profile Callbacks
 */
// Callback when a characteristic value has changed
typedef void (*app_input_cb_t)( uint16 uuid ,uint8 *pdata, int len);

/*********************************************************************
 * lockerProfile_AddService- Initializes the Simple GATT Profile service by registering
 *          GATT attributes with the GATT server.
 * @param   services - services to add. This is a bit map and can contain more than one service.
 * @param   cb - the function will be called, while service receive a message .
* return    always return SUCCESS
 */
bStatus_t lockerProfile_AddService( uint32 services ,app_input_cb_t cb);
/*
 * lockerProfile_AddService - Set a Simple GATT Profile parameter.
 *    uuid - which service's uuid as sender target
 *    len - length of data to right
 *    value - pointer to data to write.  This is dependent on
 *          the parameter uuid and WILL be cast to the appropriate 
 *          data type .
 */
bStatus_t locker_send( uint16 uuid,void *pdata , uint8 len);
/*
 * locker_Read - Get a Simple GATT Profile parameter by uuid.
 *    param - Profile uuid
 *    value - pointer to data to write.  This is dependent on
 *          the parameter ID and WILL be cast to the appropriate 
 *          data type .
*   return : return data length, if op' failse it'll return -1;
 */
int locker_Read( uint16 uuid, void *pdata );

#ifdef __cplusplus
}
#endif

#endif /* SIMPLEGATTPROFILE_H */

  C文件:

/*********************************************************************
 * INCLUDES
 */
#include "bcomdef.h"
#include "OSAL.h"
#include "linkdb.h"
#include "att.h"
#include "gatt.h"
#include "gatt_uuid.h"
#include "gattservapp.h"
#include "gapbondmgr.h"

#include "locker.h"
#include "stdio.h"

/*********************************************************************
 * GLOBAL VARIABLES
 */
// Simple GATT Profile Service UUID: 0xFFF0
CONST uint8 lockerSvrUUID[ATT_BT_UUID_SIZE] =
{ 
  LO_UINT16(LOCKERPROFILE_SERV_UUID), 
  HI_UINT16(LOCKERPROFILE_SERV_UUID)
};
// notify UUID: 0xFFF1
CONST uint8 lockerNotifyUUID[ATT_BT_UUID_SIZE] =
{ 
  LO_UINT16(LOCKERPROFILE_NOTIFY_UUID), 
  HI_UINT16(LOCKERPROFILE_NOTIFY_UUID)
};
// stream UUID: 0xFFF2
CONST uint8 lockerStreamUUID[ATT_BT_UUID_SIZE] =
{ 
  LO_UINT16(LOCKERPROFILE_STREAM_UUID), 
  HI_UINT16(LOCKERPROFILE_STREAM_UUID)
};
/*********************************************************************
 * LOCAL VARIABLES
 */
static app_input_cb_t app_input_cb = NULL;
/*********************************************************************
 * Profile Attributes - variables
 */
// locker Profile Service attribute
static CONST gattAttrType_t lockerProfileService = { ATT_BT_UUID_SIZE, lockerSvrUUID };

// locker Profile Notify Properties
static uint8 lockerNotifyProps = GATT_PROP_NOTIFY;
static uint8 lockerNotifyStream[LOCKERPROFILE_NOTIFY_MAX_LEN];
static uint8 lockerNotifyDesp[17] = "notify\0";
static gattCharCfg_t lockerNotifyConfig[GATT_MAX_NUM_CONN];    

// locker Profile Stream Properties
static uint8 lockerStreamProps = GATT_PROP_READ | GATT_PROP_WRITE;
static uint8 lockerStream[LOCKERPROFILE_STREAM_MAX_LEN];
static uint8 lockerStreamDesp[17] = "stream\0";
/*********************************************************************
 * Profile Attributes - Table
 */

static gattAttribute_t LockerProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = 
{
  // Simple Profile Service
  { 
    { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */
    GATT_PERMIT_READ,                         /* permissions */
    0,                                        /* handle */
    (uint8 *)&lockerProfileService            /* pValue */
  },
  /**************notify attribute**********************/
    // notify  Declaration
    { 
      { ATT_BT_UUID_SIZE, characterUUID },
      GATT_PERMIT_READ, 
      0,
      &lockerNotifyProps 
    },
    // notify stream buffer 
    { 
      { ATT_BT_UUID_SIZE, lockerNotifyUUID },
      0, 
      0, 
      lockerNotifyStream 
    },
    // notify stream  configuration
    { 
      { ATT_BT_UUID_SIZE, clientCharCfgUUID },
      GATT_PERMIT_READ | GATT_PERMIT_WRITE, 
      0, 
      (uint8 *)lockerNotifyConfig 
    },
    // notify stream  Description
    { 
      { ATT_BT_UUID_SIZE, charUserDescUUID },
      GATT_PERMIT_READ, 
      0, 
      lockerNotifyDesp 
    },     
    /************************stream buffer attribute***********************/
    // stream  Declaration
    { 
      { ATT_BT_UUID_SIZE, characterUUID },
      GATT_PERMIT_READ, 
      0,
      &lockerStreamProps 
    },
    // stream buffer 
    { 
      { ATT_BT_UUID_SIZE, lockerStreamUUID },
      GATT_PERMIT_READ | GATT_PERMIT_WRITE, 
      0, 
      lockerStream 
    },
    //  stream  Description
    { 
      { ATT_BT_UUID_SIZE, charUserDescUUID },
      GATT_PERMIT_READ, 
      0, 
      lockerStreamDesp 
    },   
};


/*********************************************************************
 * LOCAL FUNCTIONS
 */
static uint8 lockerReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, 
                            uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen );
static bStatus_t lockerWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
                                 uint8 *pValue, uint8 len, uint16 offset );

static void lockerHandleConnStatusCB( uint16 connHandle, uint8 changeType );


/*********************************************************************
 * PROFILE CALLBACKS
 */
// Simple Profile Service Callbacks
CONST gattServiceCBs_t lockerProfileCBs =
{
  lockerReadAttrCB,  // Read callback function pointer
  lockerWriteAttrCB, // Write callback function pointer
  NULL                       // Authorization callback function pointer
};

bStatus_t lockerProfile_AddService( uint32 services ,app_input_cb_t cb)
{
  uint8 status = SUCCESS;
  printf("lockerProfile_AddService:  \n");
  // Initialize Client Characteristic Configuration attributes
  GATTServApp_InitCharCfg( INVALID_CONNHANDLE, lockerNotifyConfig );
  // Register with Link DB to receive link status change callback
  VOID linkDB_Register( lockerHandleConnStatusCB );  
  if ( services & SIMPLEPROFILE_SERVICE )
  {
    // Register GATT attribute list and CBs with GATT Server App
    status = GATTServApp_RegisterService( LockerProfileAttrTbl, 
                                          GATT_NUM_ATTRS( LockerProfileAttrTbl ),
                                          &lockerProfileCBs );
  }
  app_input_cb = cb;
  return ( status );
}
bStatus_t locker_send( uint16 uuid,void *pdata , uint8 len)
{
  bStatus_t ret = SUCCESS;
 
  switch ( uuid )
  {
    case LOCKERPROFILE_NOTIFY_UUID:
      if ( len <= LOCKERPROFILE_NOTIFY_MAX_LEN) 
      {
        printf("locker_send: uuid:%04x notify app \n",uuid);
        osal_memcpy(lockerNotifyStream,pdata,len);
        GATTServApp_ProcessCharCfg(lockerNotifyConfig,lockerNotifyStream, FALSE,
                            LockerProfileAttrTbl, GATT_NUM_ATTRS( LockerProfileAttrTbl ),
                            INVALID_TASK_ID );
      }
      else
      {
        ret = bleInvalidRange;
      }
      break;
  case LOCKERPROFILE_STREAM_UUID:
      if ( len <= LOCKERPROFILE_STREAM_MAX_LEN) 
      {
        printf("locker_Send: uuid:%04x write to stream buffer and waite to read \n",uuid);
        osal_memcpy(lockerStream,pdata,len);
      }
      else
      {
        ret = bleInvalidRange;
      }    
    default:
      ret = INVALIDPARAMETER;
      break;
  }
  return ( ret );
}

int locker_Read( uint16 uuid, void *pdata )
{
  int ret;
  printf("locker_Read: uuid:%04x \n",uuid);
  switch ( uuid )
  {
    case LOCKERPROFILE_NOTIFY_UUID:
      osal_memcpy(pdata,lockerNotifyStream,LOCKERPROFILE_NOTIFY_MAX_LEN);
      ret = LOCKERPROFILE_NOTIFY_MAX_LEN;
    break;
    case LOCKERPROFILE_STREAM_UUID:
      osal_memcpy(pdata,lockerStream,LOCKERPROFILE_STREAM_MAX_LEN);
      ret = LOCKERPROFILE_NOTIFY_MAX_LEN;
     break;
    default:
      ret = -1;
      break;
  }
  return ( ret );
}

static uint8 lockerReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, 
                            uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen )
{
  bStatus_t status = SUCCESS;

  // If attribute permissions require authorization to read, return error
  if ( gattPermitAuthorRead( pAttr->permissions ) )
  {
    // Insufficient authorization
    return ( ATT_ERR_INSUFFICIENT_AUTHOR );
  }
  
  // Make sure it's not a blob operation (no attributes in the profile are long)
  if ( offset > 0 )
  {
    return ( ATT_ERR_ATTR_NOT_LONG );
  }
 
  if ( pAttr->type.len == ATT_BT_UUID_SIZE )
  {
    // 16-bit UUID
    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);
    printf("lockerProfile_ReadAttrCB: uuid:%04x \n",uuid);
    switch ( uuid )
    {
      // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases;
      // gattserverapp handles those reads
      // characteristics 1 and 2 have read permissions
      //   can be sent as a notification, it is included here
      case LOCKERPROFILE_NOTIFY_UUID:
        *pLen = LOCKERPROFILE_NOTIFY_MAX_LEN;
        osal_memcpy(pValue,pAttr->pValue,LOCKERPROFILE_NOTIFY_MAX_LEN);
        break;    
      case LOCKERPROFILE_STREAM_UUID:
        *pLen = LOCKERPROFILE_STREAM_MAX_LEN;
        osal_memcpy(pValue,pAttr->pValue,LOCKERPROFILE_STREAM_MAX_LEN);
        break;
      default:
        // Should never get here! (characteristics 3 and 4 do not have read permissions)
        *pLen = 0;
        status = ATT_ERR_ATTR_NOT_FOUND;
        break;
    }
  }
  else
  {
    // 128-bit UUID
    *pLen = 0;
    status = ATT_ERR_INVALID_HANDLE;
  }

  return ( status );
}

static bStatus_t lockerWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
                                 uint8 *pValue, uint8 len, uint16 offset )
{
  bStatus_t status = SUCCESS;
  // If attribute permissions require authorization to write, return error
  if ( gattPermitAuthorWrite( pAttr->permissions ) )
  {
    // Insufficient authorization
    return ( ATT_ERR_INSUFFICIENT_AUTHOR );
  }
  
  if ( pAttr->type.len == ATT_BT_UUID_SIZE )
  {
    // 16-bit UUID
    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);
    printf("lockerProfile_WriteAttrCB: uuid:%04x \n",uuid);
    switch ( uuid )
    {
      case LOCKERPROFILE_NOTIFY_UUID:
        status = ATT_ERR_INVALID_HANDLE;
        //Write the value           
        break;
      case LOCKERPROFILE_STREAM_UUID:
        if((offset==0)&(app_input_cb!=NULL))
        {
          if(len<=LOCKERPROFILE_STREAM_MAX_LEN)
            osal_memcpy(lockerStream,pValue,len);
          app_input_cb(LOCKERPROFILE_STREAM_UUID,pValue,len);
        }
        break;
      case GATT_CLIENT_CHAR_CFG_UUID:
        status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len,
                                                 offset, GATT_CLIENT_CFG_NOTIFY );
        break;       
      default:
        // Should never get here! (characteristics 2 and 4 do not have write permissions)
        status = ATT_ERR_ATTR_NOT_FOUND;
        break;
    }
  }
  else
  {
    // 128-bit UUID
    status = ATT_ERR_INVALID_HANDLE;
  }
  return ( status );
}
static void lockerHandleConnStatusCB( uint16 connHandle, uint8 changeType )
{ 
  // Make sure this is not loopback connection
  if ( connHandle != LOOPBACK_CONNHANDLE )
  {
    // Reset Client Char Config if connection has dropped
    if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED )      ||
         ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && 
           ( !linkDB_Up( connHandle ) ) ) )
    { 
      printf("lockerProfile_HandleConnStatusCB: Reset Client Char Config if connection has dropped \n");
      GATTServApp_InitCharCfg( connHandle, lockerNotifyConfig );
    }
  }
}


/*********************************************************************
*********************************************************************/

  在simpleBLEPeripheral.c下增加input函数用于接收数据:

void input(uint16 uuid, uint8 *pdata , int  len)
{
  int i;
  printf("input from uuid: %04x len:%d data:",uuid,len);
  for(i=0;i<len;i++)
    printf("%02x ",pdata[i]);
  printf("\n");
}

  初始化时:

void SimpleBLEPeripheral_Init( uint8 task_id )
{
  simpleBLEPeripheral_TaskID = task_id;

  // Setup the GAP
  VOID GAP_SetParamValue( TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL );
  
  // Setup the GAP Peripheral Role Profile
  {
    uint8 initial_advertising_enable = TRUE;
    // By setting this to zero, the device will go into the waiting state after
    // being discoverable for 30.72 second, and will not being advertising again
    // until the enabler is set back to TRUE
    uint16 gapRole_AdvertOffTime = 0;

    uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;
    uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
    uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
    uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;
    uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;

    // Set the GAP Role Parameters
    GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
    GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );

    GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
    GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

    GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );
    GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );
    GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );
    GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );
    GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );
  }

  // Set the GAP Characteristics
  GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );

  // Set advertising interval
  {
    uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;

    GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
    GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
    GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
    GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
  }

  // Setup the GAP Bond Manager
  {
    uint32 passkey = 0; // passkey "000000"
    uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
    uint8 mitm = TRUE;
    uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
    uint8 bonding = TRUE;
    GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );
    GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );
    GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );
    GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );
    GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );
  }

  // Initialize GATT attributes
  GGS_AddService( GATT_ALL_SERVICES );            // GAP
  GATTServApp_AddService( GATT_ALL_SERVICES );    // GATT attributes
  DevInfo_AddService();                           // Device Information Service
  lockerProfile_AddService( GATT_ALL_SERVICES,input);  // Simple GATT Profile

  // Register for all key events - This app will handle all key events
  RegisterForKeys( simpleBLEPeripheral_TaskID );
  // Enable clock divide on halt
  // This reduces active current while radio is active and CC254x MCU
  // is halted
  HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );

  // Setup a delayed profile startup
  osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );

}

  good luck!!我的已经工作的,你的呢?

转载于:https://www.cnblogs.com/lort/p/5753218.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值