Projet constellation de quartier


#1

Bonjour,

Nous sommes les étudiants qui travaillons sur un serveur constellation de quartier. Vous nous avez expliqué la façon d’obtenir les state objects grâce a la partie REST.

Serait-il possible d’obtenir l’ensemble des fonctions possibles grâce à l’API et aussi un exemple d’URL pour obtenir un state object ?
Comment pouvons-nous faire pour avoir un state object d’un autre serveur constellation ?

Merci d’avance pour votre réponse


#2

Bonjour,

Je n’ai pas la réponse pour obtenir un SO mais pour publier un SO voici la commande :

http://ip_constellation:port/rest/constellation/PushStateObject?SentinelName=Test&PackageName=Test&AccessKey=key&name=nom_du_SO&value=valeur_du_SO

Pour envoyer un message :

http://ip_constellation:port/rest/constellation/SendMessage?SentinelName=Test&PackageName=Test&AccessKey=key&scope=Package&args=nom_du_package_cible&key=commande_du_package_cible&data=data


#3

Bonjour,

Pour apporter les réponses en attendant que j’écrive la documentation sur les API REST de Constellation, voici globalement ce qu’on peut dire de façon rapide :

Tout d’abord il existe 3 API REST:

  • l'API "Constellation" pour les packages virtuels (envoi et réception de message, Push & Request/Subscribe de SO, GetSettings, WriteLog ...)
  • l'API "Consumer" pour les consommateurs (envoi et réception de message et Request/Subscribe de SO seulement)
  • l'API "Management" pour l'administration du serveur (gestion des sentinels, packages, etc...)

L’invocation se fait en HTTP sur l’URI http(s)://{votreServerConstellation}:{port}/rest/{api}/{method}
({api} étant soit “constellation”, soit “consumer” ou soit “management”).

Pour chaque requête HTTP vous devez vous identifier en passant les paramètres “SentinelName”, “PackageName” et “AccessKey”.

Dans le cas de l’API “Management”, SentinelName doit être égal à “Management” idem pour l’API Consumer, SentinelName doit être égal à “Consumer”. Puis ensuite le PackageName est un “friendly name” que vous fixez à ce que vous voulez.
Dans le cas de l’API “COnstellation”, le SentinelName et PackageName doit être correctement déclaré dans votre fichier de configuration. On appelle cela un package “virtuel”.

A noter que ces 3 paramètres sont soit passés des l’URI (querystring) ou soit dans les headers HTTP de votre requête.

La liste des méthodes (brutes) de l’API Constellation :

  • CheckAccess
  • SendMessage(SendMessageRequest)
  • SendMessage(ScopeType, key, data, args = null)
  • SendMessageWithSaga(ScopeType, key, data, args = null) -> return sagaId
  • PushStateObject(PushStateObjectRequest)
  • PushStateObject(name, value, type = null, lifetime = 0)
  • PurgeStateObjects(name = null, type = null)
  • WriteLog(message, level = Info)
  • GetSettings() -> return key/value list
  • SubscribeToMessage(subscriptionId = null) -> return subId
  • SubscribeToMessageGroup(group, subscriptionId = null) -> return subId
  • GetMessages(subscriptionId, timeout = 60)
  • RequestStateObjects(sentinel, package, name, type) -> list of StateObject
  • SubscribeToStateObjects(sentinel, package, name, type, subscriptionId = null) -> return subId
  • GetStateObjects(subscriptionId, timeout = 60)
  • DeclarePackageDescriptor(packageDescriptor) (POST)

Pour répondre à votre question, pour récupérer un SO, vous allez utiliser la méthode “RequestStateObjects”, par exemple pour demander tous les SO dont le nom est “Temperature”

http://ip_constellation:port/rest/constellation/RequestStateObjects?SentinelName=Test&PackageName=Test&AccessKey=key&name=Temperature

Si vous voulez tous les SO du package HWMonitor de toutes vos sentinelles :
http://ip_constellation:port/rest/constellation/RequestStateObjects?SentinelName=Test&PackageName=Test&AccessKey=key&package=HWMonitor

En réponse vous obtenez la liste des SO au format JSON qui match avec votre requête.

Vous pouvez aussi vous “inscrire” aux modifications de ces SO. Pour cela, vous faites la même requête sur la méthode “SubscribeToStateObjects”.

Exemple, je m’abonne ici aux SO du package HWMonitor qui tourne sur ma machine (sentinelle) nommée “PC-SEB”

http://ip_constellation:port/rest/constellation/SubscribeToStateObjects?SentinelName=Test&PackageName=Test&AccessKey=key&sentinel=PC-SEB&package=HWMonitor

En réponse vous obtenez un ID d’abonnement.

Vous pouvez maintenant appeler la méthode “GetStateObjects” en passant l’ID d’abonnement :
http://ip_constellation:port/rest/constellation/GetStateObjects?SentinelName=Test&PackageName=Test&AccessKey=key&subscriptionId={id}

C’est une requête en “long-polling”, c’est à dire que tant qu’il n’y a pas de SO qui ont été mis à jour, la requête attend (60 secondes par défaut) ce qui éviter de d’interroger en boucle le serveur.

Voilà j’espère avoir pu vous mettre sur la piste.

D’ici le mois de Juin, l’ensemble de la documentation sur les API REST sera disponible avec explication et détail de l’ensemble des paramètres agrémenté de nombreux exemples.


#4

Merci pour vos réponses

Ces URL me permettent en effet de récupérer des données au format JSON mais uniquement pour ma constellation. En clair, il n’est pas possible pour mon binôme de récupérer, par exemple, mes state objects.
Nous pensons que cela est dû au fait que ma constellation “s’appelle” localhost:8088, ce qui expliquerait pourquoi je suis le seul à pouvoir récupérer les données.
Ma question est donc : comment est-il possible de passer en non local afin de mettre mes données à disposition de n’importe qui (qui connait l’URL à rentrer) ?

Merci d’avance


#5

Il s’agit de l’url de ton pc tout simplement !

Il faut penser à mettre localhostonly sur false dans ton fichier de configuration.


#6

Petite précision le “localhostonly” dans le fichier de configuration ne concerne que l’accès à la WebConsole (si autohosté par le service Constellaiton).

Les hubs & API REST de Constellation sont toujours accessibles à tous (avec AccessKey qd même ;)) à partir du moment où le firewall de la machine autorise le port 8088 (par défaut à l’installation).

Donc comme le dit Hydro, il suffit juste de remplacer “localhost” par le nom DNS ou l’adresse IP de ta machine qui héberge le serveur Constellation.

Idéalement le serveur “ne devrait pas bouger”. Car sur ton laptop, en fonction de ton emplacement (ecole vs maison), et de ton dhcp, tu n’auras pas toujours la même IP. Et tes “clients” doivent être également connectés sur le même réseau que toi.

C’est pourquoi, il peut être intéressant d’installer le serveur Constellation sur une machine fixe allumé 24/24 (en gros un serveur) connecté à Internet sur lequel tu ouvres le port sur ton routeur de façon à pouvoir accéder à ton serveur n’importe où ou tu te trouves à partir du moment où tu as une connexion internet.
Si tu n’as pas d’IP fixe par ton FAI, tu peux utiliser des services de DynDNS.
Et si tu n’as pas de PC en rab (fixe, laptop, NUC) que tu peux laisser chez toi allumé 24/24, tu peux aussi installer un serveur Constellation sur un Raspberry Pi.

A+


#7

En effet, je me suis assez vite rendu compte qu’avoir un “serveur” fixe était indispensable pour que les données lui soient automatiquement envoyées.

J’ai essayé plusieurs méthodes de l’API, mais je n’arrive pas à faire fonctionner PurgeStateObjects.

J’ai cherché à l’utiliser de la manière suivante :

http://ip_constellation:port/rest/constellation/PurgeStateObjects?SentinelName=Test&PackageName=Test&AccessKey=key&name=SO

Un message d’erreur s’affiche : {“Message”:“The requested resource does not support http method ‘GET’.”}

Dois-je formuler l’URL d’une manière différente pour cette méthode ?