Pb connexion à constellation en JS


#1

Bonjour,

Avant de commencer, je précise que je débute en programmation et merci pour votre aide future.

j’ai donc déployé ma constellation et j’aimerai pouvoir consommer mes SO depuis une page HTML.
J’ai suis les instruction de S.Warin.
Mais impossible de s’y connecté.
voici mon code:

<head>
   <link href="css/bootstrap.min.css" rel="stylesheet">
   <script src="js/bootstrap.min.js"></script>
   <script src="js/fonction.js"></script>
   <script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js"></script>
   <script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.2.min.js"></script>
   <script type="text/javascript" src="//cdn.myconstellation.io/js/Constellation-1.8.2.min.js"></script>
   
</head>
<body>
	<script type="text/javascript">
		alert("etape0");
		var constellation = $.signalR.createConstellationConsumer("xxxx.xxx:8088", "xxxxx", "xxx");
		alert("etape1");
	constellation.connection.stateChanged(function (change) {
    	if (change.newState === $.signalR.connectionState.connected) {
        console.log("Je suis connecté");
    	}
	});
	alert("etape2");
	constellation.connection.start();
	alert("etape3");
	console.log("Je suis connecté");

</script>

Pour info:
-alert(“etape0”) fonctionne bien car une fenêtre s’affiche.
-je n’ai aucun log dans la console.
-le crédential utilisé est “allow” sur tout
-les ports sont ouvert car un arduino réussi à publié et consommé des SO

je ne comprends pas pourquoi le code JS ne fonctionne pas.

Please help me


#2

Hello,

Cette page est-elle hébergée sur un serveur web ou bien ouverte depuis un répertoire ? Autrement dit est ce que le scheme de l’uri est en http:// ou en file:// ?

Je devrais ajouter une précision dans l’article d’introduction. En effet, dans l’exemple les scripts jquery et constellation sont inclus dans la page en “//” :
src="//cdn.myconstellation.io/js/Constellation-1.8.2.min.js"

C’est à dire qu’on utilise le même scheme que la page courante ! Ainsi si on a une page en HTTP:// on récupère le script par l’adresse http://cdn.myconstellation.io/js/xxx, si on est en https, on chargera la page via https://cdn.myconstellation.io/js/xxx !

Le problème c’est que si on ouvre la page depuis un répertoire, en file://, on va donc charger le script via l’url file://cdn.myconstellation.io/xxx ce qui bien sur n’existe pas ! Même problème avec le script jQuery! Pour SignalR comme il n’y a pas de endpoint accèssible en http, le scheme est forcement en https !

Bref, il faut donc définir le scheme explicitement en prefixant http (ou https) :

<script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.2.min.js"></script>
<script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.min.js"></script>
   

Cordialement


#3

Logique même évident avec ces précisions.

j’ai modifié les liens et toutes les fenêtres alert() s’affiche mais aucun log dans la console.
est ce normal?

j’essaye aussi de lire la value d’un SO, ce code est il correct?

var _terrasse_state=constellation.server.requestSubscribeStateObjects("*", "*", "Terrasse_state", "Value");

	alert("etat terrasse : " + _terrasse_state);

Merci encore.


#4

Plutôt qu’utiliser des alert(), je vous conseille des console.log !

Autrement dans la création de votre client (createConstellationConsumer) avez-vous bien défini l’url de votre Constellation “avec” le scheme (ex: “http://ip-ou-dns:8088/”) ?? Dans votre code on dirait qu’il n’y a pas de scheme (http:// ou https://) ?

En effet la lib JS diffère dans celle Arduino dans la mesure où en JS/NG on a besoin de l’URL complete avec le scheme alors que sur Arduino on indique juste l’adresse IP ou DNS du serveur.

Concernant la consommation de SO, il y a trois méthodes :

    requestStateObjects : interrogation à l'instant T d'un ou plusieurs StateObjects
    subscribeStateObjects : abonnement aux mises à jour d'un ou plusieurs StateObjects
    requestSubscribeStateObjects : méthode deux en un pour faire un request (donc avoir la valeur actuelle) puis s'abonner aux updates

Dans les trois cas, ces méthodes ne retournent pas le ou les StateObjects, il faut s’abonner à l’évenement “onUpdateStateObject” :

constellation.client.onUpdateStateObject(function (stateobject) {
   // Reception des StateObjects ici !!    
   console.log(stateobject);
});

Ainsi que ce soit suite à un request ou un subscribe, tous les SO interrogés depuis une page web seront dispatchés dans ce handler.


#5

Pourtant mon adresse serveur est bien écrite:

<!DOCTYPE html>
<html>
<head>
   <link href="css/bootstrap.min.css" rel="stylesheet">
   <script src="js/bootstrap.min.js"></script>
   <script src="js/fonction.js"></script>
   <script type="text/javascript" scr="js/npm.js"></script>
   <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
   <script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.2.min.js"></script>
   <script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.min.js"></script>
   
</head>
<body>
	<script type="text/javascript">
	
	var constellation = $.signalR.createConstellationConsumer("http://xxxxcontrolcenter.ddns.net:8088/", "xxxx", "web");
	
	constellation.connection.stateChanged(function (change) {
    	   if (change.newState === $.signalR.connectionState.connected) {
                 console.log("Je suis connecté");
    	}
	});
	
	constellation.connection.start();
	
	console.log("Je suis connecté");
	
	
</script>


#6

Mon url serveur est bien au format demandé.

J’ai essayé aussi bien en local (ip locale) qu’en distant ( dns et ip distante) et toujours pas de réaction sur la console constellation.

Alors qu’avec mon ESP pas de souci à publié des SO dans les 2 configurations réseaux.


#7

Re,

Quand tu dis “pas de réaction sur la console Constellation”, tu veux plutôt dire la “console du navigateur” ???

En effet les console.log sont pour écrire dans la console du navigateur (Chrome, Firefox, & co).

Una page Web, à savoir un “consommateur”, ne peut pas produire des logs dans constellation.

On est en phase ?


#8

Ok , d’accord il y a eu incompréhension de ma part.

J’attendais un log sur la console constellation.

Donc tout se passe bien alors, j’ai bien les logs dans la console navigateur.
J’ai encore découvert un truc aujourd’hui… je me coucherais moins C…

Merci pour Votre aide.


#9

:wink: Great !

Pour les “back to basic” : https://developer.myconstellation.io/concepts/architecture-constellation-et-les-differents-acteurs/

Nottamement : https://developer.myconstellation.io/concepts/architecture-constellation-et-les-differents-acteurs/#Les_consommateurs

Une page Web par exemple est un consommateur, c’est à dire qu’elle se connecte à Constellation pour interroger des StateObjects ou envoyer/recevoir des messages mais elle n’est pas considérée comme un package dans le sens où une page Web n’est pas un programme déployé et démarré par une sentinelle (son cycle de vie est lié au navigateur du client). Un “consommateur” ne peut ni produire des logs ni avoir de settings ou encore publier des StateObjects. Il consomme ni plus ni moins !

:slight_smile:


#10

Merci vos explications m’ont encore un peu plus éclairé.
et puis une petite recherche et lecture sur les fonctions anonymes mon permis de comprendre votre code.

Merci encore pour votre aide.