蓝牙简学(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、服务和特性
  • 二、数据收发
  • 三、UUID


一、服务和特性

service、characteristic
下面的图是蓝牙协议的整体架构,
1.物理层:负责无线电波的收发和信号链路的管理
2.协议层:主要实现蓝牙协议栈
3.应用层:根据业务需求实现不同的程序,比如电池电量,温度计,hid键值,

基本要改的都在应用层,协议和物理很多都固定,都在芯片厂那里改

其中HCI是主机与控制器之间的通信接口,很多时候找bug会在这里捉。

在这里插入图片描述

我现在使用手机连接一个蓝牙鼠标,然后使用lightblue app进行查看它的服务和特性,这里只展示了部分

在这里插入图片描述
蓝牙设备应用层是通过特性和服务来实现的,
一个蓝牙设备可以有很多服务,一个服务又又很多的特性,每个特性又有读写,通知等权限。
每一个服务和特性都有一个uuid

在这里插入图片描述

uuid是蓝牙组织用于定义的,用于区分各个服务和特性的标识符,总长度是128bit;
在这里插入图片描述
其中,蓝牙组织允许用户使用16bit的uuid 与该基地址拼接,形成128bit的uuid,比如,使用16bit的uuid是2a37,
128bit就是00002a37 - 0000 - 1000 - 8000 - 00805f9b34fb
在这里插入图片描述

通过程序代码构建一个蓝牙应用设备,所要求的服务和特性
假如程序的要求是:
有一个服务其中uuid是9011,服务中有两个特性,特性A的uuid是9012,访问权限是可读,可写,特性B的uuid是9013,访问权限是可读,可通知
分3步写:
1.

#创建要使用的UUID
SERVER_1_UUID = ubluetooth.UUID(0x9011)
CHAR_A_UUID = ubluetooth.UUID(0x9012)
CHAR_B_UUID = ubluetooth.UUID(0x9013) 
#创建特性并设置特性的读写权限
CHAR_A = (CHAR_A_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_WRITE, )
CHAR_B = (CHAR_B_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_NOTIFY, ) 
SERVER_1 = (SERVER_1_UUID, (CHAR_A , CHAR_B, ) , ) #把特性A和特性B放入服务1
SERVICES = (SERVER_1, ) #把服务1放入服务集和中
((char_a, char_b), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts 

可将其放入上一个程序进行实验

二、数据收发

数据的收发都要依托上面服务中的特性这些数据点,其中他们的权限共有5种,分别是读,写,写但是无应答,通知,标示

在这里插入图片描述
其中,这些权限都有什么区别呢
通过手机和从设备来解释

1.读,手机读去从机某个特性的值
2.写,手机修改设备中某个特性的值
3.写但无应答,。。
4.通知,是设备里面的数据发生变化之后,通知手机来取数据
5.标示,跟通知类似,但是须有手机收到后回应

案例:

from machine import Pin
from time import sleep_ms
import ubluetooth        #导入BLE功能模块ble = ubluetooth.BLE()   #创建BLE设备
ble.active(True)         #打开BLE#创建要使用的UUID
SERVER_1_UUID = ubluetooth.UUID(0x9011)
CHAR_A_UUID = ubluetooth.UUID(0x9012)
CHAR_B_UUID = ubluetooth.UUID(0x9013)#创建特性并设置特性的读写权限
CHAR_A = (CHAR_A_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_WRITE | ubluetooth.FLAG_NOTIFY, )
CHAR_B = (CHAR_B_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_NOTIFY, )SERVER_1 = (SERVER_1_UUID, (CHAR_A , CHAR_B, ) , ) #把特性A和特性B放入服务1
SERVICES = (SERVER_1, ) #把服务1放入服务集和中
((char_a, char_b), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts#设置BLE广播数据并开始广播
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')def ble_irq(event, data): # 蓝牙中断函数if event == 1: #蓝牙已连接print("BLE 连接成功")elif event == 2: #蓝牙断开连接print("BLE 断开连接")ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')elif event == 3: #收到数据  ,当收到write请求时触发该事件onn_handle, char_handle = data #判断是来自那个特性的消息buffer = ble.gatts_read(char_handle) #读取接收到的消息print(char_handle, buffer) #打印消息内容ble.gatts_notify(0, char_handle, 'Hello') #回复Hello#这里是设备收到通知,就回复手机hello (手机要打开对设备的监听)ble.irq(ble_irq) 

三、UUID

蓝牙组织定义好的一些UUID,比如电量服务-0x180F

16bit uuid文档
在这里插入图片描述

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

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

相关文章

x-cmd pkg | procs - ps 命令的现代化替代品

目录 简介首次用户功能特点类似工具进一步阅读 简介 procs 是用 Rust 编写的 ps 替代品,用于显示有关任务进程的信息 首次用户 使用 x procs 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com)" 即可完成 x 命令安装, 详情参考 x-cmd…

python学完之后可以做什么,python学完可以做什么

大家好,小编来为大家解答以下问题,python学完可以做哪些工作,python学完之后可以做什么,今天让我们一起来看看吧! Python是一种全栈的开发语言,你如果能学好Python,前端,后端&#x…

Spring实现IoC:依赖注入/构造注入

● 控制反转,反转的是什么? ○ 将对象的创建权利交出去,交给第三方容器负责。 ○ 将对象和对象之间关系的维护权交出去,交给第三方容器负责。 ● 控制反转这种思想如何实现呢? ○ DI(Dependency Injection&…

【损失函数】Cross Entropy Loss 交叉熵损失

1、介绍 主页介绍的几种损失函数都是适用于回归问题损失函数,对于分类问题,最常用的损失函数是交叉熵损失函数 Cross Entropy Loss。它用于测量两个概率分布之间的差异,通常用于评估分类模型的性能。 2、公式 对于二分类问题,交…

SV-7042VP 15W sip网络有源音箱,可外接15W无源副音箱

SV-7042VP 15W sip网络有源音箱,可外接15W无源副音箱 一、描述 SV-7042VP是深圳锐科达电子有限公司的一款壁挂式SIP网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可达到功率15W。同时它可以外接一个15W的…

【GO语言卵细胞级别教程】01.GO基础知识

01.GO基础知识 目录 01.GO基础知识1.GO语言的发展历程2.发展历程3.Windowns安装4.VSCode配置5.基础语法5.1 第一段代码5.2 GO执行的流程5.3 语法规则5.4 代码风格5.5 学习网址 1.GO语言的发展历程 Go语言是谷歌公司于2007年开始开发的一种编程语言,由Robert Griese…

Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解

【saas云平台】打造全行业全渠道全场景的saas产品,为经营场景提供一体化解决方案;门店经营区域化、网店经营一体化,本地化、全方位、一站式服务,为多门店提供统一运营解决方案;提供丰富多样的营销玩法覆盖所有经营场景…

游戏引擎?

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。大部分都支持多种操作平台,如Linux、…

macOS跨进程通信: XPC 创建实例

一:简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单,但是比较绕。 主要需要集成 XPC Server 这个模块,这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭, 我们主app 进…

Flume基础知识(四):Flume实战之实时监控单个追加文件

1)案例需求: 实时监控 Hive 日志,并上传到 HDFS 中 2)需求分析: 3)实现步骤: (1)Flume 要想将数据输出到 HDFS,依赖 Hadoop 相关 jar 包 检查/etc/profile.d…

Spark内核解析-Spark shuffle6(六)

1、Spark Shuffle过程 1.1MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌、混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好。MapReduce中的Shuffle更像是洗牌的逆过程,把一组无规则的数据尽量转换成一组具有一定规则…

RFID数据中心智能资产管理系统

数据中心机房承担着保障企业关键数据处理的重要责任,机房的日常管理直接关系到整体机房的日常维护和运行安全,数据资产管理中心在监管机房各部分设备的运行情况、维护数据中心的资产方面发挥着重要的作用。 成功的数据中心机房管理不仅需要选择高可靠性…

NFT 项目入驻 NFTScan Site 流程说明

NFTScan Site 是由数据基础设施 NFTScan 推出的功能强大的 NFT 项目管理平台。NFTScan Site 主要为 NFT Collection、NFT Marketplace、NFTFi 以及其他 NFT 生态项目提供专业的项目管理后台服务和链上数据分析追踪服务。 NFTScan Site 功能: 1)项目信息编…

鸿蒙开发之Touch事件拦截stopPropagation()

在读Touch事件官方文档的时候,遇到了一个属性 其他属性都好理解,这个阻塞事件冒泡什么意思呢?官网也没有解释 后来查资料知道这个方法是阻止onTouch冒泡传递到父组件。 show code Entry Component struct OfficialTouchPage {State messa…

Java项目:108SSM教务管理系统

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 教务管理系统基于SpringSpringMVCMybatis开发,功能和学生成绩管理系统,学生选课管理系统类似,也可以做学生成绩管理系统…

C# .Net学习笔记—— 异步和多线程(Task)

一、概念 Task是DotNet3.0之后所推出的一种新的使用多线程的方式,它是基于ThreadPool线程进行封装的。 二、使用多线程的时机 任务能够并发运行的时候,提升速度;优化体验 三、基本使用方法 private void button5_Click(object sender, Ev…

Mysql 动态链接库配置步骤+ 完成封装init和close接口

1、创建新项目 动态链接库dll 2、将附带的文件都删除,创建LXMysql.cpp 3、项目设置 3.1、预编译头,不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…

Debian部署Mysql8.0

1、下载对应系统的mysql-apt-config包 wget https://repo.mysql.com/apt/debian/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.29-1_all.deb2、安装mysql-apt-config包 # 安装下载的deb包 sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb上下键选择菜单中…

Go语言中的HTTP请求和响应处理

在Web开发中,HTTP请求和响应是核心的交互方式。Go语言,作为一种高效且现代的编程语言,为开发者提供了简洁、强大的工具来处理HTTP请求和响应。本文将简要介绍在Go语言中如何处理HTTP请求和响应。 在Go语言中,HTTP请求和响应的处理…

[Linux c/c++] 关于进程名,线程名,/proc文件系统 等

参考: kernel - Why is the name of a process in /proc/PID/status not matching package name or ps command - Stack Overflowhttps://stackoverflow.com/questions/14176058/why-is-the-name-of-a-process-in-proc-pid-status-not-matching-package-name-or-ps…