BLE发送接收任意字节数据(20字节内)

#一、前言
####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个字节,测试成功。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值