Nano Hash - криптовалюты, майнинг, программирование

Почему реклама с ADV_DATA выдает недопустимые параметры

Я пытаюсь написать код BlueZ с помощью Management API, но не могу заставить BlueZ рекламировать произвольные данные в рекламной системе.

У меня есть 2 теста: один на C++ и один с использованием инструмента btmgmt, выпущенного BlueZ.

Когда я запускаю эту команду, она терпит неудачу таким образом

btmgmt add-adv -d 8C33 1
Add Advertising failed with status 0x0d (Invalid Parameters)

Эквивалентный код C++ также не работает одинаково

#include <iostream>

extern "C" {
  #include "external/bluetooth/lib/bluetooth.h"
  #include "external/bluetooth/lib/mgmt.h"
  #include "external/bluetooth/lib/hci.h"
  #include "external/bluetooth/lib/hci_lib.h"
  #include "external/bluetooth/src/shared/mgmt.h"
}

static void setup_dv(uint8_t status, uint16_t length,
                     const void *param, void *user_data)
{
  std::cout << "good" << std::endl;
}

struct CPadvertising {
        uint8_t  instance;
        uint32_t flags;
        uint16_t duration;
        uint16_t timeout;
        uint8_t  adv_data_len;
        uint8_t  scan_rsp_len;
        uint8_t  data[4];
} __packed;


int main()
{
  mgmt* sock =  mgmt_new_default();


  CPadvertising* data = new CPadvertising();

  data->instance = 1;
  data->duration = 2;
  data->timeout = 100;
  data->adv_data_len = 4;
  data->scan_rsp_len = 0;
  data->flags = 0;
  data->data[0] = 8;
  data->data[1] = 12;
  data->data[2] = 3;
  data->data[3] = 3;

  mgmt_send(sock, MGMT_OP_ADD_ADVERTISING, index, 
  sizeof(CPadvertising), data, setup_dv, nullptr, nullptr);
  auto  loop = g_main_loop_new(nullptr, FALSE);
  g_main_loop_run(loop);

}

имеет этот вывод в btmon

@ MGMT Command: Add Advertising (0x003e) plen 13                               {0x0003} [hci0] 98.205359
        Instance: 1
        Flags: 0x00000000
        Duration: 2
        Timeout: 100
        Advertising data length: 4
        8 c 3 3                                            .3              
        Scan response length: 0
@ MGMT Event: Command Status (0x0002) plen 3                                   {0x0003} [hci0] 98.205376
      Add Advertising (0x003e)
        Status: Invalid Parameters (0x0d)

Ссылаясь на эти документы, я не должен получать недопустимый параметр для любого из них, но я делаю

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/mgmt-api.txt


Однако я знаю, что некоторые типы данных действительно работают.

btmgmt add-adv -d 080954657374204C45

работает даже еще более странным образом, вызывая этот вывод на btmon

@ MGMT Command: Add Advertising (0x003e) plen 20                              {0x0002} [hci0] 143.671485
        Instance: 1
        Flags: 0x00000000
        Duration: 0
        Timeout: 0
        Advertising data length: 9
        Name (complete): Test LL <--- What is this
        Scan response length: 0
11.08.2020

Ответы:


1

Глядя на источник для btmgmt, доступны следующие варианты:

static void add_adv_usage(void)
{
    bt_shell_usage();
    print("Options:\n"
        "\t -u, --uuid <uuid>         Service UUID\n"
        "\t -d, --adv-data <data>     Advertising Data bytes\n"
        "\t -s, --scan-rsp <data>     Scan Response Data bytes\n"
        "\t -t, --timeout <timeout>   Timeout in seconds\n"
        "\t -D, --duration <duration> Duration in seconds\n"
        "\t -P, --phy <phy>           Phy type, Specify 1M/2M/CODED\n"
        "\t -c, --connectable         \"connectable\" flag\n"
        "\t -g, --general-discov      \"general-discoverable\" flag\n"
        "\t -l, --limited-discov      \"limited-discoverable\" flag\n"
        "\t -n, --scan-rsp-local-name \"local-name\" flag\n"
        "\t -a, --scan-rsp-appearance \"appearance\" flag\n"
        "\t -m, --managed-flags       \"managed-flags\" flag\n"
        "\t -p, --tx-power            \"tx-power\" flag\n"
        "e.g.:\n"
        "\tadd-adv -u 180d -u 180f -d 080954657374204C45 1");
}

Глядя на рекламу, которая сработала, первое число — это длина данных, второе — это data_type, а остальное — строка local name. Так:

0x08 = Length of datatype is 8
0x09 = Data type is <Complete Local Name>
0x54 = T
0x65 = e
0x73 = s
0x74 = t
0x20 = ' ' 
0x4C = L
0x45 = E

Не уверен, почему это оказалось Test LL в выводе btmon. Я предполагаю, что это был немного другой пробег, который вы записали.

Глядя на ваши данные 8c33; 8c не представляет длину, а 33 не является допустимым типом данных.

Я подозреваю, что вы хотите отправить данные производителя. Если у вас нет идентификатора компании, вы можете используйте 0xffff для целей тестирования.

Это будет команда:

btmgmt add-adv -d 05ffffff8C33 -g 1

Что дало следующее в btmon

@ MGMT Command: Add Adver.. (0x003e) plen 17  {0x0002} [hci0] 341.378134
        Instance: 1
        Flags: 0x00000002
          Advertise as Discoverable
        Duration: 0
        Timeout: 0
        Advertising data length: 6
        Company: internal use (65535)
          Data: 8c33
        Scan response length: 0
11.08.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..