Вот это тестировалось с нормальной батарейкой? (+8.13 хотя бы)Видимо опять не читали функционал прошивки...
Вариант 1:
В TelinkMiFlasher.html измените строку :
const MAX_RF_TX_Power = false;
на
const MAX_RF_TX_Power = true;
Вариант 2:
В Google Chrome:
Далее при соединении с термометром с установками более +3дБ (VANT) будет всегда доступно это переключение.
Это всё сделано для защиты от детей, орущих что у них не работает термометр или быстро умирает батарейка.
В реальности, даже на более-менее свежей батарейке CR2032 переключение на +10дБ вызовет невозможность найти или соединиться с термометром, т.к. RF-TX переключается напрямую к батарейке, а итоговый сигнал становиться меньше, чем -20дБ из-за просадок..
А RPi выкиньте в помойку.
Возрастание тока четко соответствует отдаваемой мощности в RF TX - прямая зависимость.Вот это тестировалось с нормальной батарейкой? (+8.13 хотя бы)
Кто такое "поддержка"?Еще тогда такой незатейливый вопрос: в SDK есть поддержка IR (инфракрасного)?
Зачем нам чудо?т.е. чуда c Long Range не будет - можете расходиться))
Да, работает. Зависаний пока не зафиксировано@sL0n1k - как проверка LE Long Range - удалась?
Дело в том, что не нужно предпринимать никаких специальных усилий или действий для использования Coded Phy в андроиде.Google Web Bluetooth API вообще сдвинуть невозможно, как и Windows и MACOS. Там всё связанное с BLE запущено изначально и даже думать не стоит.
@sL0n1k - если это как-то возможно, киньте какой пример на Android для работы с Coded PHY. Правда времени на какие-то разработки приложений под Android у меня через несколько дней уже не будет - есть свои большие делишки...
Это всё я знаю. Но как-то теперь надо начать писать на Android... а большого желания нет, пока не доработаны другие уже вышедшие варианты термометров...Дело в том, что не нужно предпринимать никаких специальных усилий или действий для использования Coded Phy в андроиде.
Просто скажите какой Phy использовать с помощью метода setPhy(). В остальном все абсолютно также как и для обычных каналов.
hci_phys = btmgmt_sync.send('GetPHYConfiguration', idx)
# 9 LE1MTX
#10 LE1MRX
#11 LE2MTX
#12 LE2MRX
#13 LECODEDTX
#14 LECODEDRX
sup_phy = bool((hci_phys.cmd_response_frame.supported_phys & 0x6600) == 0x6600);
if sup_phy is not True:
_LOGGER.warning(
"hci%i (%s) no BT5.0 capabilities.",
idx,
hci_info.cmd_response_frame.address
)
#else:
#new_hci_phys = int(hci_phys.cmd_response_frame.selected_phys | 0x6000);
#if new_hci_phys != hci_phys.cmd_response_frame.selected_phys:
#hci_phys = btmgmt_sync.send('SetPHYConfiguration', idx, new_hci_phys)
#_LOGGER.warning(hci_phys)
#time.sleep(3)
Ещё какие сверх усилия требуются, т.к. потребуется описывать interleaved сканирование...Дело в том, что не нужно предпринимать никаких специальных усилий или действий для использования Coded Phy в андроиде.
Тут надо смотреть спецификацию раздел HCI. Скорее всего это одной командой делаетсяЕщё какие сверх усилия требуются, т.к. потребуется описывать interleaved сканирование...
А в том-же Linuх достаточно переключить адаптер в режим BT5.0. (Но это сделать непросто )
Команды HCI давно известны и указано как это сделать.Тут надо смотреть спецификацию раздел HCI. Скорее всего это одной командой делается
Это делает адаптер сам. И сканирует на разных PHY сам.ScanSettings#PHY_LE_ALL_SUPPORTED
Мы же знаем, что модуляция не меняется, поэтому фактически надо тупо дифференцировать s2 от s8
#if RF_FAST_MODE_2M
#if RF_LONG_PACKET_EN
#define RF_PACKET_LENGTH_OK(p) (p[0] == p[12]+13)
#define RF_PACKET_CRC_OK(p) ((p[p[0]+3] & 0x51) == 0x40)
#else
#define RF_PACKET_LENGTH_OK(p) (p[0] == (p[12]&0x3f)+15)
#define RF_PACKET_CRC_OK(p) ((p[p[0]+3] & 0x51) == 0x40)
#endif
#elif RF_FAST_MODE_1M
#define RF_BLE_PACKET_LENGTH_OK(p) ( *((unsigned int*)p) == p[5]+13) //dma_len must 4 byte aligned
#define RF_BLE_PACKET_CRC_OK(p) ((p[*((unsigned int*)p) + 3] & 0x01) == 0x0)
#if (1) // support RF RX/TX MAX data Length: 251byte
#define RF_PACKET_LENGTH_OK(p) (MAKE_U16(p[1], p[0]) == p[5]+13)
#define RF_PACKET_CRC_OK(p) ((p[MAKE_U16(p[1], p[0])+3] & 0x01) == 0x0)
#else
#define RF_PACKET_LENGTH_OK(p) (p[0] == p[5]+13)
#define RF_PACKET_CRC_OK(p) ((p[p[0]+3] & 0x01) == 0x0)
#endif
#else
#define RF_PACKET_LENGTH_OK(p) (p[0] == p[12]+13)
#define RF_PACKET_CRC_OK(p) ((p[p[0]+3] & 0x51) == 0x10)
#endif
#define RF_PACKET_1M_LENGTH_OK(p) (p[0] == p[5]+13)
#define RF_PACKET_2M_LENGTH_OK(p) (p[0] == (p[12]&0x3f)+15)
#define RF_ZIGBEE_PACKET_LENGTH_OK(p) (p[0] == p[4]+9)
#define RF_ZIGBEE_PACKET_CRC_OK(p) ((p[p[0]+3] & 0x51) == 0x10)
#define RF_ZIGBEE_PACKET_RSSI_GET(p) (p[p[0]+2])
#define RF_ZIGBEE_PACKET_TIMESTAMP_GET(p) (p[p[0]-4] | (p[p[0]-3]<<8) | (p[p[0]-2]<<16) | (p[p[0]-1]<<24))
#define RF_ZIGBEE_PACKET_PAYLOAD_LENGTH_GET(p) (p[4])
#define RF_NRF_ESB_PACKET_LENGTH_OK(p) (p[0] == (p[4] & 0x3f) + 11)
#define RF_NRF_ESB_PACKET_CRC_OK(p) ((p[p[0]+3] & 0x01) == 0x00)
#define RF_NRF_ESB_PACKET_RSSI_GET(p) (p[p[0]+2])
#define RF_NRF_SB_PACKET_PAYLOAD_LENGTH_GET(p) (p[0] - 10)
#define RF_NRF_SB_PACKET_CRC_OK(p) ((p[p[0]+3] & 0x01) == 0x00)
#define RF_NRF_SB_PACKET_CRC_GET(p) ((p[p[0]-8]<<8) + p[p[0]-7]) //Note: here assume that the MSByte of CRC is received first
#define RF_NRF_SB_PACKET_RSSI_GET(p) (p[p[0]+2])
#define RF_NRF_ESB_PACKET_TIMESTAMP_GET(p) (p[p[0]-4] | (p[p[0]-3]<<8) | (p[p[0]-2]<<16) | (p[p[0]-1]<<24))
#define RF_NRF_SB_PACKET_TIMESTAMP_GET(p) (p[p[0]-4] | (p[p[0]-3]<<8) | (p[p[0]-2]<<16) | (p[p[0]-1]<<24))
#define rf_aoa_aod_iq_data_offset(p) (p[5]+10)
rf_start_stx2rx (ble_tx_packet, clock_time()+16*TX_DELAY_US);
while(1)
{
if(tx_state==1)//tx
{
tx_state = 0;
tx_cnt++;
}
else if(rx_state==1)//rx
{
if(RF_BLE_PACKET_CRC_OK(rx_packet)&&RF_BLE_PACKET_LENGTH_OK(rx_packet))
rx_cnt++;
break;
}
else if(timeout_state==1)//time out
{
timeout_cnt++;
break;
}