请教CC2541 Keyfob做从机,给Usb dongle 发GATT_Notification数据,dongle接收到哪里了?
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之后就好了。。。
多谢啦。