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