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

BLE модули TB-04/TB-03F (TLSR8253F512)

pvvx

Активный участник сообщества
Что там с Zigbee Direct?
На сайте Telink:
Zigbee Direct — это новая функция Zigbee, которая упрощает подключение и управление устройствами Zigbee непосредственно через устройства Bluetooth Low Energy. Виртуальное устройство Zigbee (например, телефон или концентратор) устанавливает безопасное соединение с устройством Zigbee Direct (например, лампочкой Zigbee). Связь между этими двумя устройствами осуществляется исключительно через Bluetooth Low Energy. По этому каналу связи передаются сообщения Zigbee NWK и приложения. Как только соединение между ZVD и ZDD установлено, ZVD может отправлять команды на ZDD и другие устройства Zigbee в той же сети (где ZDD выступает в качестве прокси).

И где свиснуть программу "ZigBee Direct Test Tool", показанную в видео Telink?
 

Slacky

Member
Что там с Zigbee Direct?
На сайте Telink:
Zigbee Direct — это новая функция Zigbee, которая упрощает подключение и управление устройствами Zigbee непосредственно через устройства Bluetooth Low Energy. Виртуальное устройство Zigbee (например, телефон или концентратор) устанавливает безопасное соединение с устройством Zigbee Direct (например, лампочкой Zigbee). Связь между этими двумя устройствами осуществляется исключительно через Bluetooth Low Energy. По этому каналу связи передаются сообщения Zigbee NWK и приложения. Как только соединение между ZVD и ZDD установлено, ZVD может отправлять команды на ZDD и другие устройства Zigbee в той же сети (где ZDD выступает в качестве прокси).

И где свиснуть программу "ZigBee Direct Test Tool", показанную в видео Telink?
Не знаю, я не изучал конкурент модэ sdk. Мне для моих хотелок вполне одного Zigbee хватает ...
 

Slacky

Member
Это ZigBee Direct , а не "конкурент модэ sdk".
Для "одного Zigbee" ставить целый zigbee2mqtt с древнейшими адаптерами?
Я просто прошел по Вашей ссылке, увидел что предлагается для 8258 - Zigbee 3.0 + Bluetooth® 5.0 Concurrent Mode. Дальше не листал. А сейчас пролистал, там Zigbee Direct вроде только для TLSR921x ...

Но не суть. Мне бы с обычным Zigbee разобраться :))
 

Slacky

Member
Немного не по теме, но спрошу. Вдруг кто-то решит мою задачку :))
Скриншот 14-10-2023 010832.jpg
Это кодирование адреса в пакете. Принято считать, что Upper - адрес логический, а Lower - физический. Штатная программа связи просит указать серийный номер и из него как-то формирует эти два адреса.

К тому же видно, что в пакете не могут быть числа более 0x3fff - 12 бит на 16-битное поле.

LSB - 0 значит следующий байт тоже является адресом. LSB - 1 - все, последний байт адреса.

Серийник - 21021839
4 байта начиная с Upper high в пакете 0x5444086f.

С помощью той же штатной прогрммы выяснил, чтобы в Upper попало число 0x5455, изначально должно быть указано десятичное число 5410. А чтобы в Lower попало 0x086f, изначально число должно быть 567.

Собственно вопрос - как из 21021839 можно получить 5410 и 567.

Производитель письма игнорирует ...

Спасибо.
 

pvvx

Активный участник сообщества
sn = 5410 -> 0x1522
x = (sn & 0x3000)<< 30;
x |=(sn & 0x0f00)<< 26;
x |=((sn & 0x0080)<< 25) + ((sn & 0x0070)<< 21) ;
x |=((sn & 0x000f)<< 17);
 

Slacky

Member
sn = 5410 -> 0x1522
x = (sn & 0x3000)<< 30;
x |=(sn & 0x0f00)<< 26;
x |=((sn & 0x0080)<< 25) + ((sn & 0x0070)<< 21) ;
x |=((sn & 0x000f)<< 17);
Не очень понял, точнее вообще не понял :(
0x1522 & 0x3000 = 0x1000 если 0x1000 сдвинуть на 30, то будет 0. Получается вот что.
C:
    uint16_t sn = 0x1522;
    uint32_t x = (sn & 0x3000)<< 30;
    x |=(sn & 0x0f00)<< 26;
    x |=((sn & 0x0080)<< 25) + ((sn & 0x0070)<< 21) ;
    x |=((sn & 0x000f)<< 17);

    printf("x: %d, x: 0x%x\r\n", x, x);
x: 67371008, x: 0x4040000
 

pvvx

Активный участник сообщества
Там не дописал, что начальное значение уже сдвинуто... :)
x = (sn & 0x3000)<< (30-24);
или
x = ((sn & 0x3000)>>24)<< 30;

Кодируется примерно так:
Код:
unit16_t code_sn(uint16_t sn) {
    return = ((sn & 0x300) << (14-8)) | ((sn & 0x0f0) << (10-4)) | ((sn & 0x080) << (9-4)) | ((sn & 0x070) << (5-4)) | ((sn & 0x00f) << 1);
}

    unit8_t outbuf[5];
    unit8_t *p = outbuf;

    unit16_t x;
    x = code_sn(0x1234);
    *p = (unit8_t)(x >> 8);
    p++;
    *p = (unit8_t)x;
    p++;
    x = code_sn(0x3ff);
    *p = (unit8_t)(x >> 8);
    p++;
    *p = (unit8_t)x | 1;
    p++;
    *p = (unit8_t) code_sn(0x3a) | 1;
Проверяйте сдвиги - считал биты кое-как :)
 

pvvx

Активный участник сообщества
Словами это будет (примерно) так:
Имеем код sn в 14 бит
Берем старший бит кода и кладем в буфер.
Сдигаем буфер влево.
Сдвигаем код влево.
Повторяем: Берем старший бит кода и кладем в буфер.
И так по 7 бит кода. На 8-ой раз вставляем в буфер бит 0, а по концу 14 бит кода вставляем бит 1.
 

Slacky

Member
Словами это будет (примерно) так:
Имеем код sn в 14 бит
Берем старший бит кода и кладем в буфер.
Сдигаем буфер влево.
Сдвигаем код влево.
Повторяем: Берем старший бит кода и кладем в буфер.
И так по 7 бит кода. На 8-ой раз вставляем в буфер бит 0, а по концу 14 бит кода вставляем бит 1.
Мне кажется, мы про разное говорим. Мне нужно понять, как из 21021839 получаются два числа 5410 и 567. А как 5410 и 567 разлождить побитно в пакете я уж соображу :))

Ну или я совсем тупой :))
 

pvvx

Активный участник сообщества
Т.е. обратная задача?
И пишите с уточнением - где HEX, а где DEC
Всё уточняйте, т.к. пишу занимаясь другими делами и голова на 3-ю задачу работает кое-как :) (обычно сокращая и забывая что-то вписать)
 

pvvx

Активный участник сообщества
21021839=0x140C48F ?
Это только HDLC из двух номеров?
С каким "индейцем" (BYTE_ORDER = LITTLE_ENDIAN ? BIG_ENDIAN)?
 

Slacky

Member
Т.е. обратная задача?

Всё уточняйте, т.к. пишу занимаясь другими делами и голова на 3-ю задачу работает кое-как :)
Есть серийный номер у прибора - 21021839 (и я так понимаю, он на разных экземлярах разный). И есть пакет с закодированными адресами. Из номера 21021839 в пакете получается кодированный 4 байтный фрагмент 0x5444086f, если штатной программе указать связываться по серийнику.

Но так же, штатной программе можно указать связываться по логическому и физическому адресу. Так вот если ввести два числа 5410 и 567 то закодированный адрес в пакете будет точно таким же - 0x5444086f.

Вывод штатная программа как-то умеет из серийник делать эти два числа 5410 и 567. Мне нужно понять алгорим преобразования, чтобы сделать универсальный код, который подойдет и для прибора с другим серийником.

Скриншот 17-10-2023 140547.jpg
Скриншот 17-10-2023 140631.jpg
 

pvvx

Активный участник сообщества
C:
unit16_t decode_sn(uint16_t s) {
    int i = 7;
    uint16_t x = 0;
    while(i--) {
        x |= s & 0x8000;
        x >>= 1;
        s <<= 1;
    }
    s <<= 1;
    i = 7;
    while(i--) {
        x |= s & 0x8000;
        x >>= 1;
        s <<= 1;
    }
    x >>= 1;
    return x;
}

    unit8_t inpbuf[5];
    unit8_t *p = inpbuf;
    unit16_t x;
    unit16_t hhdlc, lhdlc, cladr;
    x = (*p++) << 8;
    x += *p++;
    hhdlc = decode_sn(x);
    x = (*p++) << 8;
    x += *p++;
    lhdlc = decode_sn(x);
    cladr = decode_sn(*p);
 
Сверху Снизу