This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教CC2541 Keyfob做从机,给Usb dongle 发GATT_Notification数据,dongle接收到哪里了?

Other Parts Discussed in Thread: CC2541

1.使用BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral 的demo

在SimpleBLEPeripheral_ProcessEvent 事件最后添加自己的发送数据事件定义为0x0004

  if( events & SBP_BURST_EVT)
  {
      if ( SBP_PERIODIC_EVT_PERIOD )
    {
      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    }
  
    sendData();
    sendData();
 
    return (events ^ SBP_BURST_EVT);
  }

发送数据测试函数:

static void sendData(void )
{
 
    static uint16 counter=0;
    uint8 burstData[20] = {0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0};        
  
    attHandleValueNoti_t nData;
    nData.len = 20;
    nData.handle = 20;
 
    //skKeyPressed = *((uint8*)pValue);
    osal_memcpy( &nData.value, &burstData, 20 );

    // Send the Notification
    if (GATT_Notification( 0, &nData, FALSE )==SUCCESS)
    {
      counter++;
    }

   
    if(counter >1000)
    {
      osal_stop_timerEx(simpleBLEPeripheral_TaskID,SBP_BURST_EVT);
      counter = 0;
    }  

}

在学习GATT_Notification发数据。。请问下使用BTool怎么接收。

2.除了这种从机发数据给主机的方式,还有没有其他数据发送方式,有无demo可以看。

3.烧写自带编译好的CC2541_keyfob_SimpleBLEPeripheral.hex  亮灯都正常,但是自己编译的hex烧录进去灯就不亮。

  • 你在做速度传输测试吧,从机notification发给usbdongle的包,会在BTOOL上打印的,你只要在usbdongle上运行主机程序,用BTool  scan设备,然后建立连接就可以了。上面 

     if ( SBP_PERIODIC_EVT_PERIOD )
        {
          osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
        }

    你定时器启动事件可以放在成功连接后。这样主机和从机一链接就会不停发包,速度和ti给的差不多,5~6k的样子。

  • 回复,使用您的方法,能够连续不停得发包到主,使用BTool也能看到。

    但是我是想单独只发一次,而不是这种轮询执行.

    想了个笨办法,使用全局变量去做。但是我感觉这种方法太笨,不智能。

    或者我对架构还不熟悉。

    我想连接成功后,只传一次。就像小米手环那种,一连接,自动更新数据(把信息传到手机或者自动更新版本)。只做一次。

    有没有大概的个位置。。。虽然看了user guide,但是没有demo感觉还是理解不透彻。。。

    --------------------------------------------

    这是第一步,第二步,我是想学习event事件,建立自己能控制整个流程,这样能更好把握问题所在。最近要培训没时间看代码。。。

  • 你把那三行定时器的删了就行了,就会只进一次

  • if ( events & SBP_PERIODIC_EVT )
      {
        // Restart timer
      //  if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器
      //  {
          //osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
        //}


         sendData();
          // Perform periodic application task
        performPeriodicTask();

        return (events ^ SBP_PERIODIC_EVT);
      }

     

    我把3个重启定时器删除后,连接成功后,就收不到senddata里面的数据了。。。

    [24] : <Info> - 09:27:58.155
    Device Connected
    Handle = 0x0000
    Addr Type = 0x00 (Public)
    BDAddr = 84:DD:20:C5:52:69
    ------------------------------------------------------------------------------------------------------------------------
    [25] : <Rx> - 09:27:58.110
    -Type  : 0x04 (Event)
    -EventCode : 0xFF (HCI_LE_ExtEvent)
    -Data Length : 0x13 (19) bytes(s)
     Event  : 0x0605 (GAP_EstablishLink)
     Status  : 0x00 (Success)
     DevAddrType : 0x00 (Public)
     DevAddr  : 84:DD:20:C5:52:69
     ConnHandle : 0x0000 (0)
     ConnInterval : 0x0050 (80)
     ConnLatency : 0x0000 (0)
     ConnTimeout : 0x07D0 (2000)
     ClockAccuracy : 0x00 (0)
    Dump(Rx):
    04 FF 13 05 06 00 00 69 52 C5 20 DD 84 00 00 50
    00 00 00 D0 07 00
    ------------------------------------------------------------------------------------------------------------------------
    [26] : <Rx> - 09:28:04.792
    -Type  : 0x04 (Event)
    -EventCode : 0xFF (HCI_LE_ExtEvent)
    -Data Length : 0x0B (11) bytes(s)
     Event  : 0x0607 (GAP_LinkParamUpdate)
     Status  : 0x00 (Success)
     ConnHandle : 0x0000 (0)
     ConnInterval : 0x0320 (800)
     ConnLatency : 0x0000 (0)
     ConnTimeout : 0x03E8 (1000)
    Dump(Rx):
    04 FF 0B 07 06 00 00 00 20 03 00 00 E8 03
    ------------------------------------------------------------------------------------------------------------------------

    最后没有用开始自己模仿写的事件,而是在 events & SBP_START_DEVICE_EVT  之后的events & SBP_PERIODIC_EVT中添加。。

    期待大牛再次指点。。。

     

  • 我只是正好做过这块而已。

    定时器只是在规定时间后产生一个事件,你在 SBP_PERIODIC_EVT这个周期事件中把定时器关了只是说这个事件只触发一次。如果你需要senddata()也只触发一次的话这样是可以的。关于SBP_PERIODIC_EVT这个事件的产生,因为内部处理的是发送,肯定不是放在SBP_START_DEVICE_EVT设备初始化之后执行,你把它放在两个设备成功建立连接或者绑定后,再让它发送就可以了。你的两个设备都没连接怎么发送。。。

  • [24] : <Info> - 09:27:58.155
    Device Connected
    Handle = 0x0000
    Addr Type = 0x00 (Public)
    BDAddr = 84:DD:20:C5:52:69

    已经连接上了。。。

    uint16 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
    {

      VOID task_id; // OSAL required parameter that isn't used in this function

      if ( events & SYS_EVENT_MSG )
      {
        uint8 *pMsg;

        if ( (pMsg = osal_msg_receive( simpleBLEPeripheral_TaskID )) != NULL )
        {
          simpleBLEPeripheral_ProcessOSALMsg( (osal_event_hdr_t *)pMsg );

          // Release the OSAL message
          VOID osal_msg_deallocate( pMsg );
        }

        // return unprocessed events
        return (events ^ SYS_EVENT_MSG);
      }

      if ( events & SBP_START_DEVICE_EVT )
      {
        // Start the Device
        VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );

        // Start Bond Manager
        VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );

        // Set timer for first periodic event
        osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
        return ( events ^ SBP_START_DEVICE_EVT );
      }

      if ( events & SBP_PERIODIC_EVT )
      {
        // Restart timer
        if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器
        {
          osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
        }
       
         sendData();//--------------》这个事我加的函数(纯粹调用了一下notification)
          // Perform periodic application task
        performPeriodicTask();

        return (events ^ SBP_PERIODIC_EVT);
      }
      // Discard unknown events
      return 0;
    }

    有这段是不停的发

        if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器
        {
          osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
        }

    没有这段,虽然是连接上了,但是没发的。。。

    我想的是: if ( SBP_PERIODIC_EVT_PERIOD ) 一直为真,所以一直在重启定时器。

    如果把这个去掉了,也是一直在重启定时器。

    如果把这三行都去掉,因为没有获得此事件所以没有执行。。。

  • 你理解错了,SBP_START_DEVICE_EVT里面你就把osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );这个事件产生了,这个时候肯定是没有来得及建立连接的,也就是说你的设备初始化后会直接去进行发送这个动作,后来才显示连接了。你的发送是在连接之前的。你可以把notifacation的返回值打印出来,SUCCESS才是成功提交到底层进行发送。其他5个返回值都是不对的,你打印出来一看就知道了。

    另一种你在时间里面加个定时器让他成为周期的,那后来建立连接就发了啊,前面的是不发的。

    你要把osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );第一次的产生放到真正建立连接后。

    我试过,可行的,我的速度也是这么测的,没有问题。

  • 对了,你把4次调用sendata();下面那行hci buffer初始化的去掉,要不然是错误的

  • 是我对这个流程没弄明白

    把senddata放到connected之后就好了。。。

    多谢啦。