Code: Select all
/* ------------------------------
Programa de prueba
------------------------------ */
#include "hmg.ch"
#include "hbdyn.ch"
#define CRLF INetCRLF()
PROCEDURE Main()
PUBLIC pDLL
PUBLIC pVLCNew, pMediaNewLoc, pMediaNewPath, pPlayerNew, pSetHWND, pPlay
// Resolver funciones necesarias
pVLCNew := hb_DynCall( { "libvlc_new", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_INT, HB_DYN_CTYPE_PTR } )
pMediaNewLoc := hb_DynCall( { "libvlc_media_new_location", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pMediaNewPath := hb_DynCall( { "libvlc_media_new_path", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pPlayerNew := hb_DynCall( { "libvlc_media_player_new_from_media", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR } )
pSetHWND := hb_DynCall( { "libvlc_media_player_set_hwnd", pDLL }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_LONG } )
pPlay := hb_DynCall( { "libvlc_media_player_play", pDLL }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
PlayStream( "192.168.100.16:554" )
RETURN
//-----------------------------------------------------------
// Abrir cuadro de diálogo para seleccionar archivo local
//-----------------------------------------------------------
FUNCTION BrowseFile()
LOCAL cFile := GetFile( { {"Videos", "*.mp4;*.avi;*.mkv;*.mov;*.flv"}, ;
{"Todos los archivos", "*.*"} }, ;
"Seleccionar archivo de video", "C:\videos\" )
IF !Empty( cFile )
// Main.txtSource.Value := cFile
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Inicializa VLC y reproduce un stream o archivo
//-----------------------------------------------------------
FUNCTION PlayStream( cSource )
IF Empty( AllTrim( cSource ) )
MsgStop( "Debe ingresar una URL o archivo" )
RETURN NIL
ENDIF
IF Empty( pDLL )
pDLL := hb_LibLoad( "libvlc.dll" )
IF Empty( pDLL )
? "No se pudo cargar libvlc.dll"
RETURN NIL
ENDIF
ENDIF
IF Empty( hVLC )
hVLC := pVLCNew( 0, 0 )
ENDIF
IF File( cSource ) .OR. ( ":" $ cSource )
hMedia := pMediaNewPath( hVLC, cSource )
ELSE
hMedia := pMediaNewLoc( hVLC, cSource )
ENDIF
hPlayer := pPlayerNew( hMedia )
pSetHWND( hPlayer, GetControlHandle( "frm1", "Main" ) )
pPlay( hPlayer )
RETURN NIL
//-----------------------------------------------------------
// Pause / Resume
//-----------------------------------------------------------
FUNCTION PauseStream()
LOCAL pPause := hb_DynCall( { "libvlc_media_player_pause", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pPause( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Stop
//-----------------------------------------------------------
FUNCTION StopStream()
LOCAL pStop := hb_DynCall( { "libvlc_media_player_stop", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pStop( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Volumen + / -
//-----------------------------------------------------------
FUNCTION VolumeUp()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Min( 200, nVol + 10 ) ) // máximo 200%
ENDIF
RETURN NIL
FUNCTION VolumeDown()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Max( 0, nVol - 10 ) )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Fullscreen On/Off
//-----------------------------------------------------------
FUNCTION ToggleFullScreen()
LOCAL pToggle := hb_DynCall( { "libvlc_toggle_fullscreen", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pToggle( hPlayer )
ENDIF
RETURN NIL
]]>hbmk2: Harbour: Compilando m¢dulos...
Harbour 3.2.0dev (r1703241902)
Copyright (c) 1999-2016, http://harbour-project.org/
hbmk2: Compilando...
hbmk2: Enlazando... hmgvlc.exe
.hbmk/win/mingw/Main.o:Main.c:(.data+0x178): undefined reference to `HB_FUN_PVLCNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x198): undefined reference to `HB_FUN_PMEDIANEWPATH'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1b8): undefined reference to `HB_FUN_PMEDIANEWLOC'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1c8): undefined reference to `HB_FUN_PPLAYERNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1e8): undefined reference to `HB_FUN_PSETHWND'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x208): undefined reference to `HB_FUN_PPLAY'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x228): undefined reference to `HB_FUN_PPAUSE'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x248): undefined reference to `HB_FUN_PSTOP'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x268): undefined reference to `HB_FUN_PGETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x278): undefined reference to `HB_FUN_PSETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x2c8): undefined reference to `HB_FUN_PTOGGLE'
collect2.exe: error: ld returned 1 exit status
hbmk2[hmgvlc]: Error: Ejecutando enlazador. 1
gcc.exe .hbmk/win/mingw/Main.o .hbmk/win/mingw/_hbmkaut_Main.o C:/Temp/HmgVlc/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -ohmgvlc.exe -LC:/hmg.3.4.4/harbour/lib/win/mingw -LC:/hmg.3.4.4/lib
hbmk2: Error: Funci¢n(es) referenciada, no encontrada, pero desconocida:
PVLCNEW(), PMEDIANEWPATH(), PMEDIANEWLOC(), PPLAYERNEW(), PSETHWND(),
PPLAY(), PPAUSE(), PSTOP(), PGETVOL(), PSETVOL(), PTOGGLE()
Code: Select all
/* ------------------------------
Programa de prueba
------------------------------ */
#include "hmg.ch"
#include "hbdyn.ch"
#define CRLF INetCRLF()
PROCEDURE Main()
PUBLIC pDLL
PUBLIC pVLCNew, pMediaNewLoc, pMediaNewPath, pPlayerNew, pSetHWND, pPlay
// Resolver funciones necesarias
pVLCNew := hb_DynCall( { "libvlc_new", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_INT, HB_DYN_CTYPE_PTR } )
pMediaNewLoc := hb_DynCall( { "libvlc_media_new_location", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pMediaNewPath := hb_DynCall( { "libvlc_media_new_path", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pPlayerNew := hb_DynCall( { "libvlc_media_player_new_from_media", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR } )
pSetHWND := hb_DynCall( { "libvlc_media_player_set_hwnd", pDLL }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_LONG } )
pPlay := hb_DynCall( { "libvlc_media_player_play", pDLL }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
PlayStream( "192.168.100.16:554" )
RETURN
//-----------------------------------------------------------
// Abrir cuadro de diálogo para seleccionar archivo local
//-----------------------------------------------------------
FUNCTION BrowseFile()
LOCAL cFile := GetFile( { {"Videos", "*.mp4;*.avi;*.mkv;*.mov;*.flv"}, ;
{"Todos los archivos", "*.*"} }, ;
"Seleccionar archivo de video", "C:\videos\" )
IF !Empty( cFile )
// Main.txtSource.Value := cFile
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Inicializa VLC y reproduce un stream o archivo
//-----------------------------------------------------------
FUNCTION PlayStream( cSource )
IF Empty( AllTrim( cSource ) )
MsgStop( "Debe ingresar una URL o archivo" )
RETURN NIL
ENDIF
IF Empty( pDLL )
pDLL := hb_LibLoad( "libvlc.dll" )
IF Empty( pDLL )
? "No se pudo cargar libvlc.dll"
RETURN NIL
ENDIF
ENDIF
IF Empty( hVLC )
hVLC := pVLCNew( 0, 0 )
ENDIF
IF File( cSource ) .OR. ( ":" $ cSource )
hMedia := pMediaNewPath( hVLC, cSource )
ELSE
hMedia := pMediaNewLoc( hVLC, cSource )
ENDIF
hPlayer := pPlayerNew( hMedia )
pSetHWND( hPlayer, GetControlHandle( "frm1", "Main" ) )
pPlay( hPlayer )
RETURN NIL
//-----------------------------------------------------------
// Pause / Resume
//-----------------------------------------------------------
FUNCTION PauseStream()
LOCAL pPause := hb_DynCall( { "libvlc_media_player_pause", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pPause( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Stop
//-----------------------------------------------------------
FUNCTION StopStream()
LOCAL pStop := hb_DynCall( { "libvlc_media_player_stop", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pStop( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Volumen + / -
//-----------------------------------------------------------
FUNCTION VolumeUp()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Min( 200, nVol + 10 ) ) // máximo 200%
ENDIF
RETURN NIL
FUNCTION VolumeDown()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Max( 0, nVol - 10 ) )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Fullscreen On/Off
//-----------------------------------------------------------
FUNCTION ToggleFullScreen()
LOCAL pToggle := hb_DynCall( { "libvlc_toggle_fullscreen", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pToggle( hPlayer )
ENDIF
RETURN NIL
]]>hbmk2: Harbour: Compilando m¢dulos...
Harbour 3.2.0dev (r1703241902)
Copyright (c) 1999-2016, http://harbour-project.org/
hbmk2: Compilando...
hbmk2: Enlazando... hmgvlc.exe
.hbmk/win/mingw/Main.o:Main.c:(.data+0x178): undefined reference to `HB_FUN_PVLCNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x198): undefined reference to `HB_FUN_PMEDIANEWPATH'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1b8): undefined reference to `HB_FUN_PMEDIANEWLOC'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1c8): undefined reference to `HB_FUN_PPLAYERNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1e8): undefined reference to `HB_FUN_PSETHWND'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x208): undefined reference to `HB_FUN_PPLAY'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x228): undefined reference to `HB_FUN_PPAUSE'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x248): undefined reference to `HB_FUN_PSTOP'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x268): undefined reference to `HB_FUN_PGETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x278): undefined reference to `HB_FUN_PSETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x2c8): undefined reference to `HB_FUN_PTOGGLE'
collect2.exe: error: ld returned 1 exit status
hbmk2[hmgvlc]: Error: Ejecutando enlazador. 1
gcc.exe .hbmk/win/mingw/Main.o .hbmk/win/mingw/_hbmkaut_Main.o C:/Temp/HmgVlc/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -ohmgvlc.exe -LC:/hmg.3.4.4/harbour/lib/win/mingw -LC:/hmg.3.4.4/lib
hbmk2: Error: Funci¢n(es) referenciada, no encontrada, pero desconocida:
PVLCNEW(), PMEDIANEWPATH(), PMEDIANEWLOC(), PPLAYERNEW(), PSETHWND(),
PPLAY(), PPAUSE(), PSTOP(), PGETVOL(), PSETVOL(), PTOGGLE()
Code: Select all
#include "hmg.ch"
FUNCTION MAIN()
/*****************/
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 930 HEIGHT 400 ;
TITLE ' T e s t';
FONT "Arial" SIZE 09
ON KEY ESCAPE ACTION Form_1.Release
@ 10,840 LABEL LABEL_LEN_TB_1 ;
VALUE " " ;
WIDTH 100 ;
HEIGHT 35 ;
BOLD
DEFINE EDITBOX TB_1
ROW 10
COL 10
WIDTH 820
HEIGHT 250
VALUE '1234567890123456789012345678901234567890123456789012345678901234567890'
TOOLTIP ''
MAXLENGTH 2000
ON CHANGE TEST_LEN()
END EDITBOX
END WINDOW
Form_1.TB_1.SetFocus
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN
FUNCTION TEST_LEN()
/******************/
LOCAL cResult := "", n, nPOS
Form_1.LABEL_LEN_TB_1.Value := LEN(Form_1.TB_1.Value)
FOR n := 80 TO 800 STEP 80
IF LEN(Form_1.TB_1.Value) == 80
FOR nPos := 1 TO Len( Form_1.TB_1.Value ) STEP 80
cResult += SubStr( Form_1.TB_1.Value, nPos, 80 ) + CRLF
NEXT
Form_1.TB_1.Value := cResult
EXIT
ENDIF
NEXT
Code: Select all
#include "hmg.ch"
FUNCTION MAIN()
/*****************/
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 930 HEIGHT 400 ;
TITLE ' T e s t';
FONT "Arial" SIZE 09
ON KEY ESCAPE ACTION Form_1.Release
@ 10,840 LABEL LABEL_LEN_TB_1 ;
VALUE " " ;
WIDTH 100 ;
HEIGHT 35 ;
BOLD
DEFINE EDITBOX TB_1
ROW 10
COL 10
WIDTH 820
HEIGHT 250
VALUE '1234567890123456789012345678901234567890123456789012345678901234567890'
TOOLTIP ''
MAXLENGTH 2000
ON CHANGE TEST_LEN()
END EDITBOX
END WINDOW
Form_1.TB_1.SetFocus
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN
FUNCTION TEST_LEN()
/******************/
LOCAL cResult := "", n, nPOS
Form_1.LABEL_LEN_TB_1.Value := LEN(Form_1.TB_1.Value)
FOR n := 80 TO 800 STEP 80
IF LEN(Form_1.TB_1.Value) == 80
FOR nPos := 1 TO Len( Form_1.TB_1.Value ) STEP 80
cResult += SubStr( Form_1.TB_1.Value, nPos, 80 ) + CRLF
NEXT
Form_1.TB_1.Value := cResult
EXIT
ENDIF
NEXT
Code: Select all
CaretPos := len(VALUE)
Code: Select all
CaretPos := len(VALUE)
Code: Select all
CLASS DF_KOMUNIKATOR
DATA lTcpIP INIT .F.
DATA oPort INIT NIL
//
DATA cIpAdress INIT ""
DATA nIpPort INIT 0
DATA nTimeOut INIT 5000 // 3 sekundy
// dalej obsługa przez serial
DATA cDFPortName INIT "" // nazwa portu COM
DATA nPredkosc INIT 9600
DATA nParzystosc INIT NOPARITY
DATA nBitow INIT 8
DATA nBitowStopu INIT ONESTOPBIT
// stan portu
DATA Open INIT .F.
//
DATA nProducent INIT 1 // Novitus
DATA nCodePage INIT 1 // Mazovia
METHOD INIT SETGET
METHOD WRITE SETGET
METHOD READ SETGET
METHOD CLOSE SETGET
ENDCLASS
*---------
METHOD Init(lTcpIp, cNazwaPortu, nPort, nPredkosc, nParzystosc, nBitow, nBitowStopu, nTimeout) CLASS DF_KOMUNIKATOR
::lTcpIp := lTcpIp
if ::lTcpIp
if HB_PING(cNazwaPortu)<>0
MsgStop("Drukarka fiskalna nie odpowiada na adresie: "+cNazwaPortu)
return NIL
endif
if Empty( ::oPort := hb_socketOpen( HB_SOCKET_AF_INET, HB_SOCKET_PT_STREAM)) //, HB_SOCKET_IPPROTO_UDP ) )
//MsgStop( "socket create error " + hb_ntos( hb_socketGetError() ) )
MsgStop( "Błąd przy zestawieniu połączenia", "WYDRUK FISKALNY")
return NIL
endif
if ! hb_socketConnect( ::oPort, { HB_SOCKET_AF_INET, cNazwaPortu, nPort } )
//MsgStop( "socket connect error " + hb_ntos( hb_socketGetError() ) )
MsgStop( "Błąd przy zestawieniu połączenia", "WYDRUK FISKALNY")
return NIL
endif
::cIpAdress := cNazwaPortu
::nIpPort := nPort
else
::cDFPortName := cNazwaPortu
::nPredkosc := nPredkosc
::nParzystosc := nParzystosc
::nBitow := nBitow
::nBitowStopu := nBitowStopu
::oPort := win_com():Init(cNazwaPortu, nPredkosc, nParzystosc, nBitow, nBitowStopu)
if !::oPort:Open
MsgBox("Błąd otwarcia portu komunikacyjnego - BRAK POŁĄCZENIA Z DRUKARKĄ FISKALNĄ!", "WYDRUK FISKALNY" )
::oPort := NIL
return NIL
else
// "Open succeeded"
::oPort:RTSFlow(.F.)
::oPort:DTRFlow(.F.)
::oPort:XonXoffFlow(.t.)
::oPort:SetDTR(.t.)
endif
endif
// sprawdzamy, czy drukarka w ogóle jest podłączona
if !::Write( DLE ) // < 1)
MsgStop("Brak komunikacji z drukarką fiskalną", "WYDRUK FISKALNY" )
return NIL
endif
::nTimeOut := nTimeout
::Open := .t.
return SELF
*---------
METHOD Write(cDaneDoWyslania) CLASS DF_KOMUNIKATOR
local xLen := 0
local lOK := .T.
if ::lTcpIp
hb_socketSend( ::oPort, cDaneDoWyslania )
else
xLen := ::oPort:Write(cDaneDoWyslania)
if valtype(xLen) <> "N"
lOK := .f.
else
lOK := (xLen == len(cDaneDoWyslania))
endif
if !lOK
MsgStop("Operacja zakończona niepowodzeniem. Błąd komunikacji z durkarką fiskalną!", "WYDRUK FISKALNY" )
endif
endif
return lOK
*---------
METHOD Read(cOdpowiedz, n) CLASS DF_KOMUNIKATOR
hb_default(@n,1)
cOdpowiedz := space(n)
if ::lTcpIp
n := hb_socketRecv( ::oPort, @cOdpowiedz,,, ::nTimeOut )
//debugmsg("odpowiedz", cOdpowiedz)
else
::oPort:Read(@cOdpowiedz, n)
endif
return cOdpowiedz
*---------
METHOD Close CLASS DF_KOMUNIKATOR
if ::lTcpIp
hb_socketShutdown( ::oPort )
hb_socketClose( ::oPort )
else
::oPort:Close()
endif
::oPort := NIL
return
Code: Select all
CLASS DF_KOMUNIKATOR
DATA lTcpIP INIT .F.
DATA oPort INIT NIL
//
DATA cIpAdress INIT ""
DATA nIpPort INIT 0
DATA nTimeOut INIT 5000 // 3 sekundy
// dalej obsługa przez serial
DATA cDFPortName INIT "" // nazwa portu COM
DATA nPredkosc INIT 9600
DATA nParzystosc INIT NOPARITY
DATA nBitow INIT 8
DATA nBitowStopu INIT ONESTOPBIT
// stan portu
DATA Open INIT .F.
//
DATA nProducent INIT 1 // Novitus
DATA nCodePage INIT 1 // Mazovia
METHOD INIT SETGET
METHOD WRITE SETGET
METHOD READ SETGET
METHOD CLOSE SETGET
ENDCLASS
*---------
METHOD Init(lTcpIp, cNazwaPortu, nPort, nPredkosc, nParzystosc, nBitow, nBitowStopu, nTimeout) CLASS DF_KOMUNIKATOR
::lTcpIp := lTcpIp
if ::lTcpIp
if HB_PING(cNazwaPortu)<>0
MsgStop("Drukarka fiskalna nie odpowiada na adresie: "+cNazwaPortu)
return NIL
endif
if Empty( ::oPort := hb_socketOpen( HB_SOCKET_AF_INET, HB_SOCKET_PT_STREAM)) //, HB_SOCKET_IPPROTO_UDP ) )
//MsgStop( "socket create error " + hb_ntos( hb_socketGetError() ) )
MsgStop( "Błąd przy zestawieniu połączenia", "WYDRUK FISKALNY")
return NIL
endif
if ! hb_socketConnect( ::oPort, { HB_SOCKET_AF_INET, cNazwaPortu, nPort } )
//MsgStop( "socket connect error " + hb_ntos( hb_socketGetError() ) )
MsgStop( "Błąd przy zestawieniu połączenia", "WYDRUK FISKALNY")
return NIL
endif
::cIpAdress := cNazwaPortu
::nIpPort := nPort
else
::cDFPortName := cNazwaPortu
::nPredkosc := nPredkosc
::nParzystosc := nParzystosc
::nBitow := nBitow
::nBitowStopu := nBitowStopu
::oPort := win_com():Init(cNazwaPortu, nPredkosc, nParzystosc, nBitow, nBitowStopu)
if !::oPort:Open
MsgBox("Błąd otwarcia portu komunikacyjnego - BRAK POŁĄCZENIA Z DRUKARKĄ FISKALNĄ!", "WYDRUK FISKALNY" )
::oPort := NIL
return NIL
else
// "Open succeeded"
::oPort:RTSFlow(.F.)
::oPort:DTRFlow(.F.)
::oPort:XonXoffFlow(.t.)
::oPort:SetDTR(.t.)
endif
endif
// sprawdzamy, czy drukarka w ogóle jest podłączona
if !::Write( DLE ) // < 1)
MsgStop("Brak komunikacji z drukarką fiskalną", "WYDRUK FISKALNY" )
return NIL
endif
::nTimeOut := nTimeout
::Open := .t.
return SELF
*---------
METHOD Write(cDaneDoWyslania) CLASS DF_KOMUNIKATOR
local xLen := 0
local lOK := .T.
if ::lTcpIp
hb_socketSend( ::oPort, cDaneDoWyslania )
else
xLen := ::oPort:Write(cDaneDoWyslania)
if valtype(xLen) <> "N"
lOK := .f.
else
lOK := (xLen == len(cDaneDoWyslania))
endif
if !lOK
MsgStop("Operacja zakończona niepowodzeniem. Błąd komunikacji z durkarką fiskalną!", "WYDRUK FISKALNY" )
endif
endif
return lOK
*---------
METHOD Read(cOdpowiedz, n) CLASS DF_KOMUNIKATOR
hb_default(@n,1)
cOdpowiedz := space(n)
if ::lTcpIp
n := hb_socketRecv( ::oPort, @cOdpowiedz,,, ::nTimeOut )
//debugmsg("odpowiedz", cOdpowiedz)
else
::oPort:Read(@cOdpowiedz, n)
endif
return cOdpowiedz
*---------
METHOD Close CLASS DF_KOMUNIKATOR
if ::lTcpIp
hb_socketShutdown( ::oPort )
hb_socketClose( ::oPort )
else
::oPort:Close()
endif
::oPort := NIL
return
Code: Select all
#include <hmg.ch>
#include "hbsocket.ch"
FUNCTION Main()
PUBLIC oSocket , cRequest
PUBLIC cRtspDescribe := Space( 1024 )
PUBLIC cRtspSetup := Space( 1024 )
PUBLIC cRtspPlay := Space( 1024 )
PUBLIC nPos, nEnd, nSeq := 0
PUBLIC cSession := ""
PUBLIC cServerIP := "192.168.100.16" // IP de la cámara
PUBLIC nPort := 554 // Puerto RTSP
LOAD Window Main
Center Window Main
Activate Window Main
FUNCTION Connect()
oSocket := hb_socketOpen()
IF oSocket == NIL
MSGINFO("Error al crear socket")
RETURN
ENDIF
IF ! hb_socketConnect( oSocket, {HB_SOCKET_AF_INET, cServerIP, nPort } )
MSGINFO("No se pudo conectar a:", cServerIP)
hb_socketClose( oSocket )
RETURN
ENDIF
// 1) DESCRIBE
nSeq++
cRequest := "DESCRIBE rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourClient/1.0\r\n" + CRLF + ;
"Accept: application/sdp\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspDescribe, LEN( cRtspDescribe ) )
// 2) SETUP
nSeq++
cRequest := "SETUP rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0/trackID=0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourHMGClient/1.0\r\n" + CRLF + ;
"Transport: RTP/AVP/TCP;unicast;interleaved=2\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspSetup )
// Extraer Session ID
PUBLIC nPos, nEnd, cSession := ""
nPos := AT( "Session:", cRtspSetup )
IF nPos > 0
nEnd := AT( CRLF, SUBSTR( cRtspSetup, nPos ) )
cSession:= ALLTRIM( SUBSTR( cRtspSetup, nPos + 8, nEnd-1 ) )
ENDIF
// 3) PLAY
nSeq++
cRequest := "PLAY rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM(STR(nSeq)) + CRLF + ;
"Session: " + cSession + CRLF + ;
"Range: npt=0.000-\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspPlay , LEN( cRtspPlay ))
WAITWINDOW()
hb_socketClose( oSocket )
RETURN
Code: Select all
#include <hmg.ch>
#include "hbsocket.ch"
FUNCTION Main()
PUBLIC oSocket , cRequest
PUBLIC cRtspDescribe := Space( 1024 )
PUBLIC cRtspSetup := Space( 1024 )
PUBLIC cRtspPlay := Space( 1024 )
PUBLIC nPos, nEnd, nSeq := 0
PUBLIC cSession := ""
PUBLIC cServerIP := "192.168.100.16" // IP de la cámara
PUBLIC nPort := 554 // Puerto RTSP
LOAD Window Main
Center Window Main
Activate Window Main
FUNCTION Connect()
oSocket := hb_socketOpen()
IF oSocket == NIL
MSGINFO("Error al crear socket")
RETURN
ENDIF
IF ! hb_socketConnect( oSocket, {HB_SOCKET_AF_INET, cServerIP, nPort } )
MSGINFO("No se pudo conectar a:", cServerIP)
hb_socketClose( oSocket )
RETURN
ENDIF
// 1) DESCRIBE
nSeq++
cRequest := "DESCRIBE rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourClient/1.0\r\n" + CRLF + ;
"Accept: application/sdp\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspDescribe, LEN( cRtspDescribe ) )
// 2) SETUP
nSeq++
cRequest := "SETUP rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0/trackID=0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourHMGClient/1.0\r\n" + CRLF + ;
"Transport: RTP/AVP/TCP;unicast;interleaved=2\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspSetup )
// Extraer Session ID
PUBLIC nPos, nEnd, cSession := ""
nPos := AT( "Session:", cRtspSetup )
IF nPos > 0
nEnd := AT( CRLF, SUBSTR( cRtspSetup, nPos ) )
cSession:= ALLTRIM( SUBSTR( cRtspSetup, nPos + 8, nEnd-1 ) )
ENDIF
// 3) PLAY
nSeq++
cRequest := "PLAY rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM(STR(nSeq)) + CRLF + ;
"Session: " + cSession + CRLF + ;
"Range: npt=0.000-\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspPlay , LEN( cRtspPlay ))
WAITWINDOW()
hb_socketClose( oSocket )
RETURN
]]>En Android o la PC, al instalar la aplicacion te insiste en agregar la camara con su QR o Codigo que tiene en una etiqueta. al ejecutar el programa o aplicacion te pide solamente el password y despues te recomienda cambiarlo. nunca ms te pide entrarlo por eso yo uso la cadena RTSP que veo en WIRESHARK.
estoy estudiando la forma de recuperar la SessionID que devuelve el Metodo "SETUP" al cual no est devolviendo con mi programa pero si en el caso de la aplicacion oficial.
de paso estoy encapsulando todo el Clases
sin embargo con el metodo "OPTION" que no veo que usa la aplicacion oficial mediante WireShark si devuelve la SessionID que es requerida por otros Metodos de RTSP
]]>En Android o la PC, al instalar la aplicacion te insiste en agregar la camara con su QR o Codigo que tiene en una etiqueta. al ejecutar el programa o aplicacion te pide solamente el password y despues te recomienda cambiarlo. nunca ms te pide entrarlo por eso yo uso la cadena RTSP que veo en WIRESHARK.
estoy estudiando la forma de recuperar la SessionID que devuelve el Metodo "SETUP" al cual no est devolviendo con mi programa pero si en el caso de la aplicacion oficial.
de paso estoy encapsulando todo el Clases
sin embargo con el metodo "OPTION" que no veo que usa la aplicacion oficial mediante WireShark si devuelve la SessionID que es requerida por otros Metodos de RTSP
Attachments
Attachments