蓝牙 - BLE SPP实现举例 (Bluecode Protocol Stack)

news2024/11/15 19:39:27

这里以一个无线扫描枪设备为例,这个设备会通过蓝牙通讯协议连接一个底座,使用的是BLE SPP进行通讯。

扫描枪用来扫条码,解析出条码信息后,将数据通过无线传输给底座,底座再通过USB将数据传送给电脑。

底座是Central device,扫描枪是peripheral device,因为底座需要连接多个扫描枪。通常是扫描枪提供数据给底座,没数据可能会进入休眠状态。底座有USB供电,处于一直等待接收数据的状态。

也就是说扫描枪发布蓝牙广播信息,底座作为扫描方,接收蓝牙广播信息,发现扫描枪后,发起连接。

当底座连接多个扫描枪时,对Service的Characteristic进行读写操作,来实现串口通讯功能。一个通讯链路,需要一套用于数据通讯的Service和Characteristic。扫描枪和底座连接,这个Service和Characteristic实例放在扫描枪上。如果放在底座上,则会存在多个Service和Characteristic实例,会出现冲突,难以管理。故应由扫描枪来作为GATT Server,底座作为GATT Client。这里的Service和Characteristic指的是用于BLE SPP的,使用的是指定UUID,不同厂商(协议栈不同)使用的UUID可能是不同的。

本文使用的是Bluecode蓝牙协议栈,是和Telit公司提供的蓝牙模组一起使用的。参考的是此蓝牙扫描枪和蓝牙底座项目。

扫描枪的蓝牙操作

1,设置广播数据

在想连接的Target Device的地址发生变化时,才需要更新广播数据。

广播类型是非定向广播。

数据构造是小端顺序。

这里设置的数据分为广播数据及扫描响应数据,两个都是31字节。

  • 广播数据里是Flags,16bit Service UUID,Manufacturer Specific Data。在Manufacturer Specific Data的数据格式为:VendorID、TIO Data ID、Data Version、Bondable and functional mode、connection requested、Connect option、BT Address。默认情况下,Connect option值为0,表示连接的是Base,即底座。

  • 扫描响应数据里的数据是Complete local name。

扫描枪发布广播数据,底座想连接的话,收到广播数据,使用里面的地址,就可以连接扫描枪设备了。

Flags是0x06,16bit Service UUID是0xFEFB。Manufacturer Specific Data里,VendorID是0x008F。

2,注册相关服务。

在扫描枪这个产品中,注册了两个服务。一个DIS,Device Information service,160bit UUID是0x180A。

另一个就是BLE SPP service,即TIO profile了。

但具体的Service注册过程,在此项目中没有看到。需另外查询此协议栈的相关文档或SDK的demo。

底座的蓝牙操作

1,创建一个Periodic Scan Timer,作为GATT client设备,启动后就开始周期扫描,扫描方式是passive被动性扫描。

  • 参数设置:

scanInterval,128 tick (0.625ms one tick),80ms。

scanWindows,128 tick (0.625ms one tick),80ms。

开启Duplicate Filter。

  • 时序:

开始扫描,并启动一个300ms Timer;300ms Timer到了,停止扫描;Delay 300ms,等待协议栈线程的扫描结果处理;300ms时间到了,查询是否发现新设备;再等300ms;一个周期结束,重复上个周期操作,开始扫描。

大概就是900ms一个周期,有300ms的扫描时间。

2,收到并处理广播数据

进入被动扫描模式后,当接收到广播数据包,协议栈会发送事件,调用事件处理函数。

此处理函数是HandleBlueAPIMessage,处理的消息事件是blueAPI_EventLEScanInfo。

接受的数据就是31个字节,

要判断的条件有三个:

a, TIO Service UUID的值是否是0xFEFB,Telit Wireless Solutions (Formerly Stollmann E+V GmbH),在Assigned Numbers里能查到。

b, Vendor ID是否是0x008F(Telit Wireless Solutions GmbH),在Assigned Numbers里能查到。

c,Data ID是否是TIO ID,0xB009。

d,Connect option字节是否为0,表示请求连接。

然后将地址后面地址信息存储下来。

3,广播数据处理成功

在广播数据处理成功后,即得到了一个请求连接的蓝牙地址。在上面的Period Scan处理过程中,在查询是否发现新设备的处理中,使用得到的蓝牙设备地址请求一个GATT链接。

等待GATT链接请求的反馈结果,结果正确后,针对此蓝牙地址发送Discover Request,并等待反馈结果。

结果正确后,调用BLE SPP的请求连接的函数,反馈结果成功,则连接过程结束。

4,Discover过程

上面发送了Discover请求后,会收到协议栈反馈的Endpoint Indicate事件,里面包含了SPP的port信息。在BLE SPP请求连接时要使用这个信息,确定想连接的SPP port端口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1152589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非科班出身的野生Android也可以跳到大厂

野生Android从业者,非科班出身,在小公司打杂2年后,"意外"地拿到了大厂的offer。 高中毕业后,我选择了一条不太寻常的路,(花大几万)进入编程培训班,后来又自修课程&#xf…

【LeetCode刷题-哈希】--387.字符串中的第一个唯一字符

387.字符串中的第一个唯一字符 class Solution {public int firstUniqChar(String s) {Map<Character,Integer> map new HashMap<>();for(int i 0;i<s.length();i){char c s.charAt(i);map.put(c,map.getOrDefault(c,0)1); }for(int i 0;i< s.length();i…

Java进阶(ConcurrentHashMap)——面试时ConcurrentHashMap常见问题解读 结合源码分析 多线程CAS比较并交换 初识

前言 List、Set、HashMap作为Java中常用的集合&#xff0c;需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中线程安全的ConcurrentHashMap集合的面试问题&#xff0c;结合源码分析题目背后的知识点。 关于List的博客文章如下&#xff1a; Java进阶&#xff08;Lis…

IDEA MyBatisX插件介绍

一、前言 前几年写代码的时候&#xff0c;要一键生成DAO、XML、Entity基础代码会采用第三方工具&#xff0c;比如mybatis-generator-gui等&#xff0c;现在IDEA或Eclipse都有对应的插件&#xff0c;像IDEA中MyBatisX就是一个比较好用的插件。 二、MyBatisX安装配置使用 MyBa…

C的缺陷和陷阱读书笔记

词法陷阱 1、if语句的特殊用法 1、if(x>max) maxx;2、if(x>max?x;max) //条件表达式&#xff0c;是执行第二个&#xff0c;否执行第三个3、if(x>max); //条件成立后执行——空语句4、if((fopen(arg v[i],0))>0) //open函数执行&#xff0c;成功返回后面的0&a…

Maven系列第9篇:多环境构建,作为核心开发,这个玩不转有点说不过去!

如果你作为公司核心开发&#xff0c;打算使用maven来搭建项目骨架&#xff0c;这篇文章的内容是你必须要掌握的。 平时我们在开发系统的时候&#xff0c;会有开发环境、测试环境、线上环境&#xff0c;每个环境中配置文件可能都是不一样的&#xff0c;比如&#xff1a;数据库的…

Matlab2022b图文安装保姆级教程

注意&#xff1a;完成安装步骤1和步骤2之后&#xff0c;再去使用Matlab2022b 本次安装后的版本信息如下&#xff0c;64位软件&#xff0c;windows系统 Matlab2022a与2022b的比较 MATLAB主要用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险…

宝塔Linux面板Java项目前后端部署 (PHP部署前端文件)

1. 上传前端文件 将整个文件夹拖进来 2. PHP项目 (添加站点) 添加证书SSL 新增配置文件 location /dev-api/{proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_…

Multi-gpu问题(1)

Multi-gpu问题 域在z方向划分为num_gpus段&#xff0c;其中num_gpus表示可用GPU的数量&#xff0c;然后每个GPU相应地负责一个大小为nxny&#xff08;nz/num_gpus&#xff09;的子域。 虽然整个域在主机端表示&#xff0c;但gpu只存储它们的子域。由于更新GPU k&#xff08;k …

【计算机网络笔记】传输层——UDP简介

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

安防监控项目---web点灯(网页发送命令控制A9的led)

文章目录 前言一、web点亮LED流程二、静态网页设计&#xff08;html界面&#xff09;三、 CGI和BOA在本项目中的使用总结 前言 书接上期&#xff0c;和大家分享的是web点灯&#xff0c;哈哈哈&#xff0c;谈论起点灯这个词&#xff0c;这么久以来我已然已经成长为一名合格的点…

C#,数值计算——分类与推理Svmpolykernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmpolykernel : Svmgenkernel { public int n { get; set; } public double a { get; set; } public double b { get; set; } public double d { get; set; …

gRPC源码剖析-Builder模式

一、Builder模式 1、定义 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的的表示。 2、适用场景 当创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须允许被构造的对象有不同的表示时。 说人话&#xff1a…

java之数组的定义以及使用

文章目录 定义数组1. 定义数组并分配内存空间&#xff1a;2. 定义并初始化数组的值&#xff1a;3. 动态初始化数组&#xff1a;4. 使用数组长度属性&#xff1a;5. 多维数组的定义&#xff1a; 数组的应用数组赋值&#xff1a;1. 直接赋值&#xff1a;直接初始化数组&#xff1…

多线程---synchronized特性+原理

文章目录 synchronized特性synchronized原理锁升级/锁膨胀锁消除锁粗化 synchronized特性 互斥 当某个线程执行到某个对象的synchronized中时&#xff0c;其他线程如果也执行到同一个对象的synchronized就会阻塞等待。 进入synchronized修饰的代码块相当于加锁 退出synchronize…

【UE 模型描边】UE5中给模型描边 数字孪生 智慧城市领域 提供资源下载

目录 0 引言1 Soft Outlines1.1 虚幻商城1.2 使用步骤 2 Auto Mesh Outlines2.1 虚幻商城2.2 使用步骤 3 Survivor Vision3.1 虚幻商城3.2 使用步骤 结尾 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xf…

设计模式_状态模式

状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的&#xff1a;攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…

一个注解,实现数据脱敏-plus版

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 当看到这个文章名的时候&#xff0c;是不是很熟悉&#xff0c;是的shigen之前发表了一个这…

[C++]命名空间等——喵喵要吃C嘎嘎

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

CSRF 篇

一、CSRF 漏洞&#xff1a; 1、漏洞概述&#xff1a; &#xff08;1&#xff09;一般情景&#xff1a; 利用已认证用户的身份执行未经用户授权的操作。攻击者试图欺骗用户在其不知情的情况下执行某些操作&#xff0c;通常是在受害者已经登录到特定网站的情况下。 &#xff0…