# Aggiornamento 2026-05-16 11:12 ## Obiettivo Completare la prima implementazione reale client-server tra `flywms_navigation.py` e un server WMS demo. ## Implementazione ### Client navigazione In `flywms_navigation.py` sono stati aggiunti: - `WmsSnapshotJob`; - `WmsResult`; - `WmsAsyncClient`; - creazione multipart HTTP senza base64; - worker thread con coda non bloccante; - invio del crop etichetta e, se configurato, del frame/debug gaylord; - attesa di risposta WMS dopo il ritorno simulato al centro gaylord; - gestione `ACK`, `NACK`, `ERROR`, `TIMEOUT`. Il loop video non esegue direttamente la POST: accoda il job e il worker invia in background. ### Server WMS demo Aggiunto `flywms_wms_server.py` basato su FastAPI. Endpoint: ```text POST /api/v1/navigation-snapshot GET /health ``` Payload multipart: - `metadata`: JSON; - `label_image`: JPEG crop etichetta; - `gaylord_image`: JPEG opzionale/debug. Il server salva ogni richiesta in: ```text wms_received/ ``` oppure nella directory passata con `--received-dir`. Modalita risposta: - `always-ack`; - `always-nack`; - `alternate`; - `random`. ### Configurazione Parametri aggiunti in `flywms_navigation.ini`: ```ini wms_enabled = false wms_server_url = http://127.0.0.1:8088/api/v1/navigation-snapshot wms_client_id = flywms-demo-01 wms_timeout_sec = 2.0 wms_queue_max_size = 8 wms_send_gaylord_debug = true wms_server_host = 0.0.0.0 wms_server_port = 8088 wms_received_dir = wms_received wms_fake_ack_mode = always-ack wms_fake_processing_sec = 0.5 ``` Aggiornato `.gitignore`: ```text wms_received*/ ``` ## Test end-to-end Server avviato in job PowerShell locale su: ```text http://127.0.0.1:8088 ``` Health check: ```json {"status":"ok"} ``` Client headless con snapshot forzato: ```powershell python flywms_navigation.py --no-display --max-frames 6 --snapshot-line-tolerance-ratio 0.20 --snapshot-output-dir navigate_snapshots_test --preview-fps 0 --yolo-fps 0 --label-move-sec 0 --label-stabilization-sec 0 --label-return-sec 0 --remote-ack-timeout-sec 5 --wms-enabled --wms-server-url http://127.0.0.1:8088/api/v1/navigation-snapshot ``` Risultato client: ```text [WMS] job accodato request_id=77cba060-1433-43f3-a387-3811e6734907 snapshot=1 [WMS] risposta request_id=77cba060-1433-43f3-a387-3811e6734907 status=ACK message=codice valido su WMS [WMS] ACK request_id=77cba060-1433-43f3-a387-3811e6734907 snapshot=1 codice valido su WMS [CMD] RIPARTI_DESTRA ``` Risultati salvati dal server: ```text wms_received_test/000001_77cba060-1433-43f3-a387-3811e6734907/metadata.json wms_received_test/000001_77cba060-1433-43f3-a387-3811e6734907/snapshot_0001_track_002_frame.jpg wms_received_test/000001_77cba060-1433-43f3-a387-3811e6734907/snapshot_0001_track_002_label_payload.jpg ``` Metadati ricevuti includono: - `request_id`; - `client_id`; - `snapshot_id`; - `simulated_position`; - `track_id`; - `gaylord_bbox`; - `label_bbox`; - `movement_vector_px`. ## Note - La sequenza fisica simulata resta: movimento verso etichetta, stabilizzazione, scatto, ritorno al gaylord. - L'invio WMS parte dopo lo scatto etichetta e puo' procedere mentre viene simulato il ritorno. - La ripartenza viene comandata solo dopo risposta WMS o timeout.