Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Auto-Moto
Mobilní telefony
Notebooky  |  Tablety
Příslušenství
Wearables  |  Ostatní
Svět hardware  |  Digimanie  |   TV Freak

Tisk pres IrDA

Buthrakaur (61)|14.12.2005 08:27
Snazim se rozchodit tisk z aplikace pres IrDA (konkretne na HP DJ 450), ale nedari se. Zkousel jsem napred Smart Device Print Engine for Compact Framework, ale tisknout se mi nedari - jenom blikne LEDka u IrDA tiskarny a nic se nevytiskne.

Zkousel jsem i primo posilat data na Ir port pres P/Invoke a pak i pres OpenNetCF SerialPort, ale vysledek stejnej - maximalne dostanu exception "write file failed 1359", coz je podle winapi dokumentace "The security account database contains an internal inconsistency.", takze to mi moc nerekne :mad: Tiskarna podporuje PCL3, takze jsem zkousel posilat pred tiskem na port reset apod prikazy a po tisku page feed, ale opet vysledek = e1359...

Jeste mam problem s tim, ze nevim, jestli zapisuju na spravnej port - IrDA mam na COM3 a 4 - na COM3 je oznacenej jako "IRComm", COM4 jako native. Predchozi chyby dostavam, kdyz zapisuju na COM3 - pokud pracuju s COM4, tak k zadne exception sice nedojde, ale tiskarna ani neblikne :(

Nezkousel nekdo primou komunikaci s IrDA portem nebo primo tisk? Pres PrintBoy apod utilitky mi tiskarna pres infra tiskne bez problemu, ale potrebuju rozchodit IR komunikaci primo z moji aplikace...
Buthrakaur (61)|14.12.2005 09:11
jeste pro doplneni - ted jsem jeste vyzkousel System.Net.Sockets.IrDAClient - tiskarnu mi najde (DiscoverDevices), ale pri pokusu o connect dostanu exception "no connection could be made...target machine actively refused it"...
beecher (9270)|14.12.2005 12:29
Nebude spise problem v te tiskarne?
Buthrakaur (61)|14.12.2005 12:34
uz to tak vypada - asi je potreba do HP/PCL tiskaren poslat napred nejaky inicializacni retezec... na jine tiskarne (seiko) mi tisk stejnym zpusobem funguje bez problemu.

takze asi abych preformuloval puvodni dotaz - povedlo se nekomu zprovoznit tisk pres IrDA na HP/PCL tiskarne?
beecher (9270)|14.12.2005 12:37
Jeste jeden workaround... ;)

HP nabizi Mobile Printing balik (tak nejak se to jmenuje) pro PDA... Pokud ten dokaze na te tiskarne vytisknout, tak bych si nejak logoval, co to tam posila a podle toho se ridil...
Buthrakaur (61)|14.12.2005 12:55
Ten HP Mobile Printing package jsem nasel tady ve freeware (HP ho prestalo vyvijet, konci support a uz neni ani ke stazeni na jejich strankach) a pres nej tiskarna tiskne...
Uz mne napadlo nejak odchytavat, co pres to infra presne posila, ale nejak mne nenapada zpusob, jak to udelat. Druhe PPC nemam, abych si moh udelat jednoduchou aplikaci, ktera by poslouchala na IrDA, na PC taky infra nemam... Nevite o nejakem PPC nebo klidne i desktop sw, ktery by umel monitorovat provoz na ir-portu?
Buthrakaur (61)|14.12.2005 15:16
Tak uz se mi podarilo odchytit, co presne posila moje aplikace a HP Mobile Printing aplikace a problem je asi v tom, ze se snazim komunikovat pres IrCOMM port (COM3), zatimco HP aplikace komunikuje pres nativni IR port (COM4) jinym protokolem... nektere tiskarny zrejme IrCOMM neumi :(

na zacatku komunikace moje aplikace posila:
...IrDA:IrCOMMIrDA:TinyTP:LsapSel...

zatimco HP posila:
...IrLPTIrDA:IrLMP:LsapSel...

problem ale je, ze na tom nativnim portu se mi poradne nedari komunikovat - musim napred vypnout prijem infra na PPC (connections->beam->receive all incoming beams), aby mi aplikace nehazela chybu "create file failed: 55" a kdyz prijem ir vypnu, tak se pak sice PPC tvari ze vsechno projde bez chyby, ale tiskarna ani neblikne :mad:

idealni by teda asi bylo sehnat nekde to HP Mobile Printing SDK pro compact framework, ale nikde to nemuzu najit a u HP to uz stahli :/
Buthrakaur (61)|16.12.2005 12:29
uff... takze po 2 dnech googlovani a zkouseni vseho mozneho jsem nakonec uspel :)

Podle luxusni M$-IrDA stranky Microsoft Windows Winsock IrDA programming jsem si napsal v eVC DLL, ktere mi umozni prepnout Socket do IrLPT modu a tisk pak funguje bez problemu. Podle vseho to vypada, ze v CF zapomneli na moznost prepnuti Socketu do tohohle modu. Pres prime P/Invoke winsock.dll (setsockopt(Socket.Handle,...)) se mi to bohuzel nepodarilo, ale pres tu eVC DLL to nastesti funguje bez problemu.
RStein (2012)|21.12.2005 20:41
Uz se vam podarilo vsechny problemy vyresit? Pokud ano, zajimalo by me, jak jste si poradil s tou unmanaged knihovnou. Ja jen, jestli mam neco zkouset, protoze budu mit konecne pres Vanoce cas, anebo jste si se vsim poradil (reaguji na soukrome zpravy)
Buthrakaur (61)|21.12.2005 22:40
Bohuzel, zatim jsem skoncil u toho P/Invokovani unmanaged knihovny, ktera mi pres winsock.dll zajistuje odesilani dat socketem pres infra. Z managed kodu se mi bohuzel nepodarilo prepnout socket do IrLPT modu (ze standardniho IrCOMM). Pokousel jsem se volat primo funkci setsockopt z winsock.dll, ale vysledek byl vzdycky -1 = chyba. Jako parametr z managed kodu jsem pouzival Socke.Handle...

zitra sem jeste hodim zdrojak, jak presne jsem se o to pokousel...
Buthrakaur (61)|22.12.2005 08:10
tak ten muj pokusny kod:
[CODE]
[DllImport("winsock.dll", EntryPoint="setsockopt")]
public static extern int setsockopt(int s, int level, int optname, byte[] optval, int optlen);
[DllImport("winsock.dll", EntryPoint="WSAGetLastError")]
public static extern int WSAGetLastError();


private void button2_Click(object sender, System.EventArgs e)
{
int SOL_IRLMP = 0x00FF;
int IRLMP_IRLPT_MODE = 0x00000015;
Socket s = new Socket(AddressFamily.Irda, SocketType.Stream, ProtocolType.IP);
int ret = setsockopt((int)s.Handle, SOL_IRLMP, IRLMP_IRLPT_MODE, new byte[]{1}, 1);
if (ret != 0)
{
int err = WSAGetLastError();
}
}
[/CODE]

ret -> -1 a WSAGetLastError mi vyhodi MissingMethodException presto, ze by tahle metoda podle msdn ve winsock byt mela...
RStein (2012)|22.12.2005 10:21
Myslim, ze ta vyjimka se tyka nalezeni funkce WSAGetLastError.

Zkuste primo GetLastError


[DllImport("winsock.dll", SetLastError=true]
public static extern int setsockopt(int s, int level, int optname, byte[] optval, int optlen);


a kod chyby ziskate volanim

Marshal.GetLastWin32Error()
Buthrakaur (61)|22.12.2005 10:28
jasne, mate pravdu - MissingMethodEx je kvuli nenalezeni WSAGetLastError ve winsock (asi jsem to napsal v predchozim prispevku nesrozumitelne)...

Zkousel jsem i DllImport("winsock.dll", EntryPoint="GetLastError"), ale vysledek stejny - MissingMethodException. Marshall.GetLastWin32Error() vraci 0.
RStein (2012)|22.12.2005 10:31
A mate opravdu nastaven SetLastError na true?
RStein (2012)|22.12.2005 10:36
A GetLastError je samozrejme v coredll.dll
Buthrakaur (61)|22.12.2005 10:41
nemel jsem ten SetLastError u importu samozrejme :oops:
takze chybka je WSAENOTSOCK (10038) :
Socket operation on nonsocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.


takze to vypada, ze Socket.Handle je nejaky podivny... zkusim jeste pres reflector vypatrat neco vic...

pro uplnost jeste aktualni verze zkusebniho kodu:
[CODE]

    [DllImport("winsock.dll", EntryPoint="setsockopt", SetLastError=true)]

    public static extern int setsockopt(int s, int level, int optname, byte[] optval, int optlen);

 

    private void button2_Click(object sender, System.EventArgs e)

    {

      int SOL_IRLMP = 0x00FF;

      int IRLMP_IRLPT_MODE = 0x00000015;

      Socket s = new Socket(AddressFamily.Irda, SocketType.Stream, ProtocolType.IP);

      int ret = setsockopt((int)s.Handle, SOL_IRLMP, IRLMP_IRLPT_MODE, new byte[]{1}, 1);

      if (ret != 0)

      {

        int errm = Marshal.GetLastWin32Error(); // = 10038

      }

    }

[/CODE]
RStein (2012)|22.12.2005 10:43
Muj odhad je, ze mate handle "spatne - jine" verze WSA.

Zkuste importovat funkci setsockopt z knihovny Ws2_32.dll, pripadne jen WS2.dll
RStein (2012)|22.12.2005 10:43
Aha, to jsme se docela sesli v popisu problemu ;)
Buthrakaur (61)|22.12.2005 10:48
zkusil jsem ted setsockopt z ws2.dll a vysledek stejny - ret == -1, chyba stale 10038 :((
Buthrakaur (61)|22.12.2005 11:03
btw koukal jsem ted do zdrojaku tridy Socket, resp. interni tridy OSSOCK, ktera vola unmanaged funkce pro manipulaci se sockety a zarazi mne trochu, ze se nevola primo knihovna winsock/ws2, ale mscoree... Ani parametry presne nesedi s tim, co je v popisu socket na msdn (4 parametry misto 3). Da se nejak zjistit, co presne mscoree vola?

Pri vytvareni new Socket(...) se handle nastavuje na vysledek funkce OSSOCK.socket(...), ktera je nadefinovana jako:

[DllImport("mscoree", EntryPoint="@289")]
public static extern int socket(int af, int type, int proto, ref int rc);

jeste mne ted napadlo vytvorit si socket pres P/Invoke (handle = winsock->socket()) a v C# pak vytvorit objekt Socket = new Socket(handle), ale pochybuju, ze pak bude takovy objekt spravne fungovat...
RStein (2012)|22.12.2005 11:08
MS ma ruzne nedokumentovane zkratky pres knihovny, ale myslim, ze ta funkce je jen proxy k ws2.dll, takze nerozumim tomu, proc to nechodi. ve velkem Frameworku nemam problem, zkousim to jeste ted primo v CNF
RStein (2012)|22.12.2005 11:35
Tak zacinam mit podezreni, ze socket v Compact .NEt Frameworku nevystavuje nativni handle - coz by znamenlo, ze WSA nebude fungovat. To by byl ale fakt spatnej vtip :(
Buthrakaur (61)|22.12.2005 11:40
jo, taky jsem dospel k nazoru, ze si v mscoree vyrobi nejaky svoje handle a to nativni uz se clovek proste nedozvi :mad:
doufam, ze aspon v CF2 je tohle opraveny - uz jenom ta hloupost, ze se pres Socket.SetSocketOption() neda nastavit vsechno, co sockety podporujou ://
Buthrakaur (61)|22.12.2005 11:48
a jeste posledni vec, co mne napadla - jestli nahodou ten ctvrty ref parametr v OSSOCK.socket() neni to nativni handle... nedari se mi ale pouzit tu funkci z mscoree, ktera se pouzije pro OSSOCK.socket() -> MissingMethodException. jakto, kdyz to ze systemovych knihoven jde??

[DllImport("mscoree", EntryPoint="@289")]
public static extern int socket(int af, int type, int proto, ref int rc);

int i = 0;
int ret = socket((int)AddressFamily.Irda, (int)SocketType.Stream, (int)ProtocolType.IP, ref i); // -> MissingMethodException
RStein (2012)|22.12.2005 12:42
Tak jsem ted vyzkousel,. co se dalo a zadny vysledek. Napadaji me jen takovy zverstva, jako podhozeni jine dll se stejnym seznamem ecportovanych funkci a reimplementaci vytvareni soketu.

Vznesu pozadavek na MS - narazil jste na docela neprijemny problem :(
p4v3l_ce4you (1)|13.5.2006 09:23
Take se marne snazim o vyvoj aplikace pro tisk z PPC pres IrDA (Symbol MC50, Windows Mobile 2003, eMbedded Visual C++). Kdesi jsem vystrachal program HP Mobile Printing (HP jiz zastavil jeho vyvoj a oficialne ho jiz na svych strankach nenabizi). Pomoci nej tisk funguje. K tomuto programu bylo take drive k dispozici SDK (HP Mobile Printing SDK for Pocket PC). Nemela by jej nektera zde se pohybujici dobra duse? Ackoliv jsem prolezl jiz desitky, mozna stovky stranek, nikde neni k nalezeni.

Nepohrdnu samozrejme ani radou jak jinak tisknout z vlastni aplikace pres IrDA.

Diky moc.

EDITED: Tak uz se zadarilo. Uz pekne tisknu ze sve aplikace v PPC na BJC-85 pres IrDA...;)
Pokud by mel nekdo stejny problem, rad poradim jak na to...
Kohout41 (20)|17.7.2006 19:50
To p4v3l

No to bych si rad probral, muzes me plz kontaktovat pres PrivMessage nebo na mejl kohout41@seznam.cz ???

Diky kohout41