manhuami2007 发表于 2023-8-29 07:58

[ST NUCLEO-WBA52CG] 6 - BLE协议栈的使用简析

<div class='showpostmsg'><p>BLE的蓝牙协议栈使用的是事件驱动的模式,在后台对各任务进行管理的是其utilities文件夹下的sequencer模块,这个模块在前面的帖子中介绍了,这个模块可以通过注册的方式将函数加入到后台代码中,而且可以在其它的地方对函数的&ldquo;运行和停止&rdquo;进行控制。</p>

<p>可以借助搜索功能搜索函数UTIL_SEQ_RegTask() ,能够看到注册了大量的函数到后台中。</p>

<p></p>

<p>同样蓝牙协议栈也是注册到sequencer的一个任务。当蓝牙协议栈传递出事件后,我们就需要根据项目,对某些事件进行处理。对事件进行处理的函数主要有3个:</p>

<ol>
        <li>app_ble.c文件中的SVCCTL_App_Notification()函数</li>
        <li>自定义服务对应的server源文件,例如p2p_server.c中的P2P_SERVER_EventHandler()函数</li>
        <li>自定义服务定义的server_app源文件中,例如p2p_server_app.c中的P2P_SERVER_Notification()函数</li>
</ol>

<p>这里也要说一下上面第一项的SVCCTL模块的函数,SVCCTL这个模块的作用是提供给应用层来处理BLE的GATT/GAP事件的一系列函数,也就是说对用户来说,处理事件则主要是通过这个库函数。</p>

<p>而SVCCTL模块的函数也是在sequencer中运行的,也是通过注册的方式将其注册到sequencer中的,如下图中的第244行为其注册代码。</p>

<p></p>

<p>接着还回到事件的处理函数上。上述的3个处理函数,第一个主要处理GAP的时间,比如连接的断开、连接的成功事件。而第2个和第3个处理函数则是主要处理GATT的服务。3个事件处理函数的关系可以参考下图。</p>

<p></p>

<p>P2P_SERVER_EventHandler()这个处理函数是P2P_SERVER_Notification()函数的上层函数。在P2P_SERVER_EventHandler()函数中会调用P2P_SERVER_Notification()函数。虽然这两个都处理GATT的事件,但还是有区别的,P2P_SERVER_EventHandler()处理了所有和GATT相关的事件,但是针对特征值的读写则是主要是在P2P_SERVER_Notification()里进行处理的。</p>

<p>以上就是用户层需要关注的事件处理函数,STM32提供了大量的事件,用户可以根据自己的需要,对某些事件进行处理,相应的事件可以参考文档AN5270,这里有各个事件的介绍,不过这个文档和代码里的事件宏定义稍微有点区别,但是大体的名字是相似了,可以结合着工程文件&rdquo;ble_std.h&rdquo;(ble的标准事件)和&rdquo;ble_vs_codes.h&rdquo;(st公司制定的事件)两个头文件中的定义交叉参考。</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

火辣西米秀 发表于 2023-8-30 07:29

<p>处理了所有和GATT相关的事件,针对特征值的读写,主要在P2P_SERVER_Notification()里进行,是不一样的</p>
页: [1]
查看完整版本: [ST NUCLEO-WBA52CG] 6 - BLE协议栈的使用简析