微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 用BTtool去read/wrtie 某个服务失败

用BTtool去read/wrtie 某个服务失败

时间:10-02 整理:3721RD 点击:

用BTtool去read  蓝牙温度计(ifever)0x291C(蓝牙温度计的温度))的时候提示READ_NOT_PERMITTED,在lightblue中点击Listen to otifications,则会不断地显示温度数据。请问应该如何操作,本人新手,请赐教。

chao,

这是notification.

listen for notifications就是打开了蓝牙温度计的Notification,自动发温度值过来。

这个特征值应该没有read属性,所以你没法用BTool去读这个值。

Hi Yan:

              用BTool 只是去测试,我最终的目的是要用CC2541去拿到这个数据,如果是用2541的话应该如何去读取,谢谢。

使用cc2541的主机例程,也就是SimpleBLECentral来读取就可以。具体的,修改如下代码,加入notify处理分支

static void simpleBLECentralProcessGATTMsg( gattMsgEvent_t *pMsg )
{
  if ( simpleBLEState != BLE_STATE_CONNECTED )
  {
    // In case a GATT message came after a connection has dropped,
    // ignore the message
    return;
  }
  
  if ( ( pMsg->method == ATT_READ_RSP ) ||
       ( ( pMsg->method == ATT_ERROR_RSP ) &&
         ( pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ ) ) )
  {
    if ( pMsg->method == ATT_ERROR_RSP )
    {
      uint8 status = pMsg->msg.errorRsp.errCode;
      
      //LCD_WRITE_STRING_VALUE( "Read Error", status, 10, HAL_LCD_LINE_1 );
    }
    else
    {
      // After a successful read, display the read value
      uint8 valueRead = pMsg->msg.readRsp.value[0];

      //LCD_WRITE_STRING_VALUE( "Read rsp:", valueRead, 10, HAL_LCD_LINE_1 );
    }
    
    simpleBLEProcedureInProgress = FALSE;
  }
  else if ( ( pMsg->method == ATT_WRITE_RSP ) ||
       ( ( pMsg->method == ATT_ERROR_RSP ) &&
         ( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )
  {
    
    if ( pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP )
    {
      uint8 status = pMsg->msg.errorRsp.errCode;
      
      //LCD_WRITE_STRING_VALUE( "Write Error", status, 10, HAL_LCD_LINE_1 );
    }
    else
    {
      // After a succesful write, display the value that was written and increment value
      //LCD_WRITE_STRING_VALUE( "Write sent:", simpleBLECharVal++, 10, HAL_LCD_LINE_1 );
    }
    
    simpleBLEProcedureInProgress = FALSE;    

  }
  else if ( pMsg->method == ATT_HANDLE_VALUE_NOTI ||
       pMsg->method == ATT_HANDLE_VALUE_IND )
  {
    
    if(pMsg->msg.handleValueNoti.handle == 0x001B)
    {
        //在此处处理notify,注意对应的handle替换成正确的值
    }
    else if(pMsg->msg.handleValueInd.handle == 0x001F)
    {     
        //在此处处理indicate,注意对应的handle替换成正确的值
        ATT_HandleValueCfm(simpleBLEConnHandle);
      
    }
    
  }  
  else if ( simpleBLEDiscState != BLE_DISC_STATE_IDLE )
  {
    simpleBLEGATTDiscoveryEvent( pMsg );
  }
  
}

pMsg->msg.handleValueNoti.handle需要自己想办法获取到。另外在这之前,要使能notification

attWriteReq_t writeReq;
    
      writeReq.handle = 0x001C;
      writeReq.len = ATT_BT_UUID_SIZE;
      writeReq.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);//这里是 0x01
      writeReq.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);//这里是 0x00
      writeReq.sig = 0;
      writeReq.cmd = 0;
      
      //GATT_WriteCharValue( simpleBLEConnHandle, &writeReq, simpleBLETaskId );
      GATT_WriteCharDesc( simpleBLEConnHandle, &writeReq, simpleBLETaskId );

同样的,你需要想办法获取到writeReq.handle。希望能帮到你。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top