Strona Główna WTW Mine Field Dokumentacja Forum Software O Nas
 
Dokumentacja Techniczna
 
Dawno temu, a konkretniej na początku roku napisałem zaczątek procedur obsługi transmisji obrazków dla wtw. Skończyło się na tym, iż program co prawda obrazki wysyłał, ale były ucięte (lub kończyło się to komunikatem "obrazek został usunięty" po drugiej stronie). Wczoraj miałem chęci aby dokończyć pisanie obsługi, a poza tym malcom podesłał swój "szkicownikowy" opis tego protokołu, z którego pożyczyłem sobie informacje o pobieraniu pliku po stronie klienta i informację o jednym błędzie. Do rzeczy: Kiedy chcemy wysłać komuś obrazek najpierw musimy go zapytać czy zechce obrazek odebrać, robimy to takim oto przykładowym pakietem: <message type='pic' to='odbiorca@tlen.pl' crc='b553629' idt='3515' size='46157' ext='jpg'/> Gdzie odpowiednio:
  • type - typ wiadomości, w naszym wypadku jest to obrazek;
  • to - do kogo wysłać, z zasobem lub bez;
  • crc - teoretycznie jest to suma kontrolna CRC32, w praktyce, (jak to zwykle w o2 bywa,) może to być cokolwiek byle miało 8 znaków. Pole do czegoś używane niby jest, ale nie za bardzo wiadomo czego; Teoretycznie, tak jak w GG po tym można by zapisać obrazek do "pamięci podręcznej" i przy próbie ponownego przesłania pobrać go stamtąd, ale klient tlenu tego nie czyni.
  • idt - ID Transmisji, losujemy sobie jakąś liczbę po której będziemy rozpoznawać resztę "zapytań";
  • size - rozmiar obrazu w bajtach, maksymalnie 255kB. Jeśli damy tu więcej serwer albo zwróci błąd, albo nas oleje a userowi z drugiej strony prześle komunikat, iż chcieliśmy przesłać za duży obrazek;
Jeśli klient obrazka odebrać nie chce powinniśmy dostać o tym odpowiednią informację. Tyle, że jej nie dostajemy, rozsądne wydaje się więc założenie, że jeśli nie dostaliśmy odpowiedzi w ciągu 30 sekund, należy całą procedurę olać. Jeśli klient jest nami zainteresowany dostaniemy pakiet w takim formacie: <message type='pic' crc_c='n' idt='3515' from='odbiorca@tlen.pl' /> Gdzie:
  • crc_c - cholera wie co to jest, ale ma wartość "n" i po tym możemy rozpoznać, że zgoda nastąpiła na transmisję;
  • idt - to co sami podaliśmy wcześniej;
  • from - no, od kogo ta zgoda;
Teraz możemy przystąpić do właściwego transferu danych, wykonywany jest on OOB za pomocą serwera ps.tlen.pl, z którym trzeba się połączyć na porcie 443 (bez szyfrowania czy czegokolwiek). I wysłać tam pakiet takiej konstrukcji: <pic auth='nadawca' t='p' to='odbiorca@tlen.pl' size='31337' idt='3515'/> Gdzie:
  • auth - nasz login, bez @tlen.pl
  • t - typ zapytania, jeśli wysyłamy obrazek to jest to "p";
  • to - do kogo ten obrazek;
  • size - rozmiar, tutaj musi on być prawidłowy ze względu na to, iż serwer musi ustalić gdzie jest koniec obrazka. Wcześniej pisałem o limicie 255kB, tutaj można upchać więcej, dużo więcej;
  • idt - nasze wcześniej wybrane id;
Jeśli wszystko jest OK, to wtedy serwer wyśle nam pakiet IBB o takiej konstrukcji: <message to='nadawca@tlen.pl' from='ps' type='pic' pid='1001' st='2233' rt='6545' idt='3515'/> Potrzebujemy z niego zapisać sobie wartości st i rt, pid jest stały i wynosi zawsze 1001, i cholera wie do czego właściwie jest. Kiedy już wydobędziemy z niego to co nam potrzebne wysyłamy do serwera PS (czyli OOB) pakiet takiej konstrukcji: <pic st='2233' idt='3515'/> Gdzie wszystkie wartości są "pritti self eksplejning". Po tym pakiecie wysyłamy do PS właściwy obrazek w formie binarnej, bez dodatkowych kodowań i cyrków, a następnie zamykamy połączenie z PS. Tutaj dobrym pomysłem jest odczekanie chwili miedzy zakończeniem połączenia a zakończeniem wysyłania danych, inaczej serwer może nam uciąć koniec obrazka. Na koniec, do klienta już normalnym strumieniem wysyłamy wiadomość informującego o możliwości pobrania obrazka z serwera. Konstrukcja pakietu następująca jest: <message to='odbiorca@tlen.pl' type='pic' pid='1001' rt='6545' idt='3515'></message> I to z naszej strony wszystko. Po stronie odbiorcy całość wygląda tak: Kiedy otrzyma pierwszy z wymienionych pakietów (gdzie oczywiście zamiast "to" będzie "from") odpowiada nań pakietem, który jest tam wcześniej jako drugi (jeśli chce obrazek odebrać) lub go olewa jeśli nie. Jeśli obrazek nas interesuje, to po jakimś czasie dostanie z serwera pakiet, który wygląda mniej-więcej tak: <message type='pic' pid='1001' rt='6545' idt='3515' from='nadawca@tlen.pl' /> Zapisujemy sobie z niego idt oraz rt, łączymy się z serwerem ps.ten.pl na porcie 443, wysyłamy mu zapytanie autoryzacyjne skonstruowane tak: <pic auth='odbiorca' t='g' from='nadawca@tlen.pl' pid='1001' rt='6545' idt='3515'/> Jedyna różnica w nim (w stosunku do opisanego wcześniej) to to, że:
  • t - (typ zapytania) w wypadku pobierania ma wartość "g";
Jeśli wszystko jest ok, to serwer rozpocznie wysyłkę obrazka, na jego początku umieszczając tag: <pic size='31337' /> A za nim obrazek w postaci binarnej (dokładnie tak jak został wysłany). Kiedy odbierzemy z serwera ilość danych podaną w "size", połączenie zamykamy i pokazujemy obrazek w okienku rozmowy.