Conectando Free Pascal con un Robot ABB
Un servicio web (en inglés, web service o web services) es una tecnología que utiliza un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar datos (fuente Wikipedia).
Los robots ABB de la generación Omnicore, disponen de un servicio web llamado Robot Web Services, el cual usa un servicio REST. Vamos a ver como hacer uso de este servicio con Free Pascal y Lazarus.
Para acceder a este servicio necesitas tener un robot ABB conectado en red. O bien podemos acceder a un controlador virtual, si usamos el programa RobotStudio de ABB.
Consideraciones iniciales
Para conectarse al robot, debemos usar una conexión Http segura. Además debemos enviar el usuario y clave como una autorización básica. Además el tipo de contenido, tanto el que enviamos como el que aceptamos debe ser del tipo: application/xhtml+xml;v=2.0
Teniendo todo lo anterior en cuenta, vamos a programar una pequeña aplicación que solicite la información al robot y nos la muestre por pantalla.
Programando
Crea un nuevo proyecto en Lazarus, que se a de tipo programa
Para enviar una petición http necesitamos usar la unidad fphttpclient. Y para que sea segura añadiremos opensslsockets. Además la autentificación es tipo básico. Lo que significa que el usuario y la clave van codificados en Base64. Y para terminar necesitamos la unida sysutils, para gestionar las excepciones y preparar una cadena con el usuario y la clave. Así que la clausula Uses del programa será algo así:
1 2 3 4 5 6 7 8 9 |
uses {$IFDEF UNIX} cthreads, {$ENDIF} Classes { you can add units after this }, SysUtils, opensslsockets, fphttpclient, base64; |
Creamos una objeto Http, y un objeto TStringList. EL primero será el que usemos para lanzar la petición, y el segundo para contendrá la respuesta que nos devuelva el robot.
1 2 |
PeticionHttp := TFPHTTPClient.Create(nil); Respuesta := TStringList.Create; |
Ahora preparamos el usuario y la clave para enviar junto a la petición
1 2 3 4 |
usuario := 'Default User'; password := 'robotics'; clave := Format('%s:%s', [usuario, password]); clave := EncodeStringBase64(clave); |
Como el sistema de autentificación en del tipo básico, el formato es una cadena dónde se envía el usuario y la clave separados por dos puntos, y toda ella codificada en Base64.
Tanto, la autentificación, como la información sobre el tipo del contenido que enviamos como el que aceptamos se debe enviar en las cabeceras de la petición. Las cuales preparamos y luego realizamos la petición. Pasándole la dirección Ip, al objeto PeticionHttp, además de un objeto TStringList para contendrá la respuesta del robot.
1 2 3 4 5 |
AddHeader('Authorization', 'Basic ' + clave); AddHeader('Content-Type', 'application/xhtml+xml;v=2.0'); AddHeader('Accept', 'application/xhtml+xml;v=2.0'); //Dirección IP del robot. Localhost, puerto 80 si el controlador es virtual get('https://localhost:80/', Respuesta); |
Ahora solo queda procesar la respuesta. EL objeto PeticionHttp contiene el resultado de la petición. Nos devuelve un código http, además de unas cabeceras con información. Y el objeto Respuesta, nos devuelve el documento XML, con la respuesta del robot.
1 2 3 4 5 6 7 8 9 |
WriteLn('Status:'); Writeln(ResponseStatusText); WriteLn(ResponseStatusText + ' ' + IntToStr(ResponseStatusCode)); WriteLn(''); WriteLn('ResponseHeaders:'); Writeln(ResponseHeaders.Text); Writeln(''); WriteLn('Respuesta:'); Writeln(Respuesta.Text); |
La respuesta, si todo ha ido bien, la respuesta es un archivo XML, y su contenido puede ser algo así.
Os dejo el código completo del ejemplo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
program project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX} cthreads, {$ENDIF} Classes { you can add units after this }, SysUtils, opensslsockets, fphttpclient, base64; var PeticionHttp: TFPHTTPClient; Respuesta: TStringList; clave, password, usuario: string; begin PeticionHttp := TFPHTTPClient.Create(nil); Respuesta := TStringList.Create; try try usuario := 'Default User'; password := 'robotics'; clave := Format('%s:%s', [usuario, password]); clave := EncodeStringBase64(clave); with PeticionHttp do begin AddHeader('Authorization', 'Basic ' + clave); AddHeader('Content-Type', 'application/xhtml+xml;v=2.0'); AddHeader('Accept', 'application/xhtml+xml;v=2.0'); //Dirección IP del robot. Localhost, puerto 80 si el controlador es virtual get('https://localhost:80/', Respuesta); WriteLn('Status:'); Writeln(ResponseStatusText); WriteLn(ResponseStatusText + ' ' + IntToStr(ResponseStatusCode)); WriteLn(''); WriteLn('ResponseHeaders:'); Writeln(ResponseHeaders.Text); Writeln(''); WriteLn('Respuesta:'); Writeln(Respuesta.Text); end; except on E: Exception do begin writeln('Error: ' + E.Message); end; end; finally PeticionHttp.Free; Respuesta.Free; WriteLn('Pulsa una tecla para continuar'); ReadLn() end; end. |
Saludos