FR8016xHBle蓝牙透传

1,填加从机特征值

    特征值相当于标签,子啊这个标签下面我们可以添加一个缓冲区,通过对这个标签下面的缓冲区进行读写操作就可以实现数据的传送了。

// Profile Parameters
#define SIMPLEPROFILE_CHAR1                   0  // RW uint8 - Profile Characteristic 1 value 
#define SIMPLEPROFILE_CHAR2                   1  // RW uint8 - Profile Characteristic 2 value
#define SIMPLEPROFILE_CHAR3                   2  // RW uint8 - Profile Characteristic 3 value
#define SIMPLEPROFILE_CHAR4                   3  // RW uint8 - Profile Characteristic 4 value
#define SIMPLEPROFILE_CHAR5                   4  // RW uint8 - Profile Characteristic 4 value

#define SIMPLEPROFILE_CHAR6                   5  // RW uint8 - Profile Characteristic 5 value
  
// Simple Profile Service UUID
#define SIMPLEPROFILE_SERV_UUID               0xFFF0
    
// Key Pressed UUID
#define SIMPLEPROFILE_CHAR1_UUID            0xFFF1
#define SIMPLEPROFILE_CHAR2_UUID            0xFFF2
#define SIMPLEPROFILE_CHAR3_UUID            0xFFF3
#define SIMPLEPROFILE_CHAR4_UUID            0xFFF4
#define SIMPLEPROFILE_CHAR5_UUID            0xFFF5

#define SIMPLEPROFILE_CHAR6_UUID            0xFFF6
  
// Simple Keys Profile Services bit fields
#define SIMPLEPROFILE_SERVICE               0x00000001

// Length of Characteristic 5 in bytes
#define SIMPLEPROFILE_CHAR5_LEN           5  

#define SIMPLEPROFILE_CHAR6_LEN           15  

2,添加特征值的UUID

// Characteristic 6 UUID: 0xFFF6
CONST uint8 simpleProfilechar6UUID[ATT_BT_UUID_SIZE] =
{ 
  LO_UINT16(SIMPLEPROFILE_CHAR6_UUID), HI_UINT16(SIMPLEPROFILE_CHAR6_UUID)
};

3,添加属性表的配置项

// Simple Profile Characteristic 6 Properties
static uint8 simpleProfileChar6Props = GATT_PROP_READ|GATT_PROP_WRITE|GATT_PROP_NOTIFY;

// Characteristic 5 Value
static uint8 simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = { 0, 0, 0, 0, 0 };

// Simple Profile Characteristic 4 Configuration Each client has its own
// instantiation of the Client Characteristic Configuration. Reads of the
// Client Characteristic Configuration only shows the configuration for
// that client and writes only affect the configuration of that client.
static gattCharCfg_t *simpleProfileChar4Config;

// Simple Profile Characteristic 6 User Description
static uint8 simpleProfileChar6UserDesp[17] = "Characteristic 6";

 

4,将配置项添加到属性表里面去

    // Characteristic 6 Declaration
    { 
      { ATT_BT_UUID_SIZE, characterUUID },
      GATT_PERMIT_READ, 
      0,
      &simpleProfileChar6Props 
    },

      // Characteristic Value 6
      { 
        { ATT_BT_UUID_SIZE, simpleProfilechar5UUID },
        GATT_PERMIT_READ | GATT_PERMIT_WRITE, 
        0, 
        simpleProfileChar6
      },

      // Characteristic 6 configuration
      { 
        { ATT_BT_UUID_SIZE, clientCharCfgUUID },
        GATT_PERMIT_READ | GATT_PERMIT_WRITE, 
        0, 
        (uint8 *)&simpleProfileChar6Config 
      },

      // Characteristic 6 User Description
      { 
        { ATT_BT_UUID_SIZE, charUserDescUUID },
        GATT_PERMIT_READ, 
        0, 
        simpleProfileChar6UserDesp 
      },

 

因为我们新加进去了4个属性,所以,属性表的长度也要加4,所以修改宏:#define SERVAPP_NUM_ATTR_SUPPORTED        17+4

bStatus_t SimpleProfile_GetParameter( uint8 param, void *value )

    case SIMPLEPROFILE_CHAR6:
      //从机读取出来的值放到char6里面去
      VOID memcpy( value, simpleProfileChar6, SIMPLEPROFILE_CHAR6_LEN );
      VOID memset( simpleProfileChar6, 0, SIMPLEPROFILE_CHAR6_LEN );
      break;      

 

bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )


    case SIMPLEPROFILE_CHAR6:
      if ( len == SIMPLEPROFILE_CHAR6_LEN ) 
      {
        VOID memcpy( simpleProfileChar6, value, SIMPLEPROFILE_CHAR6_LEN );
        // See if Notification has been enabled
        GATTServApp_ProcessCharCfg( simpleProfileChar6Config, &simpleProfileChar6, FALSE,
                                    simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ),
                                    INVALID_TASK_ID, simpleProfile_ReadAttrCB );
        VOID memset( simpleProfileChar6, 0, SIMPLEPROFILE_CHAR6_LEN );
      }
      else
      {
        ret = bleInvalidRange;
      }
      break;

static bStatus_t simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, 

                                           uint8 *pValue, uint8 *pLen, uint16 offset,

                                           uint8 maxLen, uint8 method )

 

      case SIMPLEPROFILE_CHAR6_UUID:
        //注意:pAttr->pValue 默认长度是和SIMPLEPROFILE_CHAR6_LEN一致的,所以这里不能使用
        //*pLen = osal_strlen(pAttr->pValue)寻找长度,会一直SIMPLEPROFILE_CHAR6_LEN相等
        //所以我们把pAttr->pValue的第一位定义为发送的数据长度,这样就可以发送任意长度的数据
        //*pLen = SIMPLEPROFILE_CHAR6_LEN;
        //如果想发送带包长度,使用此部分
        //*pLen = *pAttr->pValue+1;     //发送数据长度时使用
        //不带此包数据长度
        *pLen = *pAttr->pValue;
        VOID memcpy( pValue, &pAttr->pValue[1], *pLen );
        break;

      default:
        // Should never get here! (characteristics 3 and 4 do not have read permissions)
        *pLen = 0;
        status = ATT_ERR_ATTR_NOT_FOUND;
        break;

static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,

                                            uint8 *pValue, uint8 len, uint16 offset,

                                            uint8 method )

      case SIMPLEPROFILE_CHAR6_UUID:

        //Validate the value
        // Make sure it's not a blob oper
        if ( offset == 0 )
        {
          //如果主机出现Write Error 13 错误,测试是因为写入字节超出范围
          // if ( len != 1 )
          // {
          //   status = ATT_ERR_INVALID_VALUE_SIZE;
          // }
          if ( len > SIMPLEPROFILE_CHAR6_LEN )
          {
            status = ATT_ERR_INVALID_VALUE_SIZE;
          }
        }
        else
        {
          status = ATT_ERR_ATTR_NOT_LONG;
        }
        
        //Write the value
        if ( status == SUCCESS )
        {
          // uint8 *pCurValue = (uint8 *)pAttr->pValue;        
          // *pCurValue = pValue[0];

          // if( pAttr->pValue == &simpleProfileChar1 )
          // {
          //   notifyApp = SIMPLEPROFILE_CHAR1;        
          // }
          // else
          // {
          //   notifyApp = SIMPLEPROFILE_CHAR3;           
          // }
          VOID memcpy(pAttr->pValue,pValue,len/*SIMPLEPROFILE_CHAR6_LEN*/);
          notifyApp = SIMPLEPROFILE_CHAR6_LEN;
        }
        break;

当特征值被改变的时候会调用此函数,在此函数中,我们将数据通过串口打印

static void simpleProfileChangeCB( uint8 paramID )
{
  uint8 newValue;
  uint8 Char6_Value[SIMPLEPROFILE_CHAR6_LEN];

  switch( paramID )
  {
    case SIMPLEPROFILE_CHAR1:
      SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, &newValue );

      #if (defined HAL_LCD) && (HAL_LCD == TRUE)
        HalLcdWriteStringValue( "Char 1:", (uint16)(newValue), 10,  HAL_LCD_LINE_3 );
      #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)

      break;

    case SIMPLEPROFILE_CHAR3:
      SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR3, &newValue );

      #if (defined HAL_LCD) && (HAL_LCD == TRUE)
        HalLcdWriteStringValue( "Char 3:", (uint16)(newValue), 10,  HAL_LCD_LINE_3 );
      #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)

      break;

    case SIMPLEPROFILE_CHAR6:
      //当特征值被改变,最终会进入这个回调函数
      SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, &Char6_Value );
      NPI_WriteTransport(Char6_Value,strlen(Char6_Value));            //将数据通过串口打印
      memset(Char6_Value,0,SIMPLEPROFILE_CHAR6_LEN);
      #if (defined HAL_LCD) && (HAL_LCD == TRUE)
        HalLcdWriteStringValue( "Char 3:", (uint16)(newValue), 10,  HAL_LCD_LINE_3 );
      #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)

      break;

    default:
      // should not reach here!
      break;
  }
}

在void SimpleBLEPeripheral_Init( uint8 task_id )设置CHAR6属性值

  // Setup the SimpleProfile Characteristic Values
  {
    uint8 charValue1 = 1;
    uint8 charValue2 = 2;
    uint8 charValue3 = 3;
    uint8 charValue4 = 4;
    uint8 charValue5[SIMPLEPROFILE_CHAR5_LEN] = { 1, 2, 3, 4, 5 };
    uint8 charValue6[SIMPLEPROFILE_CHAR6_LEN] = { 0 };
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR1, sizeof ( uint8 ), &charValue1 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR2, sizeof ( uint8 ), &charValue2 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR3, sizeof ( uint8 ), &charValue3 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof ( uint8 ), &charValue4 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR6, SIMPLEPROFILE_CHAR6_LEN, charValue6 );
  }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值