Keep BLE counters tied to neighbor table entries

This commit is contained in:
evgeny committed 2026-10-30 12:45:56 +01:00
1 parent d86599995c
commit 49cbb7e148
3 files changed
+16 -6

No files matched your search

+2 -2
View File
@@ -31,8 +31,8 @@ frontend передают instance. config.callbacks — наблюдатели;
Таблица в управляющей структуре драйвера, не в instance и не в UI:
64 записи {node_id, UTF-8 name, endpoint, RSSI, seen_us, broadcast_received}; срок свежести 30 секунд.
Каждое принятое валидное объявление увеличивает broadcast_received, включая одинаковые повторы.
Обновление имени, адреса и RSSI сохраняет счётчик. По истечении срока запись удаляется;
повторное появление начинает счёт с 1, даже если таймер ещё не очистил просроченный слот.
Обновление имени, адреса и RSSI сохраняет счётчик. Он сбрасывается вместе с записью
при удалении по таймауту или замене другим соседом; новая запись начинает счёт с 1.
Desktop формирует видимый список из snapshot общего драйвера. Android получает
тот же C API через android_ble_driver(). node_id/name в эфире не аутентифицированы.
Android показывает счётчик под ником, desktop — в строке соседа как RX.
+3 -4
View File
@@ -216,14 +216,13 @@ static void broadcast(void* arg, const struct ble_endpoint* endpoint, const uint
}
if (slot >= 0) {
struct ble_neighbor* n = &d->neighbors[slot];
int fresh = n->identity.node_id == peer.node_id && now - n->seen_us <= BLE_NEIGHBOR_TTL_US;
peer_received = fresh ? n->broadcast_received + 1 : 1;
if (!fresh) {
peer_received = n->identity.node_id == peer.node_id ? n->broadcast_received + 1 : 1;
if (n->identity.node_id != peer.node_id) {
DEBUG_INFO(CAT, "BLE neighbor discovered peer=%016llx name=%s endpoint=%s rssi=%d",
(unsigned long long)peer.node_id, peer.name, endpoint->id, rssi);
d->retry[slot] = 0; d->check_groups = 1;
}
if (!fresh || strcmp(n->identity.name, peer.name)) d->peers_changed = 1;
if (n->identity.node_id != peer.node_id || strcmp(n->identity.name, peer.name)) d->peers_changed = 1;
*n = (struct ble_neighbor){.identity = peer, .endpoint = *endpoint, .rssi = rssi,
.seen_us = now, .broadcast_received = peer_received}; schedule(d);
reason = "accepted"; count = ++d->broadcast_accepted;
@@ -332,9 +332,20 @@ int main(void) {
assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 1);
assert(neighbors[0].identity.node_id == endpoints[1].inst.node_id && neighbors[0].rssi == -42);
assert(!strcmp(neighbors[0].endpoint.id, "1"));
assert(neighbors[0].broadcast_received == 1);
assert(!endpoints[0].inst.connections->head); /* Discovery не подключает посторонних. */
ble_backend_broadcast(backends[0]->owner, &ep, bytes, len, -30);
assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 1 && neighbors[0].rssi == -30);
assert(neighbors[0].broadcast_received == 2);
ble_backend_broadcast(backends[0]->owner, &ep, bytes, len, -30);
bytes[2] = BLE_IDENTITY_VERSION - 1;
ble_backend_broadcast(backends[0]->owner, &ep, bytes, len, -30); bytes[2] = BLE_IDENTITY_VERSION;
assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 1 && neighbors[0].broadcast_received == 3);
/* Отдельный сосед имеет свой счётчик; его объявление не меняет счёт первого. */
int other_len = ble_identity_encode(self, endpoints[0].inst.node_id ^ 1, "other");
ble_backend_broadcast(backends[0]->owner, &ep, self, other_len, -55);
assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 2);
assert(neighbors[0].broadcast_received == 3 && neighbors[1].broadcast_received == 1);
assert(!ble_etcp_connect(endpoints[0].driver, endpoints[1].inst.node_id)); wait_ready();
for (int i = 0; i < 2; i++) {
struct etcp_link_snapshot snapshot;