Tutorial sur OSGi basé sur OSCAR
par Didier DONSEZ

Installation d'OSCAR

Pour l’installation d’OSCAR, suivez les instructions (en français) données par Humberto Cervantes: http://www-adele.imag.fr/~cervante/osgitutorial/tutorial1.htm
Vous pouvez aussi vous reportez à la documentation d'OSCAR : http://oscar-osgi.sourceforge.net/install.html

Premières manipulations

Une fois que OSCAR est installé, lancez OSCAR avec le script run.bat (run.sh sur Unix).
Vous allez pouvoir tester quelques commandes depuis la console locale de la passerelle.
Voici le résultat de la commande help: Console
run

Welcome to Oscar.
=================

Enter profile name: hello1

-> help
bundlelevel <bundle-id> [<level>] - get or set bundle start level.
cd <base-URL>                     - change or display base URL.
exports                           - list exported packages.
help                              - display shell service commands.
info <id> [<svc-iface>]           - display bundle or service properties.
install <URL> [<URL> ...]         - install bundle(s).
obr -help                         - Oscar bundle repository.
ps [-l]                           - list installed bundles.
refresh                           - refresh packages.
services [all]                    - list registered services.
shutdown                          - shutdown Oscar.
start <id> [<id> <URL> ...]       - start bundle(s).
startlevel [<level>]              - get or set framework start level.
stop <id> [<id> ...]              - stop bundle(s).
uninstall <id> [<id> ...]         - uninstall bundle(s).
update <id> [<URL>]               - update bundle.
version                           - display version of Oscar.
->
Les commandes fournissant des informations sur les bundles installés sont:

Les commandes liées à l'installation/démarrage sont: Il est possible d'ajouter des commandes au shell. En effet, une commande est un service fournit implémentant l'interface org.ungoverned.oscar.service.shell.Command. Edit
package org.ungoverned.oscar.service.shell;

public interface Command {
    public String getName();
    public String getUsage();
    public String getShortDescription();
    public void execute(String line, PrintStream out, PrintStream err);
}
Par exemple, la commande run fourni par le bundle http://www-adele.imag.fr/~donsez/dev/osgi/runcmd/runcmd.jar lance un train (batch) de commandes regroupées dans un fichier. Console
-> obr -s Service Binder
-> start http://www-adele.imag.fr/~donsez/dev/osgi/runcmd/runcmd.jar
-> services
...
[Bundle 1, Service 0] org.ungoverned.oscar.service.shell.ShellService
[Bundle 1, Service 2] org.ungoverned.oscar.service.shell.CdCommand
[Bundle 5, Service 0] org.ungoverned.oscar.service.shell.Command
...
-> run -help
...
-> run -s -e -p http://www-adele.imag.fr/~donsez/dev/osgi/script/testruncmd.txt
...
Vous pouvez vous reportez à la documentation d'OSCAR : http://oscar-osgi.sourceforge.net/usage.html

Accès par la console locale et graphique de la passerelle

OSCAR dispose d'une console graphique pour lister les bundles installés et les administrer

Shell GUI

Cette console requiert l'installation et le démarrage des 3 bundles suivants en plus du Shell Service (file:bundle\shell.jar) qui est déjà installé Console
-> install file:bundle\tablelayout.jar
-> start file:bundle\shellgui.jar
-> start file:bundle\shellcomponent.jar
->

Accès par la console distante (Telnet) de la passerelle

Généralement, une passerelle OSGi se trouve enfouie dans un equipement dépourvu de clavier et d'écran (comme par exemple, une station météo, une voiture, une centrale de surveillance dans votre maison secondaire, ...)
Il est donc nécessaire de pouvoir opérer celle-çi à distance. Pour cela, il est possible d'installer des consoles distantes d'accès comme Telnet ou Http.
Pour la console Telnet, vous devez au préalable configurer le fichier lib/bundle.properties d'OSCAR pour autoriser les accès par telnet en y ajoutant la ligne:

osgi.shell.telnet=on

Vous pouvez vous reportez à la documentation http://oscar-osgi.sourceforge.net/bundles.html#telnet Console
-> obr -s Telnet Service
Starting Telnet Service...
[13/avr./2004:06:57:18 CEST] Listening to Port 6623 with a connectivity queue size of 5.
-> ps
START LEVEL 1
   ID   State         Level  Name
[   0] [Active     ] [    0] System Bundle
[   1] [Active     ] [    1] Shell Service
[   2] [Active     ] [    1] Shell TUI
[   3] [Active     ] [    1] Oscar Bundle Repository
[   4] [Active     ] [    1] telnetd
-> [13/avr./2004:06:57:38 CEST] connection #1 made.
[13/avr./2004:06:58:22 CEST] connection #1 made.
->

Ouvrez un client Telnet (telnet ou PuTTY par exemple) avec l'adresse IP ou DNS de la passerelle sur le port 6623 et choisissez le shell d'OSCAR: Telnet mygateway.mycomp.com 6623
Welcome to the SoftSell OSGI Telnet Server

Available Services:

OSCAR
Enter Choice> entrez OSCAR

-> ps
...

Atention, l'accès par Telnet doit être sécurisé (par SSH par exemple) quand la passerelle est dans son environnement de production.
Question: quels sont les risques potentiels si la liaison n'est pas sécurisée ?

Accès distant à l'administration de la passerelle depuis un navigateur Web

Une autre manière d'administrer la passerelle à distance est d'utiliser un navigateur Web. Lancez la commande suivante: Console
-> obr -s Http Admin
Starting dependency Servlet...
Starting dependency HTTP Service...
17:59:23.865 EVENT  Starting Jetty/4.2.x
17:59:23.985 EVENT  Started SocketListener on 0.0.0.0:80
17:59:23.995 EVENT  Started org.mortbay.http.HttpServer@1bca5f1
Starting HTTP Admin...
17:59:25.487 EVENT  Started ServletHttpContext[/]
17:59:25.517 EVENT  Started HttpContext[/admin/resource]
-> ps
->

Puis ouvrez un navigateur Web : http://localhost/admin
Atention (même remarque), l'accès par HTTP doit être sécurisé (avec SSL par exemple) et l'opérateur doit être authentifié (username/password, certificat,...) quand la passerelle est dans son environnement de production.

Installation et démarrage de bundles

Nous allons installé et démarré les bundles qui compose l’application Hello World.
Cette application très simple se constitue d'un bundle HelloRequester qui requiert au moins un service HelloService pour démarrer.
Les 2 services HelloService disponibles sont configurés avec des propriétés différentes (ie language=fr et language=en) Edit
package fr.imag.adele.bundle.hello;
/**
 *@version 1.0
 */
public interface HelloService  {
	public String sayHello(String name);
}

Une fois démarré, le bundle HelloRequester demarre une thread qui invoque régulièrement la méthode sayHello() sur les services HelloService disponibles.
Les sources des 3 bundles sont disponibles sur
Lancez les commandes suivantes depuis la console: Console
-> install http://www-adele.imag.fr/~donsez/dev/osgi/hellorequester10/hellorequester10.jar
...
-> install http://www-adele.imag.fr/~donsez/dev/osgi/helloservice10/helloservice10.jar
-> install http://www-adele.imag.fr/~donsez/dev/osgi/helloservice10/helloservice10en.jar
->
Question: pourquoi la première commande échoue ? Que doit faire l'opérateur pour démarrer le bundle hellorequester10.jar ?

Versions de spécification

Les bundles OSGi indiquent la version des packages qu'ils exportent ou qu'ils importent.
Les manipulations suivantes montrent les problèmes qui peuvent subvenir.
Nous allons installé et démarré les bundles dans des versions de specifications plus recentes (1.1).
La version 1.1 de la spécification comporte une interface supplémentaire qui permet de changer la langue d'affichage du service HelloService. Edit
package fr.imag.adele.bundle.hello;
/**
 *@version 1.1
 */
public interface LocaleService  {
	public String getLanguage();
	public void setLanguage(String language);
}

Lancez les commandes suivantes depuis la console: Console
-> exports
-> install http://www-adele.imag.fr/~donsez/dev/osgi/hellorequester11/hellorequester11.jar
-> install http://www-adele.imag.fr/~donsez/dev/osgi/helloservice11/helloservice11.jar
-> ps
...
-> exports
...
->

Question: Quel est le status de ces deux nouveaux bundles ? Que s'est passé t'il ? pourquoi ?

Arrêtez et redémarrez la passerelle
Puis lancez les commandes suivantes depuis la console: Console
run

Welcome to Oscar.
=================

Enter profile name: hello1

-> ps
...
-> exports
...
-> services
...
->

Question: Quel est le status de ces deux nouveaux bundles ? Pourquoi ? Quel bundle exporte maintenant le package fr.imag.adele.bundle.hello ? Pourquoi lui ?
Demarrez les deux bundles avec leur identifiant (commande start)
Remarque: pour arrêter les traces des 2 bundles HelloRequester, arrêtez les (commande stop)

Evénements

L'installation, la mise à jour ou désinstallation de bundles, le démarrage ou l'arrêt de services provoquent des événements qui sont notifiés aux bundles qui ont positionné des listeners sur ceux-çi.
Le bundle http://www-adele.imag.fr/~donsez/dev/osgi/event/event.jar imprime la trace des événements qui sont notifiés.
Installez le puis recommencer l'installation de l'application Hello World.

Commande hello

Nous allons compléter l'application Hello World d'une commande hello accessible depuis le shell d'OSCAR
Cette commande requière les services HelloService fournis par d'autres bundles et fournit un service org.ungoverned.oscar.service.shell.Command
Exercice: Développez le bundle HelloCommand qui fournit cette commande en repartant des sources de HelloRequester et à partir des sources de RunCommand
Installez ce bundle et testez le.

HelloServlet: accès par le Web

Nous allons compléter l'application Hello World d'une servlet HelloServlet activé et enregistré auprès du HttpService par le bundle http://www-adele.imag.fr/~donsez/dev/osgi/helloservlet/helloservlet.jar
Pour cela, lancez les commandes suivantes: Console
-> obr -s Http Service
Starting dependency Servlet...
Starting HTTP Service...
17:59:23.865 EVENT  Starting Jetty/4.2.x
17:59:23.985 EVENT  Started SocketListener on 0.0.0.0:80
17:59:23.995 EVENT  Started org.mortbay.http.HttpServer@1bca5f1
-> ps
...
-> start http://www-adele.imag.fr/~donsez/dev/osgi/helloservlet/helloservlet.jar
...
->

Puis ouvrez un navigateur Web : http://localhost/hello

La version actuelle de HelloServlet n'utilise pas les services HelloService fournis par d'autres bundles
Exercice: à partir des sources de HelloServlet, modifiez ceux-ci pour que la servlet utilise les services HelloService fournis par d'autres bundles

ServiceBinder

ServiceBinder permet de faciliter le développement de bundles OSGi en décrivant les services fournis et requis plutôt qu'en en programmant explicitement l'enregistrement et le courtage.
Exercice: Réécrivez les 2 bundles de HelloCommand et HelloServlet avec ServiceBinder Testez les en lançant les commandes suivantes: Console
run

Welcome to Oscar.
=================

Enter profile name: sb

-> obr -s Service Binder
-> rem start http://www-adele.imag.fr/~cervante/servicebinder/jar/servicebinder1.1.jar
-> ps
...
-> start file:z:\osgi\mybundles\helloservletsb.jar
-> start file:z:\osgi\mybundles\hellocmdsb.jar
-> start http://www-adele.imag.fr/~donsez/dev/osgi/helloservicesb/helloservicesb.jar
...
-> start http://www-adele.imag.fr/~cervante/servicebinder/jar/architectureviewer1.1.jar
La dernière commande lance une application graphique qui visualise les liaisons entre bundles (developpés avec ServiceBinder) qui constituent l'architecture d'une application

Service Binder

CronService

Le service CronService fournit par le bundle http://www-adele.imag.fr/~desertot/dev/osgi/cronservice/cronservice.jar permet de déclencher de façon périodique un objet implémentant l'interface TimerObject.
L'usage de ce service est documentée http://www-adele.imag.fr/~desertot/dev/osgi/cronservice/
L'exemple lancé par les commandes suivantes "cron" 2 TimerObjects (1 toutes les 10 sec., l'autre toutes les 20 sec.) Console
run

Welcome to Oscar.
=================

Enter profile name: cron

-> obr -s Service Binder
Starting Service Binder...
-> start http://www-adele.imag.fr/~desertot/dev/osgi/cronservice/cronservice.jar
------------------ Cron Service activated ------------------
-> services
...
[Bundle 5, Service 0] fr.imag.cronservice.CronService
...
-> start http://www-adele.imag.fr/~desertot/dev/osgi/cronservice/crontest.jar
Case number one. time = Tue Apr 13 18:37:48 CEST 2004
Case number two. time = Tue Apr 13 18:37:58 CEST 2004
Case number one. time = Tue Apr 13 18:37:58 CEST 2004
Case number one. time = Tue Apr 13 18:38:08 CEST 2004
Case number two. time = Tue Apr 13 18:38:18 CEST 2004
Case number one. time = Tue Apr 13 18:38:18 CEST 2004
...

Exercice: Modifier le bundle HelloRequester pour qu’il utilise le service TimerService au lieu d'une thread

WireAdmin

A rediger
Le WireAdmin est un service qui permet de construire des applications à base de capteurs.
Les applications sont construites en reliant des services Producer avec des services Consumer par des objets appelés Wire.
Le script de commande suivant donne un exemple d'utilisation: Console
run

Welcome to Oscar.
=================

Enter profile name: wa

-> obr -s Service Binder
...
-> http://www-adele.imag.fr/~donsez/dev/osgi/runcmd/runcmd.jar
-> run -e -p http://www-adele.imag.fr/~donsez/dev/osgi/script/wa.remote.txt
...
-> start http://www-adele.imag.fr/~cervante/servicebinder/jar/architectureviewer1.1.jar
->
Lancez un butineur Web sur http://localhost/wa/poll?css=style.css&refresh=10 pour obtenir la page suivante:

WireAdmin

Mini-Projets sur OSGi

Pour le développement de vos bundles, vous utiliserez le projet ANT http://www-adele.imag.fr/~donsez/dev/osgi/__BUNDLE_NAME__/__BUNDLE_NAME__-src.zip
Il vous suffit :

Exercice: Mail IO Connector et Commande

Ecrire une commande Shell mail permettant d'envoyer un mail depuis la console

Exercice: Mail IO Connector et Servlet

Développez un bundle IOServlet qui permette entre autre d'envoyer des mails ou des sms en passant par le service IOCOnnector Vous reparti de smsservlet, ecrire une Servlet permettant d'ecrire dans un outputstream Tester le avec mailio mail depuis une page Web

Exercice: Mail IO Connector et Cron Service et Consumer

Ecrire un consumer conserve un historique des mesures poussées par des producers sur les Wires puis les envoie par mail périodiquement à un utilisateur

Exercice: WMA

A rédiger

Exercice: Mail multimedia

Developpez un bundle qui envoie par mail une image capturée depuis la WebCam connectée à la passerelle. Vous vous baserez sur l'exemple WireAdmin.

Exercice: Usage Producer

A partir de DateProducer, ecrire un producer qui remonte les informations sur le système en exploitant les données des fichier du répertoire /proc.
/proc est un système de fichiers très spécial puisqu'il contient des informations (lecture/écriture)

Cependant, sa structure peut variée d'un Unix à l'autre. Vous trouverez plus d'info sur /proc de votre système en utilisant la documentation (man proc) ou sur plusieurs sites Web comme Linux Forum, Die.Net, ...

Exercice: HistoryPortal

A partir de ConsumerServlet et StringConsumer, afficher l'historique des valeurs capturées sur des producers (Measurement, Usage, ...)
Pour cela, il est nécessaire de "poller" régulièrement les Producers (comme le fait StringConsumer) et d'historiser les valeurs "pollées".
Le nombre de valeurs à conserver dans l'historique est paramétrable.
Le fréquence du polling est paramétrable.
Pour l'affichage, vous utiliserez le grapheur JavaScript suivant: http://www-adele.imag.fr/~donsez/cours/exemplescourstechnoweb/js_graphimg/.

Exercice: Ajout d'un composant OBR à la console Graphique

Ajoutez un composant graphique à la console graphique qui permet d'effectuer les opérations équivalentes à la commande obr

Exercice: Ajout du commande au Shell

Ecrire une commande Shell cron permettant de déclencher de façon périodique n'importe quel service désigné par un filtre
Les informations concernant le fonctionnement du Shell sont disponibles sur http://oscar-osgi.sourceforge.net/shell.html

Exercice: Commande MBean

A rédiger

Exercice : CurrencyConvertorService et commande associée

A rédiger

OSGi avancé

Fabrique d'instance de services

A rédiger

Accès aux ressources et aux fichiers du cache

A rédiger

Configuration avec l'interface Configurable et le ConfigurationService

A rédiger

Configuration avec un MBean JMX

A rédiger

Annexes

Ressources sur OSGi

Autres Ressources