Contiki est un système d’exploitation léger et flexible pour capteurs miniatures en réseau. Ces dernières années, le monde scientifique a porté une attention importante aux réseaux de capteurs sans fil. La miniaturisation des capteurs et leur prix relativement faible, permettent d'imaginer des applications très variées dans les domaines scientifiques, militaires, industriels et domotiques. Pour faciliter le développement de ces applications, une équipe du centre suédois de recherche scientifique a créé Contiki. Destiné à être embarqué dans des capteurs miniatures ne disposant généralement que de ressources limitées, Contiki propose malgré tout les principales caractéristiques et fonctionnalités d'un système d'exploitation tout en favorisant une consommation énergétique et une empreinte mémoire minimales. Ses principaux atouts sont le support des protocoles IPv6 et 6LoWPAN, sa flexibilité et sa portabilité. Disponible gratuitement sous licence BSD, Contiki peut être utilisé et modifié, même à des fins commerciales.
Récemment une nouvelle branche mise à jour a été créée : Contiki-NG
Fonctionnement et théorie thumb|400px|architecture de Contiki Écrit en langage C, Contiki est constitué d’un noyau, de bibliothèques, d’un ordonnanceur et d’un jeu de processus. Comme tout système d'exploitation, son rôle est de gérer les ressources physiques telles que le processeur, la mémoire, les périphériques informatiques (d'entrées/sorties). Il fournit ensuite aux applications informatiques des interfaces permettant d'utiliser ces ressources. Conçu pour les modules de capteurs sans fil miniatures, il occupe peu d'espace en mémoire et permet une consommation électrique très faible.
Contiki offre deux types de connectivité : la couche Rime, elle permet un dialogue vers les capteurs voisins ainsi que le routage. la couche uIP, orientée Internet, elle offre les services essentiels du protocole IP mais nécessite plus de ressources que Rime. Pour économiser la mémoire, tout en fournissant un bon contrôle de flux dans le code, Contiki utilise un mécanisme appelé Protothreads. Protothreads est un compromis entre la programmation événementielle et la programmation multi-threads. Contiki gère les standards 6LoWPAN, RPL, CoAP. Le système de fichier Coffee permet des opérations sur des fichiers stockés sur une mémoire flash externe. Contiki offre également des services comme un serveur telnet fournissant un accès similaire à un Shell Unix, un serveur web, une interface graphique fournie par un serveur VNC et d'autres fonctionnalités comme un navigateur web.
Les caractéristiques Un système d'exploitation pour capteur en réseau a différentes caractéristiques : Empreinte mémoire L'espace mémoire utilisé par le système d'exploitation et par l'application doit être suffisamment faible pour être contenu dans la mémoire du capteur. Une configuration typique de Contiki (le noyau et le chargeur de programmes) consomme de RAM et de ROM.
Consommation électrique L'énergie électrique, souvent apportée par une batterie de piles, peut être problématique à renouveler. Si des systèmes de captage, comme des éléments photovoltaïques, éoliennes, ou autres peuvent être utilisés dans certains cas, les recherches scientifiques explorent les possibilités de réduire la consommation des capteurs. L'élément le plus consommateur est le module radio. La réduction de temps de transmission et de réception radio est primordiale. Pour cela, le module radio est activé lorsque nécessaire, et arrêté ou mis en veille le reste du temps. Mais lorsque le module radio est arrêté, le capteur ne reçoit pas les messages qui lui sont destinés. Un réveil périodique risque d'être inutile, et donc de consommer de l'énergie de façon inefficace. Pour gérer cette problématique, Contiki propose par défaut ContikiMAC, un mécanisme conçu pour rester en communication avec le réseau efficacement, tout en permettant la mise hors tension du module radio 99 % du temps . D'autres techniques permettent de limiter la consommation telles que le compactage des données à transférer, le pré-calcul (afin de ne transmettre que les données réellement utiles), mais aussi une optimisation du routage. Dans certains cas, il peut être utile de stocker des informations dans une base de données locale au capteur, telle qu'Antelope, en effet, si le capteur doit envoyer un ensemble de mesures semblables à des résultats déjà envoyés à un autre moment, il peut être préférable d'envoyer une référence à ces données déjà envoyées (Parcourir 100 enregistrements dans une base coûte moins d'énergie que de transmettre un paquet radio).
Communications Contiki implémente deux mécanismes de communication :
La couche de protocole Rime. Elle fournit à la couche applicative un jeu d'instructions de communication, permettant les différentes connexions avec les capteurs voisins. Les applications ou protocoles exécutés au-dessus de la couche Rime peuvent utiliser une ou plusieurs instructions de communication fournies par la couche Rime. Rime peut être associé au mécanisme Chameleon afin de s'adapter aux protocoles de la couches MAC. Chameleon gère la création, la lecture et la transformation des entêtes des protocoles de la Couche liaison de données du modèle OSI et communique avec la couche Rime en associant des attributs aux paquets. Les informations importantes des entêtes des protocoles inférieurs pourront ainsi remonter vers la couche applicative ou le protocole situé au-dessus de la couche Rime.
La couche uIP. Contiki implémente uIPv4 et uIPv6. uIP supporte les protocoles IP, TCP, UDP et ICMP. uIPv6 est la première implémentation d'IPv6 pour capteurs miniatures à avoir obtenu le label IPv6 Ready Phase-1, elle répond aux exigences de la RFC4229. Pour les communications radio via le protocole IEEE 802.15.4, Contiki implémente 6LoWPAN. Lors de communications radio suivant la norme IEEE 802.15.4 communément utilisée par les capteurs, la taille d'un paquet est limitée à , ce qui est insuffisant pour transmettre un paquet IPv6 dont la taille maximum est de . L'IETF a créé une couche d'adaptation 6LoWPAN qui se situe entre les couches liaison et réseau du modèle OSI. 6LoWPAN permet la compression de l'entête du paquet IPv6 ainsi que la fragmentation et le ré-assemblage des datagrammes. Pour le routage d'IPv6 à travers le réseau de capteur, Contiki intègre ContikiRPL dans la couche uIPv6, une implémentation du protocole de routage RPL (routing protocol for Low power and Lossy Networks).
Portabilité La portabilité consiste à adapter le système d'exploitation aux capteurs, selon les éléments électroniques les constituant. Contiki est complètement écrit en langage C, ce langage de programmation est le langage le plus répandu pour la programmation des systèmes . La plupart des constructeurs de microprocesseurs et de micro-contrôleur fournissent une solution de compilation croisée permettant de compiler sur une machine de type PC le code source écrit en C afin d'obtenir un programme en langage machine qui sera compris par le microprocesseur. Le portage de Contiki est effectué pour les plateformes suivantes: exp5438, RE-mote, Firefly, Zoul, wismote, avr-raven, avr-rcb, avr-zigbit, iris, micaz, redbee-dev, redbee-econotag, mb851, mbxxx, sky, jcreate, sentilla-usb, msb430, esb, avr-atmega128rfa, cc2530dk, sensinode ainsi que sur apple2enh, atari, c128, c64
Interopérabilité L’interopérabilité d'un capteur est le fait de pouvoir communiquer avec des capteurs gérés par un système d'exploitation différent. Adams Dunkels de l'équipe scientifique suédoise présente dès 2003 uIP et lwIP permettant d'implémenter le protocole IP sur les systèmes limités en ressources tels que les capteurs. Jusque-là, les capteurs utilisaient des protocoles de communication propriétaires ou alors des adaptations d'IP permettant le fonctionnement des applications mais sans offrir toutes les fonctionnalités du protocole IP. Dès la présentation de Contiki en 2004, uIP et lwIP étaient disponibles. De ce fait, les applications exécutées sur Contiki pouvaient dialoguer vers n'importe quel matériel supportant le protocole IP. L'arrivée de IPv6 et uIPv6 sur Contiki apporte une nouvelle interopérabilité vers les matériels supportant ce protocole. Le support de 6LoWPAN permet à Contiki de communiquer avec les matériels via un réseau sans-fil suivant la norme 802.15.4. Contiki est réputé pour être un système d'exploitation robuste et mature, fournissant IPv4 et IPv6 pour les réseaux de capteurs sans-fil. Selon une étude publiée en 2011, comprenant des tests d'interopérabilité entre des capteurs sous Contiki et d'autres sous TinyOS, l'interopérabilité est bien au rendez-vous, mais des efforts sont à faire pour mesurer et améliorer les performances des couches réseaux.
Des fonctionnalités Accès distant thumb|400px|interface graphique de Contiki Contiki propose plusieurs moyens de connexion à distance : un serveur telnet un serveur web un web service une interface graphique via un serveur VNC
Autres Le code source de Contiki contient un répertoire apps dans lequel on trouve des applications optionnelles : un shell de commandes : Contiki propose également dans ses options un shell de commandes dans le style unix. Un certain nombre de commandes utiles au développement et au debug sont disponibles. Comme dans un Shell Unix, les commandes peuvent s'enchainer à travers un pipe. Le développeur peut enrichir le shell avec ses propres commandes. un navigateur web un client ftp un client dhcp un client mail un client de messagerie instantanée IRC un analyseur/générateur JSON un client telnet un client twitter une calculatrice ....
Mise à jour, ou mise en place de nouvelles applications à distance thumb|400px|Chargement en mémoire du système et des programmes Contiki est un système d'exploitation modulaire. Contrairement à un système d'exploitation monolithique où le système complet ainsi que les applications sont enregistrées dans un fichier binaire qui est chargé d'un seul bloc dans l'EEPROM du capteur, sur Contiki le fichier binaire contient uniquement le système, les applications sont enregistrées séparément sous forme de modules. Contiki réalise le chainage des références de façon dynamique (), les modules sont au format ELF qui est le format par défaut produit par le compilateur GCC, ou bien au format Compact ELF. Contiki peut ainsi charger et décharger des applications dynamiquement, ce qui permet une flexibilité pour la maintenance et la mise à jour de ces applications. Ce système modulaire apporte plusieurs avantages : Réduction de la consommation d'énergie. Lors d'une mise à jour applicative, seuls les modules concernés seront transférés. Réduction de l'utilisation de la mémoire vive : Le fait de ne charger les programmes qu'en temps utile réduit l'utilisation de la mémoire. Simplification de la maintenance du code : Le système est compilé une seule fois par type de capteur. La maintenance du code se fera par module applicatifs, qui pourront être chargés différemment selon les fonctions des capteurs dans le réseau. La présentation de Snap par Simon Duquennoy montre que la mise à jour ou l'installation d'une nouvelle application peut se faire d'une façon extrêmement simple à l'aide d'un smartphone via un stockage d'applications pour capteurs (a sensornet appstore).
Accès à une mémoire morte externe à l'aide d'un système de fichier L'utilisation sur les capteurs d'une mémoire morte complémentaire de type mémoire flash se généralise par la présence d'un lecteur de carte microSD. Plusieurs facteurs expliquent cela : le faible coût, le faible encombrement et la résistance aux chocs, la taille importante de la capacité de stockage allant de nos jours jusqu'à plusieurs Gigaoctets. L'utilisation de ce type de mémoire apporte divers avantages :