蓝牙BLEBLEcc2540开启广播的过程
转自大香瓜的博客
一、简介
本篇介绍在应用层如何开启广播,且解析协议栈在此操作后做了什么。
二、开启广播
在应用层开启广播功能其实非常简单,只要把TRUE传给GAPRole_SetParameter函数中的GAPROLE_ADVERT_ENABLED就可以了。
三、解析协议栈在此操作后做了什么
1、GAPRole_SetParameter函数中的GAPROLE_ADVERT_ENABLED
- case GAPROLE_ADVERT_ENABLED:
- if ( len == sizeof( uint8 ) )
- {
- uint8 oldAdvEnabled = gapRole_AdvEnabled;
- gapRole_AdvEnabled = *((uint8*)pValue);
- if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) )
- {
- // Turn off Advertising
- if ( gapRole_state == GAPROLE_ADVERTISING )
- {
- VOID GAP_EndDiscoverable( gapRole_TaskID );
- }
- }
- else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) )
- {
- // Turn on Advertising
- if ( (gapRole_state == GAPROLE_STARTED)
- || (gapRole_state == GAPROLE_WAITING)
- || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) )
- {
- VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT );
- }
- }
- }
- else
- {
- ret = bleInvalidRange;
- }
- break;
其中gapRole_AdvEnabled默认是TRUE
- static uint8 gapRole_AdvEnabled = TRUE;
首先,每次进到这个函数里,就会把gapRole_AdvEnabled的值保存到oldAdvEnabled,再把新的状态写到gapRole_AdvEnabled。也就是这两句:
- uint8 oldAdvEnabled = gapRole_AdvEnabled;
- gapRole_AdvEnabled = *((uint8*)pValue);
其次,对oldAdvEnabled(旧的广播开关状态)和gapRole_AdvEnabled(新传入的广播开关状态)这两个变量进行了判断:
1)在广播状态下,想关闭广播----->关闭广播
2)在不广播的状态下,想开启广播--->开启广播
然而代码中并没有将另外两种情况编写进来,也就是
3)在广播状态下,还想开启广播
4)在不广播的状态下,还想关闭广播
协议栈把这两种情况划入了else的bleInvalidRange。
第2)种情况的开广播,调用了gapRole_TaskID任务中的START_ADVERTISING_EVT事件。
- else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) )
- {
- // Turn on Advertising
- if ( (gapRole_state == GAPROLE_STARTED)
- || (gapRole_state == GAPROLE_WAITING)
- || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) )
- {
- VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT );
- }
- }
2、START_ADVERTISING_EVT事件
- if ( events & START_ADVERTISING_EVT )
- {
- if ( gapRole_AdvEnabled )
- {
- gapAdvertisingParams_t params;
- // Setup advertisement parameters
- params.eventType = gapRole_AdvEventType;
- params.initiatorAddrType = gapRole_AdvDirectType;
- VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN );
- params.channelMap = gapRole_AdvChanMap;
- params.filterPolicy = gapRole_AdvFilterPolicy;
- if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS )
- {
- gapRole_state = GAPROLE_ERROR;
- // Notify the application with the new state change
- if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange )
- {
- pGapRoles_AppCGs->pfnStateChange( gapRole_state );
- }
- }
- }
- return ( events ^ START_ADVERTISING_EVT );
- }
事件中调用GAP_MakeDiscoverable即可开启广播。
如果广播不成功,则会调用函数指针pGapRoles_AppCGs指向的回调函数,并且传入参数GAPROLE_ERROR,以此来通知应用层广播不成功。
那么调用的又是哪个回调函数呢?
追踪一下pGapRoles_AppCGs发现有个注册回调函数的函数
- /*********************************************************************
- * @brief Does the device initialization.
- *
- * Public function defined in peripheral.h.
- */
- bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks )
- {
- if ( gapRole_state == GAPROLE_INIT )
- {
- // Clear all of the Application callbacks
- if ( pAppCallbacks )
- {
- pGapRoles_AppCGs = pAppCallbacks;
- }
- // Start the GAP
- gapRole_SetupGAP();
- return ( SUCCESS );
- }
- else
- {
- return ( bleAlreadyInRequestedMode );
- }
- }
再追踪一下这个注册函数,发现在应用层的SBP_START_DEVICE_EVT事件中对此进行了注册
- 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 );
- }
所以当广播开启不成功之后,会调用simpleBLEPeripheral_PeripheralCBs的回调函数peripheralStateNotificationCB的GAPROLE_ERROR
- // GAP Role Callbacks
- static gapRolesCBs_t simpleBLEPeripheral_PeripheralCBs =
- {
- peripheralStateNotificationCB, // Profile State Change Callbacks
- NULL // When a valid RSSI is read from controller (not used by application)
- };
- case GAPROLE_ERROR:
- {
- #if (defined HAL_LCD) && (HAL_LCD == TRUE)
- HalLcdWriteString( "Error", HAL_LCD_LINE_3 );
- #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
- }
- break;
到此,广播过程就结束了,很简单吧,哈哈。
蓝牙BLEBLEcc2540开启广播的过程相关推荐
- 针对蓝牙4.0 BLE通讯过程的逆向和攻击
本文讲的是针对蓝牙4.0 BLE通讯过程的逆向和攻击,从6个月前,我就开始针对BLE设备进行学习和研究,其中接触到了一些关于BLE逆向的博客和文章,但是相关内容都没有给出很好的方案.因此通过我的这篇文 ...
- nrf52832 学习笔记(三)蓝牙从机广播
nrf52832 学习笔记(三)蓝牙从机广播 蓝牙从机要想被主机连接,首先需要发送广播信息,周围主机通过扫描广播信号,根据从机的广播信息,判断是否连接. 蓝牙协议栈初始化 不管是主机还是从机,要想使用 ...
- 黑苹果oc清除nvram_黑苹果完善之路-英特尔蓝牙「开启/关闭」功能完善教程
小编开篇提醒:玩转黑苹果有风险,建议随时备份好自己的重要数据. 很多机友安装黑苹果之后,打开蓝牙选项却发现[关闭蓝牙]选项是灰色的,无法进行选择,但是一些具有强迫症的机友内心可能会接受不了,所以就此出 ...
- Android官方开发文档Training系列课程中文版:电池续航时间优化之按需开启广播接收器
原文地址:http://android.xsoftlab.net/training/monitoring-device-state/manifest-receivers.html 监测设备状态变化最简 ...
- Android 蓝牙相关的广播
2019独角兽企业重金招聘Python工程师标准>>> Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和 ...
- android蓝牙广播自定义,Android 蓝牙相关的广播
Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...
- [高通MSM8953_64][Android10]默认关闭蓝牙以及开启蓝牙状态栏不显示图标
文章目录 开发平台基本信息 问题描述 解决方法 1.默认关闭蓝牙 2.开启蓝牙状态栏不显示图标 开发平台基本信息 芯片: MSM8953_64 版本: Android 10 kernel: msm-4 ...
- android 蓝牙相关广播,Android 蓝牙相关的广播
Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...
- BLE蓝牙笔记----广播连接过程
本文是参考一些博文和书籍做的笔记,如有不适联系删除 参考:https://www.cnblogs.com/iini/p/8977806.html 参考文章: <BLE4.0 低功耗蓝牙 协议 总 ...
最新文章
- 第八期直播《立体视觉之立体匹配理论与实战》精彩回录
- MSTP和MPLS专线有什么区别?——Vecloud
- 探秘音视频网络优化与全球化部署最佳实践
- 甲流病人初筛(信息学奥赛一本通-T1399)
- 继承20161223
- 2个recordset合并_史上最全!8种办法玩转Excel文字合并,总有一款适合你!
- 软件开发高手须掌握的4大SQL精髓语句(综合篇)
- caxa线切割怎样画链轮_Autocad实战教程-线切割画链轮
- 计算机无法识别1136打印机,惠普HP M1136打印机驱动安装失败的多种解决办法
- ORACLE局域网连接
- 只有单号,用这个方法自动识别快递公司,快速查询出物流
- 如何使用api调用AI抠图服务
- python weekday()函数
- 美团点评2020校招笔试题1(栈,堆)
- VS Code + GCC 搭建 STM32 开发环境
- 字符串数组长度的几种求法
- Bosun安装、配置、部署
- 【源码】电压控制DC/DC双向变换器仿真
- sweet home 3d 免费的家居设计软件
- 现在很多的APP都有“附近的人“功能,这是哪个知识实现的呢!