将特征用户描述添加到多个自定义 C++ BLE GATT 服务

2024-01-07

我正在尝试使用以下命令将一些特征用户描述添加到我的自定义 BLE GATT 服务中mbed API https://developer.mbed.org/teams/Bluetooth-Low-Energy/。到目前为止我的工作是基于this https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_GATT_Example/代码结构。不过,我想为这些特征添加名称。我找不到太多关于如何执行此操作的信息。但是,下面是将信息添加到特征的代码。

GattCharacteristic() 的构造函数采用 GattAttribtues 数组作为可选参数。您可以将用户描述填充到 GattAttribute 中并将其传递给特性。我的这个结构适用于一个特征,但我正在努力将其复制到 3 个角色。我无法将整个过程复制 3 次,因为我运行它时遇到了许多有关已定义的数组等的问题。如果我将描述堆叠在数组中,GattArray 不会接受它吗?

uint16_t newServiceUUID         = 0xA000;
uint16_t PercentageUUID         = 0xA001;
uint16_t TimeUUID               = 0xA002;
uint16_t UseProfileUUID         = 0xA003;

const static char     DEVICE_NAME[]        = "Device"; // Device name
static const uint16_t uuid16_list[]        = {0xFFF};  
static uint8_t percentageValue[10] = {0};
GattAttribute nameDescr( BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Percentage", strlen("Percentage"));
GattAttribute *descriptors[] = {&nameDescr};

WriteOnlyArrayGattCharacteristic<uint8_t,sizeof(percentageValue)> 
        percentageChar( PercentageUUID, 
                        percentageValue,
                        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
                        descriptors, 
                        sizeof(descriptors) / sizeof(GattAttribute*) );

GattCharacteristic *characteristics[] = {&percentageChar, &timeChar, &UseProfileChar};
GattService        newService(newServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));

EDIT

通过下面的讨论,我现在有了:

#include <string>
class MyGattArray
{

public:
    MyGattArray( const std::string& name ) : 
        attr( BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)name.c_str(), (name.size()+1) )
    {
        descriptors[0] = &attr;
    }

    GattAttribute attr;
    GattAttribute *descriptors[1];
};

and

static uint8_t percentageValue[10] = {0};
MyGattArray PercentageName( "Percentage" );
GattAttribute *descriptors[] = {&(PercentageName.attr)};

WriteOnlyArrayGattCharacteristic<uint8_t,sizeof(percentageValue)> 
        percentageChar( PercentageUUID, 
                        percentageValue,
                        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
                        descriptors, 
                        sizeof(descriptors) / sizeof(GattAttribute*) );

这会构建,但不会给该特征命名。


这里提出一个模板帮助类,它可以封装特征对象及其描述符。如果不熟悉模板的话理解起来有点困难。

template <typename T, unsigned NUM_ELEMENTS, template <typename T, unsigned NUM_ELEMENTS> class CharacType>
class CharacteristicWithNameDescrptorHelper
{
public:
    CharacteristicWithNameDescrptorHelper( const          UUID &uuid,
                                           T              valuePtr[NUM_ELEMENTS],
                                           uint8_t        additionalProperties,
                                           const std::string& characName ) : 
        name( characName )
    {
        descriptor = new GattAttribute( BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)name.c_str(), name.size() ) 
        // create descriptor array
        descriptors[0] = descriptor;
        // create characteristic object:
        charac = new CharacType<T,NUM_ELEMENTS>( uuid, valuePtr, additionalProperties, descriptors, 1 );
    }

    ~CharacteristicWithNameDescrptorHelper()
    {
        delete charac;
        delete descriptor;
    }

    CharacType<T,NUM_ELEMENTS>* charac;
    std::string name;
    GattAttribute* descriptor;
    GattAttribute *descriptors[1];
};

然后,您只需执行以下操作:

CharacteristicWithNameDescrptorHelper<uint8_t,sizeof(percentageValue),WriteOnlyArrayGattCharacteristic> 
        percentageChar( PercentageUUID, 
                        percentageValue,
                        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
                        "Percentage" );

GattCharacteristic *characteristics[] = {percentageChar.charac};
GattService        newService(newServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将特征用户描述添加到多个自定义 C++ BLE GATT 服务 的相关文章

随机推荐

  • Unity 5 在 Mac OSX Yosemite 下崩溃

    有人在 Mac OSX Yosemite 上遇到过这个问题吗 构建后项目大小超过 250Mb 电脑参数 MacBook 13 i7 CPU 16Gb RAM 1 5GB GPU EDIT Mac OSX 的完整崩溃日志 http paste
  • 将参数传递给 xslt 中的 javascript 脚本

    是否可以在 XSLT 中处理 javascript 函数的参数 其中脚本位于标签之间 如果可能的话有人可以举个例子 谢谢 我认为您对这两件事感到困惑 XSLT 是用于 在本例中 生成 HTML javascript 的东西 一旦浏览器接收到
  • 带 tab-id 的 RedirectToAction()

    我在 ASP NET MVC 中有一个 Web 应用程序 其中有一个带有表单的 jqueryUI 选项卡 当我提交时 我想返回到打开的选项卡 使用 RedirectToAction 我创建了 url www foo com CV edit
  • 如何禁用 .htaccess 文件中的 mod_security?

    我们怎样才能禁用mod security通过使用 htaccessApache 服务器上的文件 我在我的个人域上使用 WordPress 并发布了一篇帖子 其中内容包含一些代码块 并且按照我的托管提供商的说法mod security出现错误
  • Sublime Text 3 中的 Qt 构建系统不起作用

    我有以下无法正常工作的构建系统文件 cmd qmake project cmd qmake cmd make working dir project path folder 没有生成任何文件 通常应创建以下文件 qmake project
  • Coredata - “NSObjectInaccessibleException - CoreData 无法完成错误”

    我是核心数据的新手 仍在弄清楚具体细节 这个错误已经困扰我几个小时了 我似乎找不到解决方案 任何帮助是极大的赞赏 问题是这样的 我有两个视图 它们从服务器获取数据并更新 UI 我已经这样设置流程了 view1 gt 从服务器发送 HTTP
  • 使用 TSA URL 和 Java API 进行时间戳记

    任何人都可以帮助我理解为签名添加时间戳时使用的流程和 Java API 我需要使用 TSA url 对文件进行签名并为其添加时间戳 http timestamp globalsign com scripts timstamp dll htt
  • 延迟加载 GTM 是个好主意吗

    为了缩短我正在开发的 Web 应用程序的初始加载时间 我想在加载应用程序后运行 GTM 脚本 我想知道这是否是一个好主意 如果我这样做 可能会产生什么副作用 TL dr 看来懒加载GTM也可以 长版 一般来说 我会按照创建者建议的方式运行脚
  • ZF2路由配置

    我刚刚构建了一个 zf2 项目 但遇到了配置问题 当我访问 mydomain com 时 此路由按照配置文件中指定的方式发送到应用程序模块 索引控制器 索引操作 但是如果我输入 mydomain com otheraction 这不会路由到
  • Django {{ MEDIA_URL }} 空白 @DEPRECATED

    在过去的几个小时里 我一直在为这个问题绞尽脑汁 我无法显示 MEDIA URL 在设置 py MEDIA URL http 10 10 0 106 ame TEMPLATE CONTEXT PROCESSORS django contrib
  • 如何使用 Material Design Lite 设置选择框格式?

    我已经通读了组件列表并通读了提供的 CSS 但我没有看到任何提及选择框的内容 只是常规输入 文本 单选 复选框 文本区域等 如何将 Material Design Lite 与选择框结合使用 使用这些类进行常规文本输入可以让您成功一半 但这
  • 如何创建指向网页某个子部分的深层链接?

    有谁知道如何创建指向单个网页的一小部分的深层链接 维基百科似乎已经破解了它 但我似乎无法在网络上的任何地方找到答案 PS 保持简单 仅当目标包含构成可在片段标识符中使用的 目标锚 的标记时 才可以链接到页面上的特定位置或元素 以 在链接中
  • java.awt.AWTError:无法使用 ':0' 作为 DISPLAY 变量的值连接到 X11 窗口服务器

    我一直在尝试运行一个Docker 内 Ubuntu VM 上基于 Java AWT 的应用程序 该应用程序非常简单 并且可以通过 Eclipse 在 Windows 上完美运行 它只是打开一个窗口并打印 hello world 事实上 当我
  • 突出显示 pandas 图中的最后一个数据点

    我有很多与此类似的图表 import pandas as pd dates pd date range 2012 01 01 2013 02 22 y np random randn len dates 365 Y pd Series y
  • 为什么当路径满足时 NWPathMonitor 不给出路径更新?

    我有一个简单的类名为网络路径监视器看起来如下 class NetworkPathMonitor ObservableObject Cancellable Published var path NWPath nil let monitor N
  • 编译器可以优化从堆到堆栈的分配吗?

    就编译器优化而言 将堆分配更改为堆栈分配是否合法和 或可能 或者这会打破假设规则 https stackoverflow com questions 15718262 what exactly is the as if rule 例如 假设
  • 为什么当构建错误退出时,来自 docker 文件的 docker 构建镜像会创建容器?

    我正在使用 docker 从 docker 文件构建图像 在此过程中发生了一些错误 因此构建退出并显示错误代码 当我跑步时docker images我可以看到未标记的图像 所以我尝试删除它docker rmi xxxxx 但它总是失败 它说
  • 通过react-image-crop模块获取裁剪后的图像

    你能帮我如何通过react image crop模块获得输出 裁剪图像的来源 吗 上传组件如下所示 class MyUpload extends Component constructor super this state src sour
  • 无法在 64 位 Linux 上运行 32 位应用程序

    我安装了 Ubuntu 8 04 64 位的最小安装版 当我尝试运行一些 32 位程序时 例如我的jhead程序 我收到消息No such file or directory 我认为这可能是一个库问题 但是当我这样做时 ldd jhead
  • 将特征用户描述添加到多个自定义 C++ BLE GATT 服务

    我正在尝试使用以下命令将一些特征用户描述添加到我的自定义 BLE GATT 服务中mbed API https developer mbed org teams Bluetooth Low Energy 到目前为止我的工作是基于this h