蓝牙Simple Peripheral工程学习

2024-04-03 16:36

本文主要是介绍蓝牙Simple Peripheral工程学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

TI BLE SDK提供了Simple Peripheral工程,初学者可以通过这个工程来学习基本的蓝牙知识,通过实操掌握蓝牙基本的理论与通信方式。

在介绍这个工程前,先为大家介绍蓝牙Peripheral与Central的区别。如下图GAP主要负责Ble设备的连接,GAP状态机描述了设备空闲、设备发现与连接三个阶段的状态转换,状态解释如下
image-20240401162237271

  • Standby 复位后设备处于初始空闲态
  • Advertiser 广播者广播指定格式数据使其他设备知道自己可连接,广播消息可包含设备地址和一些附加数据比如设备名称
  • Scanner 接收广播消息时,扫描设备发送一个扫描请求给广播者,广播者回应一个扫描响应。这个过程称作设备发现。
  • Initiator 发起者需要选择一个对端设备去连接,当广播者接收到匹配的连接地址时,发起者可以发送连接请求建立连接。
  • Peripheral/Central 连接建立后,广播者为Peripheral作为Slave设备,发起者为Central作为Master设备。

根据上面介绍,我们知道Peripheral为发送广播消息的设备,也就是说Simple Peripheral工程会把Ble设备作为广播者,在测试时我们可以用手机作为Central设备来进行扫描连接。

Simple Peripheral工程解析

一. 总流程

—> main()
—> 初始化硬件模块、系统任务及建立自定义app任务
—> 进入Simple_Peripheral_createTask()【自定义app任务】
—> 进入回调函数SimplePeripheral_taskFxn()
—> 初始化app任务SimplePeripheral_init()
—> 处理(消息)事件及定时任务

1.1 打开Simple_Peripheral例程

在SDK安装路径中,参考我的路径:…\simplelink_cc13xx_cc26xx_sdk_7_10_01_24\examples\rtos\CC26X2R1_LAUNCHXL\ble5stack\simple_peripheral

1.2 main.c

1.2.1 初始化PIN 与 ICall 模块
// 初始化硬件Board_initGeneral();
// 初始化ICall软件模块,用于app和stack之间的通信ICall_init();
1.2.2 建立任务并启动BIOS
 // 启动远程任务,对应的ICall的入口点,包含stack任务,优先级5ICall_createRemoteTasks();// 初始化app任务,以后用户要添加一个自定义任务,都要这样添加SimpleBLEPeripheral_createTask();// 启动BiosBIOS_start();
1.2.4 完整代码
int main()
{/* Register Application callback to trap asserts raised in the Stack */RegisterAssertCback(AssertHandler);Board_initGeneral();// Enable iCache prefetchingVIMSConfigure(VIMS_BASE, TRUE, TRUE);// Enable cacheVIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);/* Update User Configuration of the stack */user0Cfg.appServiceInfo->timerTickPeriod = Clock_tickPeriod;user0Cfg.appServiceInfo->timerMaxMillisecond  = ICall_getMaxMSecs();/* Initialize ICall module */ICall_init();/* Start tasks of external images - Priority 5 */ICall_createRemoteTasks();SimplePeripheral_createTask();/* enable interrupts and start SYS/BIOS */BIOS_start();return 0;
}

接下来, 我们不看系统调度, 直接来看SimplePeripheral_createTask() 这个任务即可。

1.3 simple_Peripheral.c

app任务,以后用户要添加一个自定义任务,都要像这样模仿

1.3.1 SimplePeripheral_createTask
void SimplePeripheral_createTask(void)
{// 创建一个任务结构体Task_Params taskParams;// 配置任务Task_Params_init(&taskParams);taskParams.stack = spTaskStack;taskParams.stackSize = SP_TASK_STACK_SIZE; // 堆栈大小,在开发中需要适当增大taskParams.priority = SP_TASK_PRIORITY;    // 优先级,数值越小优先级越低// SimplePeripheral_taskFxn是任务回调函数,此函数不会返回Task_construct(&spTask, SimplePeripheral_taskFxn, &taskParams, NULL);
}
1.3.2 SimplePeripheral_taskFxn
static void SimplePeripheral_taskFxn(UArg a0, UArg a1)
{// app任务初始化函数SimplePeripheral_init();// 死循环运行app任务for (;;){....// 这里是处理收到(消息) 事件与定时器事件的地方//处理协议栈GAT,GATT,HCI等消息通知  SimplePeripheral_processStackMsg(pMsg);//处理Profile的回调,包括广播,配对,周期事件,自定义特征等消息callback   SimplePeripheral_processAppMsg(pMsg);....}
}

二. 处理(消息)事件流程

2.1 处理stack事件

在上述1.3.2死循环体中

  // 处理stack发送的消息if (ICall_fetchServiceMsg(&src, &dest,(void **)&pMsg) == ICALL_ERRNO_SUCCESS){uint8 safeToDealloc = TRUE;if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)){ICall_Stack_Event *pEvt = 

这篇关于蓝牙Simple Peripheral工程学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873431

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

MyBatisX逆向工程的实现示例

《MyBatisX逆向工程的实现示例》本文主要介绍了MyBatisX逆向工程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录逆向工程准备好数据库、表安装MyBATisX插件项目连接数据库引入依赖pom.XML生成实体类、

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用