FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour WWKS2 TCP/IP consulta
Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
WWKS2 TCP/IP consulta
Posted: Sun Nov 09, 2025 12:19 AM

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

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.

Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: WWKS2 TCP/IP consulta
Posted: Mon Dec 29, 2025 02:50 PM

Estimados Colegas,

      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

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: WWKS2 TCP/IP consulta
Posted: Mon Dec 29, 2025 04:09 PM

mira se ayuda:

https://forums.fivetechsupport.com/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
Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: WWKS2 TCP/IP consulta
Posted: Wed Feb 18, 2026 02:30 PM

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.

#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...

Continue the discussion