Я пытаюсь написать код 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