WWKS2 TCP/IP consulta

Post Reply
mterraz
Posts: 75
Joined: Mon Jun 10, 2013 1:21 pm

WWKS2 TCP/IP consulta

Post by mterraz »

Buenas tardes a todos,
Les hago una consulta con respecto al objeto correcto a utilizar para una conexion basica TCP/IP?. En este caso tengo realizo la consulta correctamente pero no puedo obtener el resultado en ? oHttp:ResponseText, el status parece quedarse en 1, y en la consola de emulador ya se puede ver que envio la rta.
Estoy trabajando con el protocolo WWKS2 y un emulador oficial, en la consola veo tanto el request como la respuesta correctas pero no logro leer la respuesta desde mi programa en una variable para poder analizarla.
Alguien a trabajado con este protocolo?, me interesa hacerlo funcionar ya que es el utilizado por la mayoria de los robots de ventas.

WWKS 2 is a communication protocol to control automated storage and retrieval systems
via the TCP/IP protocol. The exchanged messages are UTF-8 coded XML

error recicido Error description: (DOS Error -2147352567) WINOLE/1007 El dato necesario para completar esta operación no está disponible todavía.
(0x8000000A): WinHttp.WinHttpRequest

//................
FUNCTION WWKS2()
//................

local cCad:= '',cRespuesta:=''
local cUrl:='',nTest,n:=1

Code: Select all | Expand

oHttp:=createobject( "winhttp.winhttprequest.5.1")	

cCad:='<?xml version="1.0" encoding="UTF-8"?>' + CRLF
cCad:='<WWKS Version="2.0" TimeStamp="2025-11-08T' + time() + 'Z">'+CRLF
cCad+='<HelloRequest Id="1">'+CRLF
cCad+='	<Subscriber Id="1" Type="IMS" Manufacturer="WINBOT" ProductInfo="WINBOT" VersionInfo="1.0" TenantId="1">'+CRLF
cCad+='		<Capability Name="KeepAlive"/>'+CRLF
cCad+='		<Capability Name="Status"/>'+CRLF
cCad+='		<Capability Name="Input"/>'+CRLF
cCad+='		<Capability Name="InitiateInput"/>'+CRLF
cCad+='		<Capability Name="ArticleMaster"/>'+CRLF
cCad+='		<Capability Name="StockDelivery"/>'+CRLF
cCad+='		<Capability Name="StockInfo"/>'+CRLF
cCad+='		<Capability Name="Output"/>'+CRLF
cCad+='		<Capability Name="TaskCancelOutput"/>'+CRLF
cCad+='		<Capability Name="Configuration"/>'+CRLF
cCad+='		<Capability Name="StockLocationInfo"/>'+CRLF
cCad+='	</Subscriber>'+CRLF
cCad+='</HelloRequest>'+CRLF
cCad+='</WWKS>'+CRLF

cUrl:='http://192.168.56.1:6050'

TRY
	oHttp:Open( 'POST' , cUrl , .T. )
	CATCH
	 oSay:SetText("ROBOT NO DISPONBLE")
	 syswait(1)
     RETU .F.		 
END
TRY
	oHttp:Send(cCad)
CATCH
	oSay:SetText("ROBOT NO DISPONBLE")
	syswait(1)
	RETU .F.
END

syswait(4)
? oHttp:ResponseBody()

RETU .T.

///////////////////////////////////////////////////
EN LA CONSOLA MUESTRA ESTA RESPUESTA : SENT:

<WWKS Version="2.0" TimeStamp="2025-11-09T00:05:12Z">
<HelloResponse Id="1">
<Subscriber Id="1" Type="Robot" Manufacturer="Becton Dickinson Rowa Germany GmbH" ProductInfo="Storage System library" VersionInfo="StorageSystem.MosaicDependency [24.1.0_e7838e4d]">
<Capability Name="KeepAlive" />
<Capability Name="Status" />
<Capability Name="Input" />
<Capability Name="ArticleMaster" />
<Capability Name="StockDelivery" />
<Capability Name="StockInfo" />
<Capability Name="Output" />
<Capability Name="TaskInfo" />
<Capability Name="TaskCancel" />
<Capability Name="Configuration" />
<Capability Name="StockLocationInfo" />
<Capability Name="ArticleInfo" />
<Capability Name="ArticlePrice" />
<Capability Name="ShoppingCart" />
<Capability Name="Infeed" />
<Capability Name="OutputDestination" />
</Subscriber>
</HelloResponse>
</WWKS>

Muchas gracias y Saludos Mariano.

mterraz
Posts: 75
Joined: Mon Jun 10, 2013 1:21 pm

Re: WWKS2 TCP/IP consulta

Post by mterraz »

Estimados Colegas,

Code: Select all | Expand

      Despues de varios dias de investigacion el tema es que está usando Microsoft.XMLHTTP y ese objeto es para consumir web services HTTP (tipo REST, SOAP, etc). El servidor WWKS armado no es un servidor web, es un servidor TCP que escucha en el puerto 6050 con sockets puros. Por eso cuando hace el post no llega nada. Para conectar necesita usar sockets TCP directos, lo que vi que puede usar algo tipo tsocket de fivewin o la API de winsock de Windows. osea tiene que abrir el socket conectar al puerto 6050 y mandar el XML crudo por el socket y leer la respuesta por el mismo socket. Pero con XMLHTTP no va a andar porque eso es hTTP y acá estamos usando tCP puro.

Saludos Mariano

User avatar
karinha
Posts: 8720
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Contact:

Re: WWKS2 TCP/IP consulta

Post by karinha »

mira se ayuda:

viewtopic.php?p=105174#p105174

¿Podrías explicarme qué es WWKS2?

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
mterraz
Posts: 75
Joined: Mon Jun 10, 2013 1:21 pm

Re: WWKS2 TCP/IP consulta

Post by mterraz »

Buenas tardes Colegas,
Aqui debajo les dejo una funcion que utilizando sockets y la DLL de ROWA que se conecta al robot y envia un mensaje de bienvenida. Espero sea de utilidad me llevo bastante tiempo entender como funciona.

Code: Select all | Expand

#include "fivewin.ch"
#include "hbclass.ch"
#include "hbssl.ch"
#include "hbsocket.ch"
#include "hbxml.ch"

STATIC oSock
STATIC cServer   := "127.0.0.1"
STATIC nPort     := 6050
STATIC nSourceId := 100      // PIS según especificación
STATIC nDestId   := 999      // Ejemplo: Robot ASRS

// ------------------------------------------------------------
FUNCTION Main()

   LOCAL oWnd,oBtn1,nAncho,nAlto

DEFINE WINDOW oWnd  FROM 2,2 TO 15.7,32 TITLE "WEBSERVICE CFRN";
 NOZOOM NOSYSMENU

@ 5,120 BUTTON oBtn1 PROMPT 'CONECTAR' SIZE 100,25 OF oWnd ACTION ConnectWWKS() PIXEL
@ 40,120 BUTTON oBtn1 PROMPT 'HELLO REQUEST' SIZE 100,25 OF oWnd ACTION SendHelloRequest() PIXEL
@ 75,120 BUTTON oBtn1 PROMPT 'SALIR' SIZE 100,25 OF oWnd ACTION ( CloseConnection(),oWnd:End() ) PIXEL

oWnd:bresized:={||  WndSetSize( oWnd:hWnd, nAncho,nAlto, .t. )}

ACTIVATE WINDOW oWnd ON INIT ( nAncho:=oWnd:nWidth, nAlto:=oWnd:nHeight)
   
RETURN NIL

// ------------------------------------------------------------
// FUNCION DE CONEXION
// ------------------------------------------------------------
FUNCTION ConnectWWKS()

   LOCAL nResult

   IF oSock != NIL
      MsgInfo("Ya existe una conexión activa")
      RETURN NIL
   ENDIF

   oSock := hb_socketOpen()
   IF oSock == NIL
      MsgStop("No se pudo crear el socket")
      RETURN NIL
   ENDIF

   nResult := hb_socketConnect( oSock, { HB_SOCKET_AF_INET, cServer, nPort } )

   IF !nResult 
      MsgStop("Error conectando al ROBOT")
      hb_socketClose(oSock)
      oSock := NIL
      RETURN NIL
   ENDIF

   MsgWait("Conectado correctamente al " + cServer + ":" + LTrim(Str(nPort)),'CONECTADO CON ROBOT',3)

RETURN NIL

//.........................
FUNCTION SendHelloRequest()

   LOCAL cXML, cResp
   LOCAL hParsed,cId
   LOCAL cTimeStamp
   LOCAL nId := hb_RandomInt(1000,9999)
   
IF oSock == NIL MsgStop("No hay conexión activa") RETURN NIL ENDIF cTimeStamp := hb_TToC( hb_DateTime(), "YYYY-MM-DD" ) + ; "T" + Time() + "Z" // Construcción XML según sección 6.2.1 HelloRequest cXML := ; '<WWKS Version="2.0" TimeStamp="' + cTimeStamp + '">' + CRLF + ; ' <HelloRequest Id="' + LTrim(Str(nId)) + '">' + CRLF + ; ' <Subscriber Id="' + LTrim(Str(nSourceId)) + '" ' + ; 'Type="IMS" ' + ; 'Manufacturer="MiEmpresa" ' + ; 'ProductInfo="FiveWinClient" ' + ; 'VersionInfo="1.0">' + CRLF + ; ' <Capability Name="KeepAlive"/>' + CRLF + ; ' <Capability Name="Status"/>' + CRLF + ; ' <Capability Name="StockInfo"/>' + CRLF + ; ' </Subscriber>' + CRLF + ; ' </HelloRequest>' + CRLF + ; '</WWKS>' + CRLF
hb_socketSend( oSock, hb_StrToUTF8( cXML ) ) // Esperar respuesta cResp := WWKS_Receive( oSock ) IF Empty(cResp) MsgStop("No se recibió HelloResponse") RETURN NIL ENDIF hParsed := WWKS_ParseHelloResponse( cResp )
IF hParsed != NIL MostrarHelloInfo( hParsed ) ELSE MsgStop("Error procesando HelloResponse") ENDIF
RETURN NIL //........................ FUNCTION CloseConnection() IF oSock != NIL hb_socketClose(oSock) oSock := NIL MsgInfo("Conexión cerrada") ENDIF RETURN NIL //............................ FUNCTION WWKS_Receive( oSock ) LOCAL cBuffer := Space(8192) LOCAL nLen nLen := hb_socketRecv( oSock, @cBuffer ) IF nLen > 0 RETURN hb_UTF8ToStr( Left( cBuffer, nLen ) ) ENDIF RETURN NIL //...................................... FUNCTION WWKS_ParseHelloResponse( cXML ) LOCAL oXML LOCAL hResult := {=>} LOCAL oHello, oSubscriber LOCAL oCaps, i IF Empty(cXML) RETURN NIL ENDIF oXML := CreateObject("MSXML2.DOMDocument.6.0") oXML:async := .F. IF ! oXML:loadXML( cXML ) ? "Error parseando XML" RETURN NIL ENDIF oHello := oXML:selectSingleNode("//HelloResponse") IF oHello == NIL ? "No es HelloResponse" RETURN NIL ENDIF hResult["Id"] := oHello:getAttribute("Id") oSubscriber := oHello:selectSingleNode("Subscriber") IF oSubscriber != NIL hResult["SubscriberId"] := oSubscriber:getAttribute("Id") hResult["Type"] := oSubscriber:getAttribute("Type") hResult["Manufacturer"] := oSubscriber:getAttribute("Manufacturer") hResult["ProductInfo"] := oSubscriber:getAttribute("ProductInfo") hResult["VersionInfo"] := oSubscriber:getAttribute("VersionInfo") hResult["TenantId"] := oSubscriber:getAttribute("TenantId") // Capabilities oCaps := oSubscriber:selectNodes("Capability") hResult["Capabilities"] := {} FOR i := 0 TO oCaps:length-1 AAdd( hResult["Capabilities"], ; oCaps:item(i):getAttribute("Name") ) NEXT ENDIF RETURN hResult //................................ FUNCTION MostrarHelloInfo( hData ) LOCAL cMsg := "" LOCAL i cMsg += "ID respuesta: " + hData["Id"] + CRLF cMsg += "Subscriber ID: " + hData["SubscriberId"] + CRLF cMsg += "Tipo: " + hData["Type"] + CRLF cMsg += "Fabricante: " + hData["Manufacturer"] + CRLF cMsg += "Producto: " + hData["ProductInfo"] + CRLF cMsg += "Versión: " + hData["VersionInfo"] + CRLF + CRLF cMsg += "Capacidades soportadas:" + CRLF FOR i := 1 TO Len( hData["Capabilities"] ) cMsg += " - " + hData["Capabilities"][i] + CRLF NEXT MsgInfo( cMsg ) RETURN NIL

Saludos Mariano y gracias por la ayuda siempre...

Post Reply