• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

TLSR8251 + LCD + термометр = LYWSD03MMC XIAOMI Bluetooth термометр

pvvx

Активный участник сообщества
Точнее исправлять форматы и структуру API запросов в bluez надо было ещё в 2016 году :love:
Теперь наверно будет API2 или миллион патчей и миллион дублирующих типов запросов-ответов-функций с дополнениями по одной переменной для поддежки ещё стандарта bt5.0.
Нехай программеры путаются или пишут мульон if version = x :) :)
 

pvvx

Активный участник сообщества
Но во всем этом бардаке виновник всего один – некомпетенция группы принимающих патчи и стратегию развития для ядра Linux. И там пердун Товальдс…
 

sL0n1k

Member
Но во всем этом бардаке виновник всего один – некомпетенция группы принимающих патчи и стратегию развития для ядра Linux. И там пердун Товальдс…
В современной парадигме, я бы рекомендовал Вам проследить за своим лексиконом. Если Торвальдс станет в позицию (чего я очень надеюсь не произойдет), то китайцы ничем не помогут. Более того, могу Вас заверить, что ему будет оказано такое содействие, что то что мы сейчас наблюдаем окажется очень-очень белой полосой.
 

pvvx

Активный участник сообщества
В современной парадигме, я бы рекомендовал Вам проследить за своим лексиконом. Если Торвальдс станет в позицию (чего я очень надеюсь не произойдет), то китайцы ничем не помогут. Более того, могу Вас заверить, что ему будет оказано такое содействие, что то что мы сейчас наблюдаем окажется очень-очень белой полосой.
Оно и так всё давно в этом русле. Но через годы мнение будет изменено и не известно что будет значиться в историческом микрологе по поводу Товальдса.
 

pvvx

Активный участник сообщества
Рассказы от него, как его "уговорили" навязать систему лицензирования в open-sourсe, тем самым обременив свободное ПО всевозможным авторским правом и не только, в инете куча. Любой может это посмотреть и прочитать, и сделать выводы на представленные им отмазки...
 

pvvx

Активный участник сообщества
И это совершенно чуждые русскому и любому свободному народу навязываемые вещи...
 

pvvx

Активный участник сообщества
Точнее так: если вам нужно устанавливать соединение и вычитывать характеристики (например gatttool-ом), то на редкой рекламе от устройства ( насколько я помню реже 2 секунд) это сделать не получится (скорее всего). Если вам нужно соединяться из под линуха с устройствами с редкой рекламой, то придется пересобрать ядро (скорее всего).
Код как изменить HCI_LE_AUTOCONN_TIMEOUT на ходу, без патчей ядра.
Доделывать на опции не стал, но исправлен - в источнике были ошибки..
C:
/* https://gist.github.com/mironovdm/cb7f47e8d898e9a3977fc888d990e8a9 
* gcc main.c -o leactimeout 
* $ sudo leactimeout --read    # Show current HCI_LE_AUTOCONN_TIMEOUT
* $ sudo leactimeout           # Set new value for le autoconnect timeout
*/
#include <endian.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>

#include "bluetooth/bluetooth.h"
#include "bluetooth/hci.h"

#define NEW_LE_AUTOCONN_TIMEOUT 22000

struct hci_event {
    uint16_t code;
    uint16_t controller_id;
    uint16_t size;
    uint16_t cmd_opcode;
    uint8_t cmd_status;
};

#define EVT_CODE_CMD_COMPLETE 0x0001
#define EVT_CMD_STATUS_SUCCESS 0x00

#define PARAM_TYPE_LE_AUTOCONN_TIMEOUT 0x001b

unsigned char read_buf[1024];
const unsigned char read_conf_cmd[6] = {
    /* cmd opcode */ 0x4b, 0x00, 
    /* controller id */ 0x00, 0x00,
    /* data len */ 0x00, 0x00};
unsigned char set_le_autoconn_timeout_cmd[] = {
    /* cmd opcode */ 0x4c, 0x00, 
    /* controller id */ 0x00, 0x00, 
    /* data len */ 0x05, 0x00, 
    /* data */ 0x1b, 0x00, 0x02, 0x00, 0x00
};
const int set_timeout_cmd_value_offset = 9;

int get_autoconn_timeout_from_result(const unsigned char *buf, size_t size)
{
    /* Skip event header */
    buf += 6;

    const unsigned char * const buf_end = buf + size;

    while (buf < buf_end) {
        uint16_t param_type = le16toh(*(uint16_t *)buf);
        uint8_t param_data_size = *(uint8_t *)(buf + 2);
        
        if (param_type == PARAM_TYPE_LE_AUTOCONN_TIMEOUT) {
            uint16_t value;

            switch (param_data_size) {
                case 1:
                    value = *(uint8_t *)(buf+3);
                    break;
                case 2:
                    value = le16toh(*(uint16_t *)(buf+3));
                    break;
                default:
                    fputs("Unexpected value length", stderr);
                    return -1;
            }

            printf("LE Autoconnect Timeout=%d \n", value);

            return value;
        }

        buf += 2/*type*/ + 1/*len*/ + param_data_size;

    }
    puts("Param type LE Autoconnect Timeout not found in result");

    return -1;
}

void print_buf(const unsigned char *buf, size_t len)
{
    for (int i = 0; i < len; i++) {
        printf("%02X ", (unsigned)buf[i]);
    }
    puts("");
}

bool is_read_only_param(char *param)
{
    static const char read_param[]= "--read";
    
    return strncmp(param, read_param, sizeof(read_param)) == 0;
}

struct hci_event *get_event_from_buf(void *buf)
{
    struct hci_event *evt = malloc(sizeof(struct hci_event));
    if (!evt)
        exit(EXIT_FAILURE);

    memcpy(evt, buf, sizeof(*evt));

    evt->code = le16toh(evt->code);
    evt->controller_id = le16toh(evt->controller_id);
    evt->size = le16toh(evt->size);
    evt->cmd_opcode = le16toh(evt->cmd_opcode);

    return evt;
}

int set_le_autoconn_timeout(int sockfd, uint16_t new_val)
{
    int status, result;
    struct hci_event *event;

    new_val = htole16(new_val);

    memcpy(
        &set_le_autoconn_timeout_cmd[set_timeout_cmd_value_offset], &new_val, sizeof(new_val)
    );

    status = send(sockfd, set_le_autoconn_timeout_cmd, sizeof(set_le_autoconn_timeout_cmd), 0);
    if (status < 0) {
        perror("Failed to set params");
        return -1;
    }

    memset(read_buf, 0, sizeof(read_buf));

    status  = recv(sockfd, read_buf, sizeof(read_buf), 0);
    if (status < 0) {
        perror("Failed to set params");
        return -1;
    }

    event = get_event_from_buf(read_buf);
    result = (event->code == EVT_CODE_CMD_COMPLETE 
        && event->size >= 3 
        && event->cmd_status == EVT_CMD_STATUS_SUCCESS
    ) ? 0 : -1;
    free(event);
    
    if (result)
        print_buf(read_buf, status);

    return result;
}

int main(int argc, char *argv[static 1])
{
    int status;
    struct sockaddr_hci addr = {0};
    int sockfd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
    
    if (sockfd < 0) {
        perror("socket create error");
        return EXIT_FAILURE;
    }

    addr.hci_family = AF_BLUETOOTH;
    addr.hci_dev = HCI_DEV_NONE;
    addr.hci_channel = HCI_CHANNEL_CONTROL;

    status = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
    if (status < 0) {
        perror("socket bind failed");
        close(sockfd);
        return EXIT_FAILURE;
    }

    status = send(sockfd, read_conf_cmd, sizeof(read_conf_cmd), 0);
    if (status < 0) {
        perror("socket write failed");
        close(sockfd);
        return EXIT_FAILURE;
    }

    status = recv(sockfd, read_buf, 1024, 0);
    if (status <= 0) {
        perror("Didn't receive response");
        close(sockfd);
        return EXIT_FAILURE;
    }

    struct hci_event *event = get_event_from_buf(read_buf);

    if (event->code == EVT_CODE_CMD_COMPLETE && event->cmd_status == EVT_CMD_STATUS_SUCCESS) {
        int autocon_timeout;

        printf("Command complete, result size: %hu.\nBinary response: \n", event->size);
        print_buf(read_buf, status);

        autocon_timeout = get_autoconn_timeout_from_result(read_buf, event->size);
        if (autocon_timeout < 0) {
            return EXIT_FAILURE;
        }

        if (argc < 2 || !is_read_only_param(argv[1])) {
            printf("Set new LE Autoconnect Timeout value to %d... ", NEW_LE_AUTOCONN_TIMEOUT);
            if (set_le_autoconn_timeout(sockfd, NEW_LE_AUTOCONN_TIMEOUT) == 0) {
                puts("OK");
            } else {
                puts("ERROR");
            }
        }
    } else {
        fputs("Could not read current settings\n", stderr);
    }

    free(event);
    close(sockfd);

    return EXIT_SUCCESS;
}
 

pvvx

Активный участник сообщества
особо глубинному народу
Я не знаком с такими и такими терминами. Но, то что Linux загибается и причины уже торчат - известно и многие сталкиваются с этим на практике. И тут пофиг "глубинные" они или нет.
И т.к. тема про BLE, то в итоге ныне идет дописывание дополнительной ветки для обслуживания BLE (API) в Linux и для разработчиков устроили полный бардак, который можно было запросто избежать ещё с 2016 года.
 

pvvx

Активный участник сообщества
Завершился тест работы CGDK2 с самой дешевой CR2016 (8 руб):
1681157006103.png
Это был CGDK2 для тестов разных прошивок и опций и график напряжения не гладкий - иногда были просадки и пару подключений к питанию 3.3В...
В завершении на индикаторе было отображено 1994 - это выловленное импульсное напряжения при работе, в mV. Ограничение 2.0В, т.к. во время передачи ток больше (6..7мА), но замер производится при потреблении 3..4мА.
Т.е. можно точно считать, что CR2016 хватает на 6 меcяцев.
 

pvvx

Активный участник сообщества
Кто может подсказать, каким образом в OpenWT 22.03.2 на 4-х ядерном CPU график нагрузки превышает 4-ре (ядра)?
1681815047844.png
Правда нагрузочный тест CPU специализированный, нереальный для типовых приложений и тестов от обывателей...
 

sL0n1k

Member

кому нужно, там и long range и 1 wire, как обещал - это конечно не гугл плэй, ну, как смог)
в любом случае, RuStore, гораздо доступней сейчас, чем все остальное, как мне кажется или?

Вероятно, к концу года будет добавлено:
PAwR (Periodic Advertising with Response),
Encrypted Advertisement Data (EAD)

Это для электронных ценников.
Похоже, что на андроиде частично работает уже.

Стоимость шилда уже меньше доллара, да и кстати, похоже, ничего программировать со стороны чипа не надо будет,
будет конфигуратор (у всех вендоров похожий), который позволит сконфигурировать модуль под нужную задачу и под нужную периферию, что вполне разумно.
 

pvvx

Активный участник сообщества
Пока нет других дешевых USB-BT с Bluetooth 5.3.
C Bluetooth 5.3 на рынке есть Intel® Wi-Fi 6E AX210, но это другие цены и они с M2/PCI разъемом.

ATS2851 & OpenWrt 22.03.2.
#dmseg
Код:
usb 5-1: new full-speed USB device number 3 using xhci-hcd
usb 5-1: New USB device found, idVendor=10d7, idProduct=b012, bcdDevice=88.91
usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 5-1: Product: general adapter
usb 5-1: Manufacturer: Actions
usb 5-1: SerialNumber: ACTIONS1234
#hciconfig
Код:
hci0:   Type: Primary  Bus: USB
        BD Address: F4:4E:FC:68:15:D2  ACL MTU: 679:6  SCO MTU: 240:20
        DOWN
        RX bytes:539 acl:0 sco:0 events:25 errors:0
        TX bytes:338 acl:0 sco:0 commands:25 errors:0
#hciconfig hci0 up
Can't init device hci0: No error information (56)
 

pvvx

Активный участник сообщества
Если переводить термометры на SDK с поддержкой BT5.3, то потребление увеличивается, примерно на 5..10%. Чего-то там понаписали в Telink...
И пока нет приемников BT5.3+ нет смысла всё перекидывать на SDK с поддержкой BT5.3.
И не актуально и это:
Вероятно, к концу года будет добавлено:
PAwR (Periodic Advertising with Response),
Encrypted Advertisement Data (EAD)
 

pvvx

Активный участник сообщества
У Intel вообще нет адаптеров с Bluetooth 5.4
И спеков по смартфонам с Bluetooth 5.4 не найти...
 
Сверху Снизу