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烧录进去灯就不亮。
Zhao Fan1:
回复 jason jason4:
回复,使用您的方法,能够连续不停得发包到主,使用BTool也能看到。
但是我是想单独只发一次,而不是这种轮询执行.
想了个笨办法,使用全局变量去做。但是我感觉这种方法太笨,不智能。
或者我对架构还不熟悉。
我想连接成功后,只传一次。就像小米手环那种,一连接,自动更新数据(把信息传到手机或者自动更新版本)。只做一次。
有没有大概的个位置。。。虽然看了user guide,但是没有demo感觉还是理解不透彻。。。
——————————————–
这是第一步,第二步,我是想学习event事件,建立自己能控制整个流程,这样能更好把握问题所在。最近要培训没时间看代码。。。
jason jason4:
回复 Zhao Fan1:
你把那三行定时器的删了就行了,就会只进一次
Zhao Fan1:
回复 jason jason4:
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.155Device ConnectedHandle = 0x0000Addr 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中添加。。
期待大牛再次指点。。。
jason jason4:
回复 Zhao Fan1:
我只是正好做过这块而已。
定时器只是在规定时间后产生一个事件,你在 SBP_PERIODIC_EVT这个周期事件中把定时器关了只是说这个事件只触发一次。如果你需要senddata()也只触发一次的话这样是可以的。关于SBP_PERIODIC_EVT这个事件的产生,因为内部处理的是发送,肯定不是放在SBP_START_DEVICE_EVT设备初始化之后执行,你把它放在两个设备成功建立连接或者绑定后,再让它发送就可以了。你的两个设备都没连接怎么发送。。。
Zhao Fan1:
回复 jason jason4:
[24] : <Info> – 09:27:58.155Device ConnectedHandle = 0x0000Addr 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 ) 一直为真,所以一直在重启定时器。
如果把这个去掉了,也是一直在重启定时器。
如果把这三行都去掉,因为没有获得此事件所以没有执行。。。
jason jason4:
回复 Zhao Fan1:
你理解错了,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 );第一次的产生放到真正建立连接后。
我试过,可行的,我的速度也是这么测的,没有问题。
jason jason4:
回复 jason jason4:
对了,你把4次调用sendata();下面那行hci buffer初始化的去掉,要不然是错误的
Zhao Fan1:
回复 jason jason4:
是我对这个流程没弄明白
把senddata放到connected之后就好了。。。
多谢啦。