在应用层开启广播功能其实非常简单,只要把TRUE传给GAPRole_SetParameter函数中的GAPROLE_ADVERT_ENABLED就可以了。
进到GAPRole_SetParameter函数里看看GAP层到底做了什么事情才开关广播。
其中gapRole_AdvEnabled默认是TRUE
每次进到这个函数里,就会先把gapRole_AdvEnabled的值保存到oldAdvEnabled,再把新的状态写到gapRole_AdvEnabled。也就是这两句
而后它实际上是对oldAdvEnabled(旧的广播开关状态)和gapRole_AdvEnabled(新传入的广播开关状态)这两个变量进行了判断,
1)在广播状态下,想关闭广播----->关闭广播
2)在不广播的状态下,想开启广播--->开启广播
代码中并没有将另外两种情况编写进来,也就是
3)在广播状态下,还想开启广播
4)在不广播的状态下,还想关闭广播
协议栈把这两种情况划入了else的bleInvalidRange。
第2)种情况的开广播,调用了gapRole_TaskID任务中的START_ADVERTISING_EVT事件:
事件中调用GAP_MakeDiscoverableGAP_MakeDiscoverable即可开启广播,如果广播不成功,则会调用函数指针pGapRoles_AppCGs指向的回调函数,并且传入参数GAPROLE_ERROR,以此来通知应用层广播不成功。
那么调用的又是哪个回调函数呢?
追踪一下pGapRoles_AppCGs发现有个注册回调函数的函数
再追踪一下这个注册函数,发现在应用层的SBP_START_DEVICE_EVT事件中对此进行了注册
所以当广播开启不成功之后,会调用simpleBLEPeripheral_PeripheralCBs的回调函数
到此,广播过程就结束了。