Godot Version 4.4
Hello team.
I’m trying to connect to an NTRIP server, Centipede’s https://docs.centipede.fr/, to get a fix for a GNSS.
My problem is that I’m not good at all when it comes to networks. Here’s my code:
extends Panel
#signal pressed()
@onready var Panel_Gnss : Panel=%Gnss
@onready var OptionButton_Serial_Gnss : OptionButton = %OptionButton_Serial_Gnss
@onready var check_button : CheckButton = %CheckButton_Serial_Port
@onready var TextEdit_Ntrip_Caster : LineEdit = %TextEdit_Ntrip_Caster
@onready var TextEdit_Port_Caster : LineEdit = %TextEdit_Port_Caster
#@export var adresse_ip: String = "147.100.179.214"
@export var adresse_ip: String = "crtk.net"
@export var port: int = 2101
@export var point_de_montage: String = "LBFLT"
@export var username: String = "centipede"
@export var password: String = "centipede"
var socket: StreamPeerTCP # Socket pour la communication TCP
var timer: Timer # Timer pour la réception périodique des données
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
# Démarrage de la connexion
timer = Timer.new()
timer.timeout.connect(_sur_timeout)
add_child(timer)
_initialiser_client_ntrip()
func _initialiser_client_ntrip() -> void:
# Création du socket TCP
socket = StreamPeerTCP.new()
var retry_count = 0
var max_retries = 3
# Connexion au serveur NTRIP
var erreur = socket.connect_to_host(adresse_ip, port)
if erreur != OK:
printerr("Erreur de connexion au serveur NTRIP : ", erreur)
return
print("Connexion au serveur NTRIP établie")
# Création de l'en-tête d'authentification
var auth = _encoder_base64("%s:%s" % [username, password])
print("Authentification encodée : ", auth)
var requete = "GET /" + point_de_montage + " HTTP/1.1\r\n"
requete += "User-Agent: NTRIP iter.dk\r\n"
requete += "Authorization: Basic " + auth + "\r\n"
requete += "Accept: */*\r\n"
requete += "Connection: close\r\n"
requete += "\r\n"
print("Requête NTRIP : ", requete)
# Envoi de la requête
socket.put_string(requete)
if socket.get_status() != StreamPeerTCP.STATUS_CONNECTED:
printerr("Erreur d'envoi de la requête - Connexion perdue")
var error = socket.poll()
if StreamPeerTCP.STATUS_NONE:
print("Le port est déjà utilisé")
if StreamPeerTCP.STATUS_CONNECTING:
print("En train de se connecter...")
if StreamPeerTCP.STATUS_ERROR:
var host = socket.get_connected_host()
var port = socket.get_connected_port()
print("Erreur avec le serveur %s:%d" % [host, port])
# Réessayer la connexion si nécessaire
socket.disconnect_from_host()
return
# Lecture de la réponse du serveur
var response = ""
var timeout = 0
const TIMEOUT_MAX = 30 # 30 secondes
while timeout < TIMEOUT_MAX:
var result = socket.get_partial_data(1)
if result[0] != OK:
printerr("Erreur de lecture des données : ", result[0])
return
var data = result[1]
if data.empty:
timeout += 1
await get_tree().create_timer(1.0).timeout
continue
response += data.get_string_from_utf8()
# Vérification de la réponse
if response.empty:
printerr("Aucune réponse reçue du serveur")
return
if response.find("SOURCETABLE 200 OK") != -1:
print("Connexion au caster établie avec succès")
elif response.find("401 Unauthorized") != -1:
printerr("Erreur d'authentification")
elif response.find("404 Not Found") != -1:
printerr("Point de montage non trouvé")
else:
printerr("Erreur de connexion au caster:", response)
# Démarrage du timer pour la réception des données
timer.start(0.1) # 100ms
func _sur_timeout() -> void:
# Lecture des données du socket
if socket.get_available_bytes() > 0:
var donnees = socket.get_data(socket.get_available_bytes())
print("Données reçues : ", donnees.get_string_from_utf8())
# À ce stade, vous pouvez ajouter le code pour traiter les données
# avec votre récepteur GPS
else:
print("Aucune donnée disponible")
func _encoder_base64(texte: String) -> String:
var donnees = texte.to_utf8_buffer()
return Marshalls.raw_to_base64(donnees)
func _exit_tree() -> void:
# Nettoyage à la fermeture
if socket != null and socket.get_status() == StreamPeerTCP.STATUS_CONNECTED:
socket.disconnect_from_host()
socket = null
timer.queue_free()
print("Client NTRIP arrêté")
#______________FIN NTRIP_____________
#______________FIN NTRIP_____________
#______________FIN NTRIP_____________
#______________FIN NTRIP_____________
#______________FIN NTRIP_____________