#一、前言
####BLE的SimpleBLECentral和SimpleBLEPeripheral例程是通过SIMPLEPROFILE_CHAR1来发送接收一个字节的数据的。要想发送多个字节的数据,必须修改simpleGATTprofile.c中与SIMPLEPROFILE_CHAR1相关的参数和函数。
#二、修改
###详细可以参考例程中的SIMPLEPROFILE_CHAR5。
##1.定义长度、定义数组
####在simpleGATTprofile.h中定义长度:
// Length of Characteristic 1 in bytes
define SIMPLEPROFILE_CHAR1_LEN 20
####在simpleGATTprofile.c中定义数组:
// Characteristic 1 Value
static 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(20);
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中定义的长度,我定义的是20个字节,测试成功。