AppTethering pour exploiter une connexion Internet

Didier Cabalé

Ce tutoriel se propose de présenter un exemple simple mettant en œuvre le tethering. Cette technologie permet à une application de communiquer avec une autre qui tiendra lieu de modem en utilisant sa connexion Internet.

- Titre : AppTethering pour exploiter une connexion Internet

- Auteur : Didier Cabalé

- Parution : 26 février 2017

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2017 Didier Cabalé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Présentation des composants impliqués

- II-A. TTetheringManager

- II-B. TTetheringAppProfile

- III. Application de partage de connexion Web

- III-A. Principe général

- III-A-1. L'application client

- III-A-2. L'application WebProvider

- III-B. Processus chronologique entre les deux applications

- III-B-1. Du côté client

- III-B-2. Du côté WebProvider

- III-B-3. De nouveau du côté client

- IV. Les applications exemples

- V. Conclusion

I - Introduction

Depuis RADStudio XE6, il existe une bibliothèque de composants permettant aux applications qui les utilisent de communiquer aisément entre elles.

Si le nombre de cas d'utilisation est infini, on pourrait les catégoriser comme suit :

- application satellite : cas d'une application tierce, qui vient au service d'une application principale, et qui ne peut exister indépendamment de l'application principale (ex : lanceur d'application, serveur d'impression) ;

- application complémentaire : cas d'une application tierce qui vient en complément d'une application principale, parce que l'application principale n'implémente pas la fonction (ex : modem, application de prise de photo, application de prise de mesure via des capteurs /détecteurs) ;

- application entre pairs : cas d'une application qui fonctionne avec ses pairs : deux ou plusieurs applications identiques communiquent entre elles (ex : application de messagerie instantanée, compteurs).

L'exemple traité ici sera un cas particulier d'une application de type complémentaire puisqu'il s'agira d'une application de partage de connexion Internet.

Le cas du partage d'une connexion Internet est le cas qui a donné son nom à tethering, à tel point que ce service est implémenté en standard par les systèmes d'exploitation quand, depuis un matériel ne disposant pas de connexion Web autonome, ce matériel décide de s'adresser à un autre matériel, généralement un téléphone portable, pour obtenir la connexion.

II - Présentation des composants impliqués

II-A - TTetheringManager

L'objectif du composant TTetheringManager est de gérer la connexion.

La propriété principale à utiliser est :

- AllowedAdapters: [Network|Bluetooth|Network_V4|NetWork_V6]

Comme son nom l'indique, elle permet de préciser l'adaptateur à utiliser. Par ailleurs, il est possible d'ajouter ses propres adaptateurs (Adapters). Pour plus de détails, cf. Embarcadero.

II-B - TTetheringAppProfile

L'objectif du composant TTetheringAppProfile est d'encapsuler les ressources et les actions qui seront partagées au sein d'un même conteneur ayant des règles communes de sécurité et d'accès aux ressources et actions.

Les principales propriétés de ce composant sont :

- Manager : cette propriété pointera sur le composant TTetheringManager décrit précédemment. Ainsi, un TTetheringManager pourra être associé à plusieurs TTetheringAppProfile.

- Actions : il s'agit de la liste d'actions qu'il sera possible d'invoquer depuis l'application distante, ou bien des actions de l'application distante qu'il sera possible d'invoquer.

- Resources : indique la liste des données qu'il sera possible de partager avec l'application distante. Ces données pourront être partagées de diverses manières : soit la donnée est envoyée, soit elle est demandée puis reçue, soit elle est écoutée.

- Group : donne le nom du groupe au sein duquel toutes les applications possédant un TTetheringAppProfile avec le même nom de Group pourront entrer en communication automatiquement.

III - Application de partage de connexion Web

III-A - Principe général

Deux applications seront impliquées : une application demandeuse (dite client) et une application fournisseuse (dite WebProvider).

III-A-1 - L'application client

Cette application disposera de l'interface utilisateur afin de permettre à ce dernier de demander une page Web via son URL.

Pour communiquer cette information à l'application fournisseuse, les deux composants d'AppTethering seront nécessaires.

Seul le TTetheringAppProfile aura un événement à gérer, celui qui surviendra quand l'application WebProvider lui enverra sa réponse.

À part cet événement OnResourceReceived, les autres propriétés ne devront pas être modifiées.

III-A-2 - L'application WebProvider

Cette application disposera de l'accès au Web afin de renvoyer au client le flux http relatif à sa requête, comme indiqué dans le paragraphe précédent.

Pour communiquer cette information à l'application client, les deux composants d'AppTethering seront là aussi nécessaires.

Seul le TTetheringAppProfile aura un événement à gérer, celui qui surviendra quand le client lui enverra sa requête.

À part l'événement OnResourceReceived, les propriétés de ces composants n'ont pas à être modifiées.

III-B - Processus chronologique entre les deux applications

III-B-1 - Du côté client

Avant d'envoyer la requête, une vérification de connexion devra être faite : le TTetheringManager est-il connecté au WebProvider ?

L'envoi de la requête est réalisé via l'événement choisi (par exemple, TAction.OnExecute), comme suit :

TTetheringAppProfile.SendString(aProfileInfo: TTetheringProfileInfo, aDescription: string, aString: string)

Les paramètres sont les suivants :

- aProfileInfo est le profil distant (par exemple, TetheringManager1.RemoteProfiles.Items[0]) ;

- aDescription est le nom de la ressource que le profil distant va recevoir ;

- aString est la chaîne, associée à aDescription, que le profil distant va recevoir.

III-B-2 - Du côté WebProvider

Nous nous attendons à ce que cette application reçoive la requête envoyée par le client.

Si elle arrive, cette requête parviendra par le biais de l'événement du WebProvider décrit en III.A.2.

Sur cet événement, il faudra :

- traiter la requête ;

- envoyer la réponse.

Le code suivant s'en chargera :

procedure TForm2.TetheringAppProfile1ResourceReceived(const Sender: TObject;
const AResource: TRemoteResource);
var
lURL: string;
SS: TStringStream;
begin
// si la ressource reçue est nommée "URL"
if AResource.Hint = 'URL' then
begin
lURL := AResource.Value.AsString;
SS := TStringStream.Create;
try
{ j'envoie le contenu de la ressource reçue (AResource.Value.AsString) comme paramètre au composant TidHHTP afin qu'il me retourne sa réponse (SS) }
idHTTP1.Get(AResource.Value.AsString, SS);
SS.Position := 0;
{ quand la réponse (SS) est disponible, je renvoie cette réponse à l'application client et je la nomme "Response" }
if not TetheringAppProfile1.SendStream(TetheringManager1.RemoteProfiles.Items[0]
, 'Response'
, SS) then
raise Exception.Create('cannot send');
lbRequests.Items.Append(lURL);
finally
SS.Free;
end;
end;
end;

III-B-3 - De nouveau du côté client

Nous nous attendons à ce que cette application, à son tour, reçoive la réponse renvoyée par le WebProvider.

Si elle arrive, cette réponse parviendra par le biais de l'événement décrit en II.A.1.

Sur cet événement, il faudra traiter la réponse. C'est le code suivant qui s'en chargera :

procedure TfrmClient.TetheringAppProfile1ResourceReceived(const Sender: TObject;
const AResource: TRemoteResource);
var
SS: TStringStream;
s: string;
begin
// si la ressource reçue est nommée "Response"
if AResource.Hint = 'Response' then
begin
SS := TStringStream.Create;
try
// je charge le contenu de cette ressource dans SS
SS.LoadFromStream(AResource.Value.AsStream);
// j'affiche SS dans un THtmlViewer
Memo1.Lines.LoadFromStream(SS);
finally
SS.Free;
end;
end;
end;

IV - Les applications exemples

Afin de tester les exemples proposés, vous devrez tout d'abord installer les composants HtmlViewer 11.7 disponibles sur GitHub.

Le WebProvider est fourni sous VCL et FMX. Vous choisirez la version que vous préférez pour l'exécuter. Après avoir lancé le WebProvider, lancez alors le client pour envoyer vos requêtes :

- connectez-vous avec le bouton adéquat ;

- choisissez une URL depuis la TComboBox ;

- cliquez sur Go.

V - Conclusion

Cet exemple ne montre que très partiellement la puissance de cette technologie, mais elle simplifie indéniablement le développement d'applications impliquant la communication inter-applications.

De nombreux exemples d'AppTethering sont disponibles :

- dans les démonstrations livrées avec RADStudio ;

- auprès de nombreux contributeurs tels que Malcolm Groves et Stephen Ball.

Ce tutoriel est proposé par la société Barnsten.

La relecture technique et la mise en forme ont été effectuées par gvasseur58. La relecture orthographique a été effectuée par XXXXX.