Keep BLE counters tied to neighbor table entries
This commit is contained in:
1 parent
d86599995c
commit
49cbb7e148
3 files changed
+16
-6
No files matched your search
+2
-2
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user