• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 не найти...
 
Сверху Снизу