当前位置: 首页 > news >正文

如何让Nrf connect、EFR connect直接显示特征值数据及其单位

效果如图:app直接显示了我的温度,并且有两位小数,还有温度单位。这是怎么做到的呢?

这次我们仍以TLS8258为例,当然如果是其他蓝牙芯片,配置方式也是大差不差,规则一样的。

#define GATT_CHARACTERISTIC_TYPE_TEMPERATURE (0x2B11) //(0x2A6E)只有2Bytes.(0x2B11) 4Bytes
static const u16 my_debug_ServiceUUID = 0xFFF0;static const u16 my_debug_test_temperature_characteristic_uuid = GATT_CHARACTERISTIC_TYPE_TEMPERATURE;
static const u16 my_debug_test_temperature_characteristic_value_presentation_format_uuid = GATT_UUID_CHAR_PRESENT_FORMAT;
static const u8 my_debug_test_temperature_declaration[5] = {CHAR_PROP_READ | CHAR_PROP_NOTIFY,U16_LO(DebugTestTemperature_CharacteristicValueDeclarationHandle),U16_HI(DebugTestTemperature_CharacteristicValueDeclarationHandle),U16_LO(GATT_CHARACTERISTIC_TYPE_TEMPERATURE),U16_HI(GATT_CHARACTERISTIC_TYPE_TEMPERATURE)
};
static const u8 debug_test_temperature_characteristic_value_presentation_format[7]=
{0x10,//int32_t0xFE,//exponent0x2F,//unit LSB   2F:℃; AC:℉; 05:K0x27,//unit MSB0x01,//bluetooth BIG0x00,//none0x00//none
};
static const u8 debug_test_temperature_characteristic_user_description[] =
{'T','e','m','p','e','r','a','t','u','r','e','-','1'
};
_attribute_data_retention_ static u8 debug_test_temperature_client_characteristic_configuration[2] = {0,0};
_attribute_data_retention_ static u8 debug_test_temperature_characteristic_value[4] = {0x01,0x02,0x03,0x04};//LSB<--->MSB
ble_sts_t server_send_debug_test_temperature_to_client(int32_t temperature)
{debug_test_temperature_characteristic_value[0] = (temperature>>0)&0xFF;debug_test_temperature_characteristic_value[1] = (temperature>>8)&0xFF;debug_test_temperature_characteristic_value[2] = (temperature>>16)&0xFF;debug_test_temperature_characteristic_value[3] = (temperature>>24)&0xFF;if(blc_ll_getCurrentState() == BLS_LINK_STATE_ADV){return 0xFF;}return blc_gatt_pushHandleValueNotify(BLS_CONN_HANDLE,DebugTestTemperature_CharacteristicValueDeclarationHandle,&debug_test_temperature_characteristic_value[0],sizeof(debug_test_temperature_characteristic_value));
}//characteristic 2
static const u16 my_debug_test_temperature2_characteristic_uuid = 0xFFF1;
static const u16 my_debug_test_temperature2_characteristic_value_presentation_format_uuid = GATT_UUID_CHAR_PRESENT_FORMAT;
static const u8 my_debug_test_temperature2_declaration[5] = {CHAR_PROP_READ | CHAR_PROP_NOTIFY,U16_LO(DebugTestTemperature2_CharacteristicValueDeclarationHandle),U16_HI(DebugTestTemperature2_CharacteristicValueDeclarationHandle),U16_LO(GATT_CHARACTERISTIC_TYPE_TEMPERATURE),U16_HI(GATT_CHARACTERISTIC_TYPE_TEMPERATURE)
};
static const u8 debug_test_temperature2_characteristic_value_presentation_format[7]=
{0x10,//int32_t0xFE,//exponent0x2F,//unit LSB   2F:℃; AC:℉; 05:K0x27,//unit MSB0x01,//bluetooth BIG0x00,//none0x00//none
};
static const u8 debug_test_temperature2_characteristic_user_description[] =
{'T','e','m','p','e','r','a','t','u','r','e','-','2'
};
_attribute_data_retention_ static u8 debug_test_temperature2_client_characteristic_configuration[2] = {0,0};
_attribute_data_retention_ static u8 debug_test_temperature2_characteristic_value[4] = {0x01,0x02,0x03,0x04};//LSB<--->MSB
ble_sts_t server_send_debug_test_temperature2_to_client(int32_t temperature)
{debug_test_temperature2_characteristic_value[0] = (temperature>>0)&0xFF;debug_test_temperature2_characteristic_value[1] = (temperature>>8)&0xFF;debug_test_temperature2_characteristic_value[2] = (temperature>>16)&0xFF;debug_test_temperature2_characteristic_value[3] = (temperature>>24)&0xFF;if(blc_ll_getCurrentState() == BLS_LINK_STATE_ADV){return 0xFF;}return blc_gatt_pushHandleValueNotify(BLS_CONN_HANDLE,DebugTestTemperature2_CharacteristicValueDeclarationHandle,&debug_test_temperature2_characteristic_value[0],sizeof(debug_test_temperature2_characteristic_value));
}static const attribute_t my_Attributes[] = {{ATT_END_H - 1, 0,0,0,0,0,0,0},	// total num of attribute// 0x0001 - 0x0007  GAP{7,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID), 	(u8*)(&my_gapServiceUUID), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_devNameCharVal),(u8*)(&my_characterUUID), (u8*)(my_devNameCharVal), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_devName), (u8*)(&my_devNameUUID), (u8*)(my_devName), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_appearanceCharVal),(u8*)(&my_characterUUID), (u8*)(my_appearanceCharVal), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof (my_appearance), (u8*)(&my_appearanceUUID), 	(u8*)(&my_appearance), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_periConnParamCharVal),(u8*)(&my_characterUUID), (u8*)(my_periConnParamCharVal), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof (my_periConnParameters),(u8*)(&my_periConnParamUUID), 	(u8*)(&my_periConnParameters), 0, 0},// 0x0008 - 0x000B GATT{4,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID), 	(u8*)(&my_gattServiceUUID), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_serviceChangeCharVal),(u8*)(&my_characterUUID), 		(u8*)(my_serviceChangeCharVal), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof (serviceChangeVal), (u8*)(&serviceChangeUUID), 	(u8*)(&serviceChangeVal), 0, 0},{0,ATT_PERMISSIONS_RDWR,2,sizeof (serviceChangeCCC),(u8*)(&clientCharacterCfgUUID), (u8*)(serviceChangeCCC), 0, 0},// Battery Service /// 0x002A - 0x002D{4,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID), 	(u8*)(&my_batServiceUUID), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_batCharVal),(u8*)(&my_characterUUID), (u8*)(my_batCharVal), 0, 0},				//prop{0,ATT_PERMISSIONS_READ,2,sizeof(my_batVal),(u8*)(&my_batCharUUID), 	(u8*)(my_batVal), 0, 0},	//value{0,ATT_PERMISSIONS_RDWR,2,sizeof(batteryValueInCCC),(u8*)(&clientCharacterCfgUUID), 	(u8*)(batteryValueInCCC), 0, 0},	//value#if (BLE_OTA_SERVER_ENABLE)// OTA /// 0x002E - 0x0032{5,ATT_PERMISSIONS_READ, 2,16,(u8*)(&my_primaryServiceUUID), 	(u8*)(&my_OtaServiceUUID), 0, 0},{0,ATT_PERMISSIONS_READ, 2, sizeof(my_OtaCharVal),(u8*)(&my_characterUUID), (u8*)(my_OtaCharVal), 0, 0},				//prop{0,ATT_PERMISSIONS_RDWR,16,sizeof(my_OtaData),(u8*)(&my_OtaUUID),	(&my_OtaData), &otaWrite, NULL},				//value{0,ATT_PERMISSIONS_RDWR,2,sizeof(otaDataCCC),(u8*)(&clientCharacterCfgUUID), 	(u8*)(otaDataCCC), 0, 0},				//value{0,ATT_PERMISSIONS_READ, 2,sizeof (my_OtaName),(u8*)(&userdesc_UUID), (u8*)(my_OtaName), 0, 0},
#endif#if(DEBUG_INTERFACE_TO_GATT){11,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID), 	(u8*)(&my_debug_ServiceUUID), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_debug_test_temperature_declaration),(u8*)(&my_characterUUID),(u8*)(my_debug_test_temperature_declaration), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(debug_test_temperature_characteristic_value),(u8*)(&my_debug_test_temperature_characteristic_uuid), (u8*)(debug_test_temperature_characteristic_value), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(debug_test_temperature_characteristic_value_presentation_format), (u8*)(&my_debug_test_temperature_characteristic_value_presentation_format_uuid), (u8*)(&debug_test_temperature_characteristic_value_presentation_format), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(debug_test_temperature_characteristic_user_description), (u8*)(&userdesc_UUID), (u8*)(&debug_test_temperature_characteristic_user_description), 0, 0},{0,ATT_PERMISSIONS_RDWR,2,sizeof(debug_test_temperature_client_characteristic_configuration),(u8*)(&clientCharacterCfgUUID), (u8*)(debug_test_temperature_client_characteristic_configuration), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(my_debug_test_temperature2_declaration),(u8*)(&my_characterUUID),(u8*)(my_debug_test_temperature2_declaration), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(debug_test_temperature2_characteristic_value),(u8*)(&my_debug_test_temperature2_characteristic_uuid), (u8*)(debug_test_temperature2_characteristic_value), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(debug_test_temperature2_characteristic_value_presentation_format), (u8*)(&my_debug_test_temperature2_characteristic_value_presentation_format_uuid), (u8*)(&debug_test_temperature2_characteristic_value_presentation_format), 0, 0},{0,ATT_PERMISSIONS_READ,2,sizeof(debug_test_temperature2_characteristic_user_description), (u8*)(&userdesc_UUID), (u8*)(&debug_test_temperature2_characteristic_user_description), 0, 0},{0,ATT_PERMISSIONS_RDWR,2,sizeof(debug_test_temperature2_client_characteristic_configuration),(u8*)(&clientCharacterCfgUUID), (u8*)(debug_test_temperature2_client_characteristic_configuration), 0, 0},
#endif
};

disclaimer:

本 文 仅 代 表 作 者 个 人 观 点 限 制 在 修 改 日 期 前 , 不 代 表 现 在 观 点 。 其 原 创 性 以 及 文 中 陈 述 文 字 和 内 容 未 经 学 术 机 构 或 标 准 组 织 证 实 , 对 本 文 以 及 其 中 全 部 或 者 部 分 内 容 、 文 字 的 真 实 性 、 完 整 生 及 时 性 本 人 不 作 任 何 保 证 或 承 诺 , 请 读 者 仅 作 参 考 , 并 请 自 行 核 实 相 关 内 容 。 仅 供 学 习 参 考 ! 如 有 侵 权 或 交 流 , 请 邮 件 flourishinggarden@outlook.com  , 谢 谢 !

copyright:

引 清 注 明 出 处 , 转 载 或 者 引 用 需 注 明 " 转 自 〔 或 引 用 自 〕 FlourishingMind" 字 样 。

相关文章:

如何让Nrf connect、EFR connect直接显示特征值数据及其单位

效果如图&#xff1a;app直接显示了我的温度&#xff0c;并且有两位小数&#xff0c;还有温度单位。这是怎么做到的呢&#xff1f; 这次我们仍以TLS8258为例&#xff0c;当然如果是其他蓝牙芯片&#xff0c;配置方式也是大差不差&#xff0c;规则一样的。 #define GATT_CHARA…...

python笔记

Vim 修改文件格式 unix|dos vim fileName :set ff //显示出文件格式类型 :set ffunix //设置成unix格式 :set ffdos //windows文件格式python *和**的区别 将可变关键字打包成不可变的元组 def func(*args): print(args) func(1, 2, 3) # 输出&#xff1a;(1, 2, 3)…...

Java编译期注解处理器AbstractProcessor使用

我们接触的注解主要分为以下两类 运行时注解&#xff1a;通过反射在运行时动态处理注解的逻辑编译时注解&#xff1a;通过注解处理器在编译期动态处理相关逻辑 编译期注解我们常用的有Lombok&#xff0c;在class文件中自动生成get和set方法 解编译期处理流程最关键的一个类就…...

JetBrains相关的IDE有哪些?

JetBrains是一家成立于2002年的捷克软件开发公司&#xff0c;总部位于捷克的布拉格&#xff0c;同时在俄罗斯的圣彼得堡及美国麻州波士顿等地设有办公室。该公司以其高质量的集成开发环境&#xff08;IDE&#xff09;产品而闻名&#xff0c;这些产品被广泛应用于各种编程语言和…...

Git-常规用法-含解决分支版本冲突解决方法

目录 前置条件 已经创建了Gitee账号 创建一个远程仓库 Git的优点 版本控制 Git 下载 Git的使用 检查Git的是否安装成功 git的常用命令 常用流程 Git 分支 分支流程 Git 远程仓库 远程仓库流程 特殊 可能遇到的问题 前置条件 已经创建了Gitee账号 创建一个远程仓…...

基于springboot实现大型商场应急预案管理系统项目【项目源码+论文说明】

基于SpringBoot实现大型商场应急预案管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大型商场应急预案管理系统的开发全过程。通过分析大型商场应急预案管理系统管理的不足&#xff0c;创建了一个…...

系统学c#:1、基础准备(软件下载与安装)

一、Vs软件下载与安装 访问Visual Studio官方网站&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads 下载Visual Studio 运行exe文件&#xff0c;点击“继续” 初始文件安装完成后选择我们需要安装的项&#xff0c;并勾选好必要的单个组件&#xff0c;设…...

解决CSS中鼠标移入到某个元素其子元素被遮挡的问题

我们在开发中经常遇到一种场景&#xff0c;就是给元素加提示信息&#xff0c;就是鼠标移入到盒子上面时&#xff0c;会出现提示信息这一功能&#xff0c;如果我们给盒子加了hover&#xff0c;当鼠标移入到盒子上时&#xff0c;让他往上移动5px&#xff0c;即transform: transla…...

【华为OD机试】虚拟理财游戏【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。 现有一家Bank,它提供有若干理财产品 m 个,风险及投资回报不同,你有 N(元)进行投资,能接收的总风险…...

ssh 使用

ssh 使用 一、ssh 安装二、ssh 使用1. ssh 登录2. ssh-keygen 免密登录(1) ssh 生成密钥(2) 开启远程主机的密钥登陆(3) ssh 分发公钥 3. ssh-copy-id 复制公钥到远程主机4. scp 复制 系统环境: linux(ubuntu,debian,kali) 一、ssh 安装 sudo apt update sudo apt install op…...

Springboot+Vue项目-基于Java+MySQL的母婴商城系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

Android多线程:Handler runOnUiThread 异步消息处理机制

目录 一&#xff0c;Android中的多线程问题 1.模拟耗时工作 2.Android开启子线程 二&#xff0c;在子线程中更新UI 1.异步消息处理机制 Handler 2.使用runOnUiThread更新UI 一&#xff0c;Android中的多线程问题 Android用户界面是与用户交互的接口&#xff0c;对于用户的…...

AndroidStudio 导出aar包,并使用

打包 1、确认当前选项是否勾选&#xff0c;如未勾选请先勾选。 2、勾选完成后重启Android Studio。 3、重启完成后&#xff0c;选中要打包的module 4、打包完成 使用 1.在项目中新建libs,放入aar文件。 2.修改配置 添加如下代码 flatDir {dirs("libs")}3.修改app…...

python与设计模式之工厂模式的那些事儿

一、工厂模式 工厂模式实现了按需创建的最佳模式&#xff0c;其目的是为了隐藏创建类的细节与过程&#xff0c;通过一个统一的接口来创建所需的对象。 话说没了皇位争夺权的皇三接到了一个外征的工作&#xff0c;始皇给了5个亿的经费让皇三组建一个军队。打权总是要进行武器采…...

什么是区块链?

简介 作者在学习虚拟机时突然发现有人提出如何在区块链开发一款轻量型jvm&#xff0c;由于对区块链不太了解&#xff0c;也不理解区块链为什么需要轻量型jvm。恰好最近有空&#xff0c;泡在图书馆找了本书《区块链导论》对相关知识进行了学习。 区块链系统&#xff1b; 特点…...

2022年电赛F题23年电赛D题-信号调制度测量装置说明中提到带通采样定律。

2022年电赛F题-信号调制度测量装置说明中提到带通采样定律。 23年电赛D题十分相似&#xff0c;但是22年载波达到了10M&#xff0c;根据奈奎斯特采样定理&#xff0c;我们知道想要分析出频谱不混叠的频谱图&#xff0c;采样率必须大于最大谐波的二倍。那么就意味着AD采样率要大…...

Rust面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…...

Linux笔记之查看docker容器目录映射

Linux笔记之查看docker容器目录映射 —— 2024-04-15 code review! docker inspect 容器ID或容器名 | grep -A 20 Mounts实践 grep -A 参数详解&#xff1a; grep 的 -A 参数用于在输出中包括匹配行后的指定数目的行。 使用 -A 参数 该参数的基本语法如下&#xff1a; …...

​​​​网络编程探索系列之——广播原理剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之广播原理剖析&#xff0c;在这篇文章中&#xff0c; 你将会学习到如何在网络编程中利用广播来与局域网内加入某个特定广播组的主机&#xff01; 希望这篇文章能对你有所帮助&#xff0c;大家要是觉得我写…...

jar包解压和重新打包

1、Windows系统上解压和重新打包jar包的命令&#xff1a; (1). 解压jar包&#xff1a; jar -xf yourJarFile.jar (2). 重新打包jar包&#xff1a; jar -cf newJarFile.jar * 2、Linux系统上解压和重新打包jar包的命令&#xff1a; (1). 解压jar包&#xff1a; unzip your…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...