Ayuda con comunicacion TCP IP

Ayuda con comunicacion TCP IP

Postby Jorge Jaurena » Mon Dec 19, 2011 3:06 pm

Hola.
Estoy tratando de comunicarme a traves de tcpip con un hardware que le envio un comando y recibo una respuesta. Mi problema es que la respuesta viene en binario de 8 bits, pero siempre el primer byte es nul entonces me indican quienes fabrican el hard que debo pasar esto a hexa para poder ver algo ya que el primer nul cancelaria la recepcion.
Estoy usando esta funcion que encontre aca pero no me coincide la respuesta con lo que deberia.

function BinToHex( cBin )
local n, nResult := 0

for n = Len( cBin ) to 1 step -1
if SubStr( cBin, n, 1 ) == "1"
nResult += 2 ^ ( Len( cBin ) - n )
endif
next
return DecToHex( nResult )

Pruebo con un programa llamado Docklight Scripting y el hard responde correctamente, pero mi aplicacion no.
La gente que provee este hard usa VBasic y no saben muy bien que decirme ya que ese lenguaje convierte en forma automatica una recepcion de binario a decimal, pero Yo en realidad no se bien que recibo.
Antes de poner esta consulta probe de todo.
Muchas Gracias.
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Ayuda con comunicacion TCP IP resuelto

Postby Jorge Jaurena » Mon Dec 19, 2011 6:55 pm

Perdon por la molestia, ya logre que funcione. Gracias.
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Ayuda con comunicacion TCP IP

Postby Patricio Avalos Aguirre » Mon Dec 19, 2011 7:19 pm

Jorge:

Podrias colocar la solucion,
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1059
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Re: Ayuda con comunicacion TCP IP

Postby EASYSOFT » Mon Dec 19, 2011 8:49 pm

Jorge buenas tardes
El dia de ayer inicie un desarrollo en el cual necesito realizar algo parecido, es posible me ayudes indicandome como envio los comandos via tcpip y como tranformar la respuesta a hex.

de ante mano gracias

Saludos
Oscar
Saludos
Oscar
Fwh 10.4, bcc55
EASYSOFT
 
Posts: 172
Joined: Sat Oct 22, 2005 1:17 pm
Location: Quito - Ecuador

Re: Ayuda con comunicacion TCP IP

Postby Jorge Jaurena » Tue Dec 20, 2011 12:21 pm

Este es un caso muy particular ya que el primer byte de la respuesta siempre es nul, esto hace que el evento de lectura asuma que ahi termina la transmision y no recibe mas, por lo tanto nunca recibia nada.
Esto lleva a tener que pasar los byte recibidos a hexa o a decimal, la funcion que probe es la siguiente:

// Esto lo compile y funciono bien asumiendo una cadena de byte de 8 bits separados por un espacio, lo que no significa que siempre venga
// asi, eso depende de lo que tu servidor envie, esa informacion deberia dartela quien desarrollo el server.
// Todo lo paso directo a caracter que en definitiva era lo que necesitaba.

#include "FiveWin.ch"

Function Main()
Local Var

Var:="00100110 00100000 00101110 00101111"

MsgInfo(BinToChr(Var),"Resultado")
Return nil

Function BinToChr(cBin)
Local n,q,nResult,Retorno,NumBin

Retorno:=""
NumBin :=""

For q=1 To Len(cBin)
IF SUBSTR(cBin,q,1)==" "
NumBin:=""
ELSE
NumBin:=NumBin+SUBSTR(cBin,q,1)
ENDIF
IF LEN(NumBin)=8
nResult:=0
For n=8 to 1 Step -1
IF SubStr(NumBin,n,1)=="1"
nResult += 2 ^ ( 8-n )
endif
Next
Retorno:=Retorno+CHR(INT(nResult))
ENDIF
Next
Return Retorno
//

En mi problema en particular esto no funciono, a pesar de que el modelo de arriba funciona perfecto.
Aclaro que los proveedores del hard no son los autores del protocolo de comunicacion, entonces tampoco podian informarme bien, asi que tenia que arreglarmelas un poco solo.
Entre tantas pruebas, por casualidad el exe produce un error y graba el ya conocido error.log, cuando lo abro a ver que habia hecho mal me encuentro con la grata sorpresa que en el primer argumento (la variable que supuestamente contenia la lectura recibida y yo no podia ver) estaba la cadena de caracteres tal cual como yo queria obtenerla.
Por lo tanto deje de probar otras cosas y mire como hace FWH para generar el error.log e hice exactamente lo mismo y obtuve un archivo plano con una linea que contenia lo que queria obtener.
Aqui muestro la solucion.

// Esto es para establecer la comunicacion, enviar el comando y recibir la respuesta, en este caso en particular el server se cierra solo
// despues de enviar la respuesta.

Function EnvioComando()
Local oSocket

oSocket:= TSocket():New( 997 ) && Aca creo el socket, el puerto (997) deberia decirtelo el que desarrollo el server.
oSocket:bRead:= { | oSocket | VerResSer(oSocket:GetData()) } && Este es el evento de lectura, aca recibe la respuesta
oSocket:Connect( "192.168.0.150" ) && Esta es la ip donde esta el server.
oSocket:SendData("q") && Aca envio un comando, los comandos deberian ser indicados por quien desarrollo el server.
// oSocket:End() && Solo si el server no se cierra solo y quiero cerrar el puerto. En mi caso esto no va.
Return nil

// En la siguiente funcion entra la respuesta como parametro y simplemente se graba en el archivo de texto, de ahi en mas uno hace lo que
// quiere, pero ya esta en formato legible. Yo lo paso a una dbf porque me sirve para lo que quiero hacer pero podes leerlo directo del txt.

Function VerResSer(Dato)
MemoWrit( "Resp.txt", cValToChar(Dato) ) && Asi graba el error.log

USE BASE NEW
APPEND FROM Resp.txt SDF
CLOSE
Return nil

Aclaro que todo esto comenzo probando con los ejemplos de la clase TSocket que trae FWH, pueden encontrar un ejemplo de server y otro de cliente, es muy facil de usar, el problema surge cuando tenes que interactuar con un server que no conoces y no tenes mucha ayuda como me paso a mi, por eso tuve que hacer lo del archivo de texto, no es muy elegante pero anda.

Esta es la solucion que yo encontre para mi caso particular, no significa que sea universal, disculpen que me extendi pero trate de ser lo mas claro posible. Espero sirva

Saludos.
Jorge G. Jaurena
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Ayuda con comunicacion TCP IP

Postby EASYSOFT » Wed Dec 21, 2011 2:19 pm

Jorge gracias
voy a probar para mi caso.
Saludos
Oscar
Fwh 10.4, bcc55
EASYSOFT
 
Posts: 172
Joined: Sat Oct 22, 2005 1:17 pm
Location: Quito - Ecuador


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 30 guests