Добрый день! Нужна помощь. У меня есть Bluetooth-датчик, который я подключил и внёс в белый список на роутере MikroTik KNOT LR8, но я не понимаю, где и как писать скрипт. У меня есть информация, которую дала компания. Есть кто-нибудь, кто может помочь?
bool parse_packet(bd_addr addr, byte[] scanData)
{
// Проверка ожидаемой длины
if (scanData.Length != 18) return false;
// Производитель (manufacturer specific)
if (scanData[1] != 0xFF) return false;
// Длина хвостового пакета
if (scanData[0] != 13) return false;
// Проверка данных в адресе совпадает с MAC — часть нашего протокола для исправления на iOS
if (scanData[9] != addr.Address[2]) return false;
if (scanData[10] != addr.Address[1]) return false;
if (scanData[11] != addr.Address[0]) return false;
// Проверка кода производителя
if (scanData[2] != 0x59 || scanData[3] != 0x00) return false;
// Чтение версии датчика – выставить по необходимости
prod_version = scanData[4] & 0x7F;
if (prod_version != 0x03 && prod_version != 0x05) return false;
// Проверка, что это наш “синхронизированный” датчик
if (addr != synced_mac) return false;
return true;
}
bool is_sync_pressed(uint8_t *scanData)
{
if (scanData[6] & 0x80) {
return true;
}
return false;
}
getAcceloY(rawByte) {
// Возвращает значение в “G”, которое можно преобразовать в угол
return (char)scanData[12] / 1024;
}
getAcceloX(rawByte) {
// Возвращает значение в “G”, которое можно преобразовать в угол
return (char)scanData[13] / 1024;
}
// Возвращает измеренную высоту жидкости (или воздуха) в мм
// scanData — массив сырых байт с данными производителя
uint32_t get_tank_height(const uint8_t* scanData)
{
// Для LPG (сжиженный пропан) используем следующие коэффициенты
const double coef[3] = { 0.573045, -0.002822, -0.00000535 };
// Получаем сырое значение уровня из данных. Учитываем только младшие 14 бит
uint16_t raw = (scanData[8] * 256) + scanData[7];
double raw_level = raw & 0x3FFF;
// Добавляем диапазон 16384us до 81916us с разрешением 4us
if (scanData[4] & 0x80) {
raw_level = 16384.0 + raw_level * 4.0;
}
// Получаем несмасштабированную температуру из рекламного пакета
double raw_t = (scanData[6] & 0x7F);
// Старший бит — состояние кнопки, игнорируем
// Применяем полином 2-го порядка для компенсации времени полёта (TOF) в мм LPG
return (uint32_t)(raw_level * (coef[0] + coef[1] * raw_t + coef[2] * raw_t * raw_t));
}
float get_battery_voltage(uint8_t *scanData)
{
// Возвращает напряжение батареи — старший бит зарезервирован и должен быть 0
return (float)(scanData[5] & 0x7F) / 32.0f;
}
// Произвольное преобразование напряжения батареи в проценты для CR2032
float get_battery_percentage(float voltage)
{
float percent = (voltage - 2.2f) / 0.65f * 100.0f;
if (percent < 0.0f) {
return 0.0f;
}
if (percent > 100.0f) {
return 100.0f;
}
return percent;
}
int get_temperature_reading(uint8_t *scanData)
{
uint8_t temp = scanData[6] & 0x7F;
return ((int)temp - 40);
}
bool parse_packet(bd_addr addr, byte[] scanData)
{
// Проверка ожидаемой длины
if (scanData.Length != 18) return false;
// Производитель (manufacturer specific)
if (scanData[1] != 0xFF) return false;
// Длина хвостового пакета
if (scanData[0] != 13) return false;
// Проверка данных в адресе совпадает с MAC — часть нашего протокола для исправления на iOS
if (scanData[9] != addr.Address[2]) return false;
if (scanData[10] != addr.Address[1]) return false;
if (scanData[11] != addr.Address[0]) return false;
// Проверка кода производителя
if (scanData[2] != 0x59 || scanData[3] != 0x00) return false;
// Чтение версии датчика – выставить по необходимости
prod_version = scanData[4] & 0x7F;
if (prod_version != 0x03 && prod_version != 0x05) return false;
// Проверка, что это наш “синхронизированный” датчик
if (addr != synced_mac) return false;
return true;
}
bool is_sync_pressed(uint8_t *scanData)
{
if (scanData[6] & 0x80) {
return true;
}
return false;
}
getAcceloY(rawByte) {
// Возвращает значение в “G”, которое можно преобразовать в угол
return (char)scanData[12] / 1024;
}
getAcceloX(rawByte) {
// Возвращает значение в “G”, которое можно преобразовать в угол
return (char)scanData[13] / 1024;
}
// Возвращает измеренную высоту жидкости (или воздуха) в мм
// scanData — массив сырых байт с данными производителя
uint32_t get_tank_height(const uint8_t* scanData)
{
// Для LPG (сжиженный пропан) используем следующие коэффициенты
const double coef[3] = { 0.573045, -0.002822, -0.00000535 };
// Получаем сырое значение уровня из данных. Учитываем только младшие 14 бит
uint16_t raw = (scanData[8] * 256) + scanData[7];
double raw_level = raw & 0x3FFF;
// Добавляем диапазон 16384us до 81916us с разрешением 4us
if (scanData[4] & 0x80) {
raw_level = 16384.0 + raw_level * 4.0;
}
// Получаем несмасштабированную температуру из рекламного пакета
double raw_t = (scanData[6] & 0x7F);
// Старший бит — состояние кнопки, игнорируем
// Применяем полином 2-го порядка для компенсации времени полёта (TOF) в мм LPG
return (uint32_t)(raw_level * (coef[0] + coef[1] * raw_t + coef[2] * raw_t * raw_t));
}
float get_battery_voltage(uint8_t *scanData)
{
// Возвращает напряжение батареи — старший бит зарезервирован и должен быть 0
return (float)(scanData[5] & 0x7F) / 32.0f;
}
// Произвольное преобразование напряжения батареи в проценты для CR2032
float get_battery_percentage(float voltage)
{
float percent = (voltage - 2.2f) / 0.65f * 100.0f;
if (percent < 0.0f) {
return 0.0f;
}
if (percent > 100.0f) {
return 100.0f;
}
return percent;
}
int get_temperature_reading(uint8_t *scanData)
{
uint8_t temp = scanData[6] & 0x7F;
return ((int)temp - 40);
}
