BLE发送接收任意字节数据

来源:互联网 发布:linux nano vim 编辑:程序博客网 时间:2024/06/01 10:16

一、前言

BLE的SimpleBLECentral和SimpleBLEPeripheral例程是通过SIMPLEPROFILE_CHAR1来发送接收一个字节的数据的。要想发送多个字节的数据,必须修改simpleGATTprofile.c中与SIMPLEPROFILE_CHAR1相关的参数和函数。

二、修改

详细可以参考例程中的SIMPLEPROFILE_CHAR5。

1.定义长度、定义数组

在simpleGATTprofile.h中定义长度:

 // Length of Characteristic 1 in bytes define SIMPLEPROFILE_CHAR1_LEN   32

在simpleGATTprofile.c中定义数组:

// Characteristic 1 Valuestatic uint8 simpleProfileChar1[SIMPLEPROFILE_CHAR1_LEN] = {0};

2.修改Characteristic Value

      // Characteristic Value 1      {        { ATT_BT_UUID_SIZE, simpleProfilechar1UUID },        GATT_PERMIT_READ | GATT_PERMIT_WRITE,        0,        simpleProfileChar1      },

3.修改SimpleProfile_SetParameter函数

          //if ( len == sizeof ( uint8 ) )          //{          //  simpleProfileChar1 = *((uint8*)value);          //}

改为:

          if ( len == SIMPLEPROFILE_CHAR1_LEN )          {            VOID osal_memcpy( simpleProfileChar1, value, SIMPLEPROFILE_CHAR1_LEN );          }

4.修改SimpleProfile_GetParameter函数

         // *((uint8*)value) = simpleProfileChar1;

改为:

         VOID osal_memcpy( value, simpleProfileChar1, SIMPLEPROFILE_CHAR1_LEN );

5.修改simpleProfile_WriteAttrCB函数

        //Validate the value        // Make sure it's not a blob oper       if ( offset == 0 )       {            #if 0            if ( len != SIMPLEPROFILE_CHAR1_LEN )            {                status = ATT_ERR_INVALID_VALUE_SIZE;            }            #else            if ( len > SIMPLEPROFILE_CHAR1_LEN )            {                status = ATT_ERR_INVALID_VALUE_SIZE;            }            #endif        }        else        {            status = ATT_ERR_ATTR_NOT_LONG;        }        //Write the value        if ( status == SUCCESS )        {            uint8 *pCurValue = (uint8 *)pAttr->pValue;            osal_memset(pCurValue,0,SIMPLEPROFILE_CHAR1_LEN);            VOID osal_memcpy( pCurValue, pValue, len );            if( pAttr->pValue == simpleProfileChar1 )            {                notifyApp = SIMPLEPROFILE_CHAR1;            }            else            {                notifyApp = SIMPLEPROFILE_CHAR3;            }        }

6.修改simpleProfile_ReadAttrCB函数

      case SIMPLEPROFILE_CHAR1_UUID:          *pLen = SIMPLEPROFILE_CHAR1_LEN;          VOID osal_memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR1_LEN );          break;

三、测试

修改完成后,就可以在主机和从机当中测试了。

主机:

在simpleBLECentral_HandleKeys函数中:

      if ( simpleBLEDoWrite )  //没有其他的读写操作就进行读写操作      {           // Do a write           attWriteReq_t req;                   //写请求格式结构体           uint8 buf[] = "123456789abcdef";           osal_memcpy(req.value,buf,sizeof(buf)/sizeof(buf[0]));           req.handle = simpleBLECharHdl;       //发现特征句柄           req.len = sizeof(buf)/sizeof(buf[0]);           req.sig = 0;                         //身份验证签名状态  0:不包含  1:有效  2:无效           req.cmd = 0;                         //命令标志           status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );      }

在此将发送”123456789abcdef”字符串到从机。


从机:

在simpleProfileChangeCB函数中:

uint8 *newValue = (uint8*)osal_mem_alloc(8*32);switch( paramID ){    case SIMPLEPROFILE_CHAR1:      SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, newValue );  //获得主机发来数据      #if (defined HAL_LCD) && (HAL_LCD == TRUE)        HalLcdWriteString((char*)newValue,  HAL_LCD_LINE_3 ); //显示到LCD      #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)      break;    default:      // should not reach here!      break;}osal_mem_free(newValue);

四、结语

本文主要是在SIMPLEPROFILE_CHAR1的基础上修改的,SIMPLEPROFILE_CHAR1本来只可以发送1个字节,修改后最大可以发送在simpleGATTprofile.h中定义的长度,我定义的是32个字节,测试成功。

1 0
原创粉丝点击