Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Kategoria: Akumulatorki / Baterie / Ładowarki

[Bascom],[ATmega644p],[enc28j60] Stos TCPIP i komunikacja z bazą SQL

RZI 29 Cze 2012 19:48
  • #1 29 Cze 2012 19:48
    RZI
    Poziom 8  

    Witam,

    Jestem posiadaczem płytki ewaluacyjnej EVB 4.3 firmy And-TECH (z ATmega 644p) która działa razem z modułem AND-ETH V2 na którym uruchomiłem serwer HTTP autorstwa Bena Zijlstra: http://members.home.nl/bzijlstra/software/examples/enc28j60.htm
    Płytka jako serwer działa poprawnie po zapytaniu GET wysyła strone w HTML.

    Teraz po krótkiej przerwie idąc dalej chciałem aby moja płytka działała jako klient i wysyłała np: zmierzoną temperaturę i wysłała do bazy MSSQL na dowolnym hostingu. Do tego założyłem sobie konto na ugu.pl i napisałem prosty skrypt w php który po otrzymaniu danych metodą get/post wrzuci je do bazy sql. Kiedy ręcznie (przez formularz) wrzucam dane do zapisuje do bazy i jest OK

    Napisałem obsługę stosu TCPIP i mam kłopot bo moje dane serwer (ugu.pl) nie interpretuje poprawnie (lub ramka nie jest poprawna co też biorę pod uwagę).

    Więc na początek wysyłam ACK do serwera ugu.pl gdzie jest moja mój plik witaj.php.

    Code:

    Sub Wyslij_dane
    Local Zmstan As Byte
    'Tcp
    Print " "
    Print " Przycisk wysylam ramke do ugu  ..."
    Print " "

    For Zmstan = 1 To 200
    Buffer(zmstan) = 0
    Next

    Buffer(1) = &H00                                            'adres mac  ruter                              ' Adres IP odbiorcy (na razie nie znany)
    Buffer(2) = &H1E
    Buffer(3) = &HE5
    Buffer(4) = &H8F
    Buffer(5) = &H36
    Buffer(6) = &HDC

    Buffer(7) = &H00                                            '6 adres nadawcy (mój)
    Buffer(8) = &H00
    Buffer(9) = &HE5
    Buffer(10) = &H8F
    Buffer(11) = &H36
    Buffer(12) = &HDC

    Buffer(13) = &H08                                           ' IP
    Buffer(14) = &H00
    Buffer(15) = &H45                                           'wer 4
    Buffer(16) = &H00
    Buffer(17) = &H00                                           '
    Buffer(18) = &H30                                           'Dlug 48 zweryfikować cz nie 40
    Buffer(19) = &H00                                           '
    Buffer(20) = &H00                                           ' identyfikacja
    Buffer(21) = &H40                                           ' dont fragment
    Buffer(22) = &H00


    Buffer(23) = &H80                                           'time to live                                         '
    Buffer(24) = &H06                                           'tcp=6
    Buffer(25) = &H00                                           'suma kontr IP.
    Buffer(26) = &H00
    Buffer(27) = 192                                            ' source
    Buffer(28) = 168

    Buffer(29) = 1
    Buffer(30) = 60
    Buffer(31) = 78                                             'destination
    Buffer(32) = 46

    Buffer(33) = 20
    Buffer(34) = 236
    Buffer(35) = &H00                                           'source port (80)
    Buffer(36) = &H50
    Buffer(37) = &H00                                           'destination port (80)
    Buffer(38) = &H50

    Buffer(39) = &H00                                           'sequence number
    Buffer(40) = &H00                                           '
    Buffer(41) = &H00                                           '
    Buffer(42) = &H02

    Buffer(43) = &H00                                           '
    Buffer(44) = &H00                                           '
    Buffer(45) = &H00                                           '
    Buffer(46) = &H00

    Buffer(47) = &H70                                           '
    Buffer(48) = &H02                                           'SYN                                           '
    Buffer(49) = &HFF                                           'window size value
    Buffer(50) = &HFF
    Buffer(51) = &H00                                           'suma kontrolna TCP
    Buffer(52) = &H00
    Buffer(53) = &H00
    Buffer(54) = &H00
    Buffer(55) = &H02
    Buffer(56) = &H04
    Buffer(57) = &H05
    Buffer(58) = &HB4
    Buffer(59) = &H01
    Buffer(60) = &H01
    Buffer(61) = &H04
    Buffer(62) = &H02

    ' wyslij SYN ramka IP
    Reset Tcp_rst
    Call Ip_header_checksum
    Call Tcp_checksum
    Call Enc28j60packetsend(62)


    moja ramka z SYN wygląda tak

    Code:

    Starting Tux
    Enc28j60-version = 6
     
     Przycisk wysylam ramke do ugu  z ACK...
     
     
    Ramka TCP/IP
    Mac odbiorcy:00-1E-E5-8F-36-DC
    Mac nadawcy:00-00-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0030
    ID (0000):0000
    Flags (4000):4000
    Time to live (80):80
    Protocol IP (06):06
    Check sum (XXXX):D5C9
    IP Source:192.168.1.60
    IP Destination:78.46.20.236
    Port source:0050
    Port Destination:0050
    Sequence nb:0002
    Acknowledge nb:0000
    Header lenght (70):70
    Flag SYN 02 / SYN ACK 12:02
    Window: FFFF
    Checksum : 5D7F
    Urgent (00):0000
    Option: 020405B401010402
     
    TCP_FIN 0
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    001EE58F36DC0000      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    0030000040008006     0  @ €
    D5C9C0A8013C4E2E    ŐÉŔ¨ <N.
    14EC005000500000     ě P P 
    0002000000007002          p
    FFFF5D7F00000204    ˙˙]   
    05B4010104020000     ´     



    Od serwera ugu.pl otrzymuję ramkę z ACK i SYN która wygląda tak:
    Code:

    Odebano: nowa ramka
     
    Ramka TCP/IP
    Mac odbiorcy:00-00-E5-8F-36-DC
    Mac nadawcy:00-1E-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0030
    ID (0000):0000
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):23CA
    IP Source:78.46.20.236
    IP Destination:192.168.1.60
    Port source:0050
    Port Destination:0050
    Sequence nb:1222291652
    Acknowledge nb:0003
    Header lenght (70):70
    Flag SYN 02 / SYN ACK 12:12
    Window: 3908
    Checksum : 047E
    Urgent (00):0000
    Option: 020405B401010402
     
    TCP_FIN 0
    TCP_SYN 1
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    0000E58F36DC001E      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    0030000040003206     0  @ 2
    23CA4E2E14ECC0A8    #ĘN. ěŔ¨
    013C005000507AE5     < P Pzĺ
    A502000000037012    Ą     p
    3908047E00000204    9  ~   
    05B4010104020000     ´     


    W tym momencie (po otrzymaniu ACK,SYN) wysyłam ACK a następnie PSH z zapytaniem GET do serwera ugu (próbowałem również z post i przeyłaniem parametrów ale też nie działa) Mój kod który realizuje wysłanie ACK i PSH wygląda tak:
    Code:

    'HTTP
    '
    Sub Http
       Local Msg_temp2 As String * 10
       Local Tempstring1 As String * 1
       Local Ackpsh As Byte
       Local Pkthulp As Word
       Local Tempword1 As Word
       Local Tempword3 As Word
       Local Z As Byte
       Local Ztemp As Byte
       Local Tempstring2 As String * 13
       Local Zm As String * 200
       Local Zmstan As Word

       Local Temp0 As Byte
       Local Temp1 As Byte
       Local Temp2 As Byte
       Local Temp3 As Byte

       Zmstan = 0

       Work = Tcp_flags
       Tcp_fin = Work.0
       Tcp_syn = Work.1
       Tcp_rst = Work.2
       Tcp_psh = Work.3
       Tcp_ack = Work.4
       Tcp_urg = Work.5

       Print " "
       Print "Odebano: nowa ramka"
       Print " "




             If Buffer(27) = 78 Then
                If Buffer(28) = 46 Then
                   If Buffer(29) = 20 Then
                      If Buffer(30) = 236 Then
                         Print " "
                         Print "dane dla mnie"
                         Print "zm2: " ; Zm2
                         Print " "

                           'If Zm2 = 0 Then
                            'Print "zm=0"
                            If Tcp_syn = 1 Then
                               If Tcp_ack = 1 Then
                                  Zm2 = 1
                                  Print " wysylam ramke do ugu z ACK ..."
                                  Print " "
                                  Print "zm2: " ; Zm2
                                  'Move IP source address to destination address
                                  T_ip_destaddr = T_ip_srcaddr
                                  'Make ethernet module IP address source address
                                  T_ip_srcaddr = My_ip
                                  Swap Tcp_srcportl , Tcp_destportl
                                  Swap Tcp_srcporth , Tcp_destporth
                                  Tcpdatalen_in = 1

                                  Client_seqnum0 = Tcp_seqnum0
                                  Client_seqnum1 = Tcp_seqnum1
                                  Client_seqnum2 = Tcp_seqnum2
                                  Client_seqnum3 = Tcp_seqnum3
                                  Client_seqnum = Client_seqnum + Tcpdatalen_in
                                  Call Seq2ack
                                  Tcp_acknum0 = Client_seqnum0
                                  Tcp_acknum1 = Client_seqnum1
                                  Tcp_acknum2 = Client_seqnum2
                                  Tcp_acknum3 = Client_seqnum3

                                  Call Src2dest
                                  'Set Flags.synflag
                                  Tcp_flags = 0
                                  'Set Tcp_flags.1
                                  Set Tcp_flags.4               'set ack
                                  Reset Tcp_syn
                                  Reset Tcp_rst

                                  Call Ip_header_checksum
                                  Call Tcp_checksum
                                  Call Enc28j60packetsend(62)

                                  Call Wyswietl_ramke

                                  Set Tcp_ack
                                  Set Tcp_psh

                                   Print " wysylam ramke do ugu z GET ..."
                                   Print " "

                                  'Move IP source address to destination address
                                   T_ip_srcaddr = My_ip

                                   Buffer(1) = &H00             'adres mac  ruter                              ' Adres IP odbiorcy (na razie nie znany)
                                   Buffer(2) = &H1E
                                   Buffer(3) = &HE5
                                   Buffer(4) = &H8F
                                   Buffer(5) = &H36
                                   Buffer(6) = &HDC
                                   Buffer(7) = &H00             'adres mac                              ' Adres IP odbiorcy (na razie nie znany)
                                   Buffer(8) = &H00
                                   Buffer(9) = &HE5
                                   Buffer(10) = &H8F
                                   Buffer(11) = &H36
                                   Buffer(12) = &HDC

                                   Buffer(31) = 78
                                   Buffer(32) = 46
                                   Buffer(33) = 20
                                   Buffer(34) = 236

                                   T_id1 = T_id1 + 1

                                   Buffer(47) = &H50
                                   Set Tcp_psh

                                   Tempword3 = 55

                                   Restore Htmlcode1

                                   Do
                                   Read Msg_temp
                                   Msg_temp2 = Right(msg_temp , 9)

                                   If Msg_temp2 = "endblock " Then
                                    Exit Do
                                   End If

                                   If Msg_temp2 = "Parametr1" Then
                                    Msg_temp = "6"              'Date(l2)
                                   End If

                                   If Msg_temp2 = "Parametr2" Then
                                    Msg_temp = "7"              'Time(l2)
                                   End If

                                   If Msg_temp2 = "Parametr3" Then
                                    Msg_temp = "8"              'Time(l2)
                                   End If


                                   If Msg_temp2 = "Parametr4" Then
                                    Msg_temp = "9"
                                   End If

                                   For Y = 1 To Len(msg_temp)
                                    Tempstring1 = Mid(msg_temp , Y , 1)
                                   Buffer(tempword3) = Asc(tempstring1)
                                   Incr Tempword3
                                   Next Y

                                   Loop


                                   Buffer(tempword3) = &H0D
                                   Incr Tempword3
                                   Buffer(tempword3) = &H0A
                                   Tempword3 = Tempword3 - 14
                                   Pkthulp = Tempword3 / 256
                                   T_ip_pktlen0 = Pkthulp
                                   Pkthulp = T_ip_pktlen0 * 256
                                   T_ip_pktlen1 = Tempword3 - Pkthulp
                                   Tempword3 = Tempword3 + 14

                                   Call Ip_header_checksum
                                   Call Tcp_checksum

                                   Call Enc28j60packetsend(tempword3)
                                   Call Wyswietl_ramke
                                   Reset Tcp_ack
                                   Reset Tcp_psh

                                   For Zmstan = 1 To 500
                                   Buffer(zmstan) = 0
                                   Next

                                   Tcp_flags = 0
                                   Zm2 = 2
                               End If
                            End If
    endsub

    ' htmlcode1
    '
    Htmlcode1:
    Data "GET /witaj.php.html HTTP/1.1" , &H0D , &H0A
    Data "Host: www.rzi.ugu.pl" , &H0D , &H0A
    Data "user -agent: Mozilla/5.0 (Windows NT 5.1; rv :12.0) Gecko/20100101 Firefox/12.0" , &H0D , &H0A
    Data "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 " , &H0D , &H0A
    Data "Accept-Language: pl" , &H0D , &H0A
    Data "Accept-Encoding: gzip, deflate" , &H0D , &H0A
    Data "Connection: keep-alive" , &H0D , &H0A , &H0D , &H0A
    Data "endblock "


    a w wyniku tego wysyłam ramke do ugu która wygląda tak:

    Code:

     wysylam ramke do ugu z ACK ...
     
    Ramka TCP/IP
    Mac odbiorcy:00-1E-E5-8F-36-DC
    Mac nadawcy:00-00-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0030
    ID (0000):0000
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):23CA
    IP Source:192.168.1.60
    IP Destination:78.46.20.236
    Port source:0050
    Port Destination:0050
    Sequence nb:0003
    Acknowledge nb:1222291653
    Header lenght (70):70
    Flag SYN 02 / SYN ACK 12:10
    Window: 3908
    Checksum : 047F
    Urgent (00):0000
    Option: 020405B401010402
     
    TCP_FIN 0
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    001EE58F36DC0000      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    0030000040003206     0  @ 2
    23CAC0A8013C4E2E    #ĘŔ¨ <N.
    14EC005000500000     ě P P 
    00037AE5A5037010      zĺĄ p
    3908047F00000204    9     
    05B4010104020000     ´     
               
     wysylam ramke do ugu z GET ...
     
     
    Ramka TCP/IP
    Mac odbiorcy:00-1E-E5-8F-36-DC
    Mac nadawcy:00-00-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0144
    ID (0000):0001
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):22B5
    IP Source:192.168.1.60
    IP Destination:78.46.20.236
    Port source:0050
    Port Destination:0050
    Sequence nb:0003
    Acknowledge nb:1222291653
    Header lenght (70):50
    Flag SYN 02 / SYN ACK 12:10
    Window: 3908
    Checksum : 5CF9
    Urgent (00):0000
    Option: 474554202F776974
     
    TCP_FIN 0
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 1
    TCP_ACK 1
    TCP_URG 0

     
    001EE58F36DC0000      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    0144000140003206     D  @ 2
    22B5C0A8013C4E2E    "&micro;Ŕ¨ <N.
    14EC005000500000     ě P P 
    00037AE5A5035010      zĺĄ P
    39085CF900004745    9 \ů  GE
    54202F776974616A    T /witaj
    2E7068702E68746D    .php.htm
    6C20485454502F31    l HTTP/1
    2E310D0A486F7374    .1
    Host
    3A207777772E727A    : www.rz
    692E7567752E706C    i.ugu.pl
    0D0A75736572202D   
    user -
    6167656E743A204D    agent: M
    6F7A696C6C612F35    ozilla/5
    2E30202857696E64    .0 (Wind
    6F7773204E542035    ows NT 5
    2E313B207276203A    .1; rv :
    31322E3029204765    12.0) Ge
    636B6F2F32303130    cko/2010
    3031303120466972    0101 Fir
    65666F782F31322E    efox/12.
    300D0A4163636570    0
    Accep
    743A20746578742F    t: text/
    68746D6C2C617070    html,app
    6C69636174696F6E    lication
    2F7868746D6C2B78    /xhtml+x
    6D6C2C6170706C69    ml,appli
    636174696F6E2F78    cation/x
    6D6C3B713D302E39    ml;q=0.9
    2C2A2F2A3B713D30    ,*/*;q=0
    2E38200D0A416363    .8
    Acc
    6570742D4C616E67    ept-Lang
    756167653A20706C    uage: pl
    0D0A416363657074   
    Accept
    2D456E636F64696E    -Encodin
    673A20677A69702C    g: gzip,
    206465666C617465     deflate
    0D0A436F6E6E6563   
    Connec
    74696F6E3A206B65    tion: ke
    65702D616C697665    ep-alive
    0D0A000000000000   


    Code:


    Ramka z ACK od ugu:

    [code]
     
    Odebano: nowa ramka
     
    Ramka TCP/IP
    Mac odbiorcy:00-00-E5-8F-36-DC
    Mac nadawcy:00-1E-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0028
    ID (0000):50BE
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):D313
    IP Source:78.46.20.236
    IP Destination:192.168.1.60
    Port source:0050
    Port Destination:0050
    Sequence nb:1222291653
    Acknowledge nb:00131
    Header lenght (70):50
    Flag SYN 02 / SYN ACK 12:10
    Window: 3CB8
    Checksum : 2C76
    Urgent (00):0000
    Option: 0000000000000000
     
    TCP_FIN 0
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    0000E58F36DC001E      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    002850BE40003206     (Pľ@ 2
    D3134E2E14ECC0A8    Ó N. ěŔ¨
    013C005000507AE5     < P Pzĺ
    A5030000011F5010    Ą    &not;P
    3CB82C7600000000    <¸,v   
    [/code]

    i tutaj mam problem ponieważ serwer nic nie odpowiada około 5 minut a po tym czasie mam ramke od sewera z informacją time out która wygląda tak:

    // po około 5 minutach dostaje od ugu //////////////////////////////////////////
     
    Odebano: nowa ramka
     
    Ramka TCP/IP
    Mac odbiorcy:00-00-E5-8F-36-DC
    Mac nadawcy:00-1E-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):01B2
    ID (0000):50C1
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):D186
    IP Source:78.46.20.236
    IP Destination:192.168.1.60
    Port source:0050
    Port Destination:0050
    Sequence nb:1222291653
    Acknowledge nb:00131
    Header lenght (70):50
    Flag SYN 02 / SYN ACK 12:18
    Window: 3CB8
    Checksum : 1CDE
    Urgent (00):0000
    Option: 485454502F312E31
     
    TCP_FIN 0
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 1
    TCP_ACK 1
    TCP_URG 0

     
    0000E58F36DC001E      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    01B250C140003206     ˛PÁ@ 2
    D1864E2E14ECC0A8    цN. ěŔ¨
    013C005000507AE5     < P Pzĺ
    A5030000011F5018    Ą    &not;P

    3CB81CDE00004854    <¸ Ţ  HT
    54502F312E312034    TP/1.1 4
    3038205265717565    08 Reque
    73742054696D652D    st Time-
    6F75740D0A446174    out
    Dat
    653A204672692C20    e: Fri,
    3239204A756E2032    29 Jun 2
    3031322031363A30    012 16:0
    333A313720474D54    3:17 GMT
    0D0A536572766572   
    Server
    3A20417061636865    : Apache
    0D0A436F6E74656E   
    Conten
    742D4C656E677468    t-Length
    3A203232330D0A43    : 223
    C
    6F6E6E656374696F    onnectio
    6E3A20636C6F7365    n: close
    0D0A436F6E74656E   
    Conten
    742D547970653A20    t-Type:
    746578742F68746D    text/htm
    6C3B206368617273    l; chars
    65743D69736F2D38    et=iso-8
    3835392D310D0A0D    859-1


    0A3C21444F435459   
    <!DOCTY
    50452048544D4C20    PE HTML
    5055424C49432022    PUBLIC "
    2D2F2F494554462F    -//IETF/
    2F4454442048544D    /DTD HTM
    4C20322E302F2F45    L 2.0//E
    4E223E0A3C68746D    N">
    <htm
    6C3E3C686561643E    l><head>
    0A3C7469746C653E   
    <title>
    3430382052657175    408 Requ
    6573742054696D65    est Time
    2D6F75743C2F7469    -out</ti
    746C653E0A3C2F68    tle>
    </h
    6561643E3C626F64    ead><bod
    793E0A3C68313E52    y>
    <h1>R
    6571756573742054    equest T
    696D652D6F75743C    ime-out<
    2F68313E0A3C703E    /h1>
    <p>
    5365727665722074    Server t
    696D656F75742077    imeout w
    616974696E672066    aiting f
    6F72207468652048    or the H
    0000E58F36DC001E      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    01B250C140003206     ˛PÁ@ 2
    D1864E2E14ECC0A8    цN. ěŔ¨
    013C005000507AE5     < P Pzĺ
    A5030000011F5018    Ą    &not;P

    3CB81CDE00004854    <¸ Ţ  HT
    54502F312E312034    TP/1.1 4
    3038205265717565    08 Reque
    73742054696D652D    st Time-
    6F75740D0A446174    out
    Dat
    653A204672692C20    e: Fri,
    3239204A756E2032    29 Jun 2
    3031322031363A30    012 16:0
    333A313720474D54    3:17 GMT
    0D0A536572766572   
    Server
    3A20417061636865    : Apache
    0D0A436F6E74656E   
    Conten
    742D4C656E677468    t-Length
    3A203232330D0A43    : 223
    C
    6F6E6E656374696F    onnectio
    6E3A20636C6F7365    n: close
    0D0A436F6E74656E   
    Conten
    742D547970653A20    t-Type:
    746578742F68746D    text/htm
    6C3B206368617273    l; chars
    65743D69736F2D38    et=iso-8
    3835392D310D0A0D    859-1


    0A3C21444F435459   
    <!DOCTY
    50452048544D4C20    PE HTML
    5055424C49432022    PUBLIC "
    2D2F2F494554462F    -//IETF/
    2F4454442048544D    /DTD HTM
    4C20322E302F2F45    L 2.0//E
    4E223E0A3C68746D    N">
    <htm
    6C3E3C686561643E    l><head>
    0A3C7469746C653E   
    <title>
    3430382052657175    408 Requ
    6573742054696D65    est Time
    2D6F75743C2F7469    -out</ti
    746C653E0A3C2F68    tle>
    </h
    6561643E3C626F64    ead><bod
    793E0A3C68313E52    y>
    <h1>R
    6571756573742054    equest T
    696D652D6F75743C    ime-out<
    2F68313E0A3C703E    /h1>
    <p>
    5365727665722074    Server t
    696D656F75742077    imeout w
    616974696E672066    aiting f
    6F72207468652048    or the H
    5454502072657175    TTP requ
    6573742066726F6D    est from
    2074686520636C69     the cli
    656E742E3C2F703E    ent.</p>
    0A3C2F626F64793E   
    </body>
    3C2F68746D6C3E0A    </html>



    nastepnie ugu zamyka sesje
    Code:

    Odebano: nowa ramka

     
    Ramka TCP/IP
    Mac odbiorcy:00-00-E5-8F-36-DC
    Mac nadawcy:00-1E-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0028
    ID (0000):50C2
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):D30F
    IP Source:78.46.20.236
    IP Destination:192.168.1.60
    Port source:0050
    Port Destination:0050
    Sequence nb:122229166141
    Acknowledge nb:00131
    Header lenght (07):50
    Flag SYN 02 / SYN ACK 12:11
    Window: 3CB8
    Checksum : 2AEB
    Urgent (00):0000
    Option: 0000000000000000
     
    TCP_FIN 1
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    0000E58F36DC001E      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    002850C240003206     (PÂ@ 2
    D30F4E2E14ECC0A8    Ó N. ěŔ¨
    013C005000507AE5     < P Pzĺ
    A68D0000011F5011    &brvbar;Ť   &not;P
    3CB82AEB00000000    <¸*ë   
     
    Ja zamykam sesje  FIN =1 wysyłam ramke do ugu z ack ...
     
    Ramka TCP/IP
    Mac odbiorcy:00-1E-E5-8F-36-DC
    Mac nadawcy:00-00-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0030
    ID (0000):50C2
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):D307
    IP Source:192.168.1.60
    IP Destination:78.46.20.236
    Port source:0050
    Port Destination:0050
    Sequence nb:00131
    Acknowledge nb:122229166142
    Header lenght (07):50
    Flag SYN 02 / SYN ACK 12:00
    Window: 3CB8
    Checksum : 2AF3
    Urgent (00):0000
    Option: 0000000000000000
     
    TCP_FIN 0
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    001EE58F36DC0000      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    003050C240003206     0PÂ@ 2
    D307C0A8013C4E2E    ÓŔ¨ <N.
    14EC005000500000     ě P P 
    011F7AE5A68E5000     &not;zĺ&brvbar;ŽP
    3CB82AF300000000    <¸*ó   


    i ja taż zamykam wysyłając

    Code:

    FIN =1 wysyłam ramke do ugu z ack ...
     
    Ramka TCP/IP
    Mac odbiorcy:00-1E-E5-8F-36-DC
    Mac nadawcy:00-00-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0030
    ID (0000):50C2
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):D307
    IP Source:192.168.1.60
    IP Destination:78.46.20.236
    Port source:0050
    Port Destination:0050
    Sequence nb:00131
    Acknowledge nb:122229166142
    Header lenght (07):50
    Flag SYN 02 / SYN ACK 12:00
    Window: 3CB8
    Checksum : 2AF3
    Urgent (00):0000
    Option: 0000000000000000
     
    TCP_FIN 0
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    001EE58F36DC0000      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    003050C240003206     0PÂ@ 2
    D307C0A8013C4E2E    ÓŔ¨ <N.
    14EC005000500000     ě P P 
    011F7AE5A68E5000     &not;zĺ&brvbar;ŽP
    3CB82AF300000000    <¸*ó   

     wysyłam ramke do ugu z fin ...
     
     
    Ramka TCP/IP
    Mac odbiorcy:00-1E-E5-8F-36-DC
    Mac nadawcy:00-00-E5-8F-36-DC
    Ethernet (0800):0800
    IP IP ver (05) var 45:45
    Different serices (00):00
    Lenght (0030):0030
    ID (0000):50C2
    Flags (4000):4000
    Time to live (80):32
    Protocol IP (06):06
    Check sum (XXXX):D307
    IP Source:192.168.1.60
    IP Destination:78.46.20.236
    Port source:0050
    Port Destination:0050
    Sequence nb:00131
    Acknowledge nb:122229166142
    Header lenght (07):50
    Flag SYN 02 / SYN ACK 12:00
    Window: 3CB8
    Checksum : 2AF3
    Urgent (00):0000
    Option: 0000000000000000
     
    TCP_FIN 1
    TCP_SYN 0
    TCP_RST 0
    TCP_PSH 0
    TCP_ACK 1
    TCP_URG 0

     
    001EE58F36DC0000      ĺŹ6Ü 
    E58F36DC08004500    ĺŹ6Ü  E
    003050C240003206     0PÂ@ 2
    D307C0A8013C4E2E    ÓŔ¨ <N.
    14EC005000500000     ě P P 
    011F7AE5A68E5000     &not;zĺ&brvbar;ŽP
    3CB82AF300000000    <¸*ó   

     KONIEC po FIN !!!
     


    Na tym cała obsługa stosu się kończy a problem który podejrzewam że mam to :
    1. Serwer ugu prawdopodobnie czeka na jakieś dane bo wysyła informacje "Serwer time out waiting for HTTP request" ?
    2. jest jakiś problem z wysyłaną ramka z zapytaniem GET (lub POST)
    a) brak sumy kontrolnej FCS
    b) błąd w indeksacji (ID) protokołu IP
    c) źle obliczona długość nagłówka TCP/IP
    d) inne nieznane

    Może ktoś z kolegów na forum analizował stos TCP IP i natchnął się na podobny problem? mile widziane wskazówki dotyczące rozwiązania problemu

    pozdrawiam RZI

  • #2 29 Cze 2012 22:41
    Mundi1970
    Poziom 24  

    Może serwer po GET odpowiada tylko moduł enc28j60 nie przyjmuje ramki, jaką wartość dałeś dla MAX_FRAMELEN? Klient nie informuje serwer jaką długość segmentu obsługuje, więc serwer wysyła pełną ramkę 1518 bajtów (wszystkie nagłówki + dane + crc). Jeżeli serwer nie otrzyma ACK, to wydaje mi się że serwer ponawia wysyłanie danych z minimalnym rozmiarem danych. MMS ustawiony jest na 536, po dodaniu wszystkich nagłówków i crc, ramka ethernet wynosi chyba 594 bajty.

  • #3 30 Cze 2012 14:26
    RZI
    Poziom 8  

    Max_framelen = 890, ramka z GET ma 341 bajtów a odpowiedź od serwera z komunikatem time out 448 bajtów więc wydaje się że nie przekracza złożonego bufora. Sprawdziłem również sumy kontrolne nagłówka IP i TCP i są liczone dobrze.
    Natomiast po dokładniejszym przyjrzeniu się procesowi nawiązywania połaczenia faktycznie jest coś nie tak bo:
    wysyłam SYN,.........otrzymuje SYN,ACK
    wysyłam ACK
    wysyłam PSH,ACK....otrzymuję SYN,ACK
    ...............................otrzymuję ACK
    ...............................po około 5 min otrzymuję PSH, ACK z komunikatem Time out

    Znalazłem błąd w składni GET ale nia ma znaczenia bo po poprawieniu nadal jest NOK

  • #4 30 Cze 2012 16:18
    Mundi1970
    Poziom 24  

    Bardzo źle przegląda się te logi, nie mogę się doszukać czy niema pomyłki w nr SEQ i ACK. Proponowałbym na początek nie łączyć się z serwerem zewnętrznym, tylko zainstalować na komputerze prosty serwer HTTP Link (tylko 131 KB). Drugi program który będzie potrzebny to sniffer Wireshark Link . Mając te dwa programy przetestuj połączenie z serwerem i metodę GET. W Wiresharku połączenia TCP/IP można filtrować po numerze portu, mac'u. Będziesz miał czarno na białym co wysyła enc28j60 a co odpowiada serwer, pokaże wszystkie błędy.

    Jeszcze jeden błąd zauważyłem w pierwszym pakiecie wysyłasz rozmiar okna 64KB, serwer odpowiada i okno ma ustawione na 0x3908. Tą wartość później używasz przy wysyłaniu następnych pakietów. 0x3908 to dziesiętnie 14600 bajtów, raczej takiego okna nie jesteś wstanie obsłużyć. Window size (okno) jest informacją dla serwera, ile jesteś wstanie jednocześnie przyjąć danych. Cała pamięć RAM enc28j60 to 8KB, podzielona na bufor nadawczy i odbiorczy. W tym wypadku okno jest większe niż bufor odbiorczy, i przy przesyłaniu dłuższych plików pakiety będą gubione.

  • #5 02 Lip 2012 20:19
    RZI
    Poziom 8  

    Po instalacji serwera mongoose-3.1 oraz krasnal i próbach na obydwóch wraz z podglądem pakietów oraz od nowa napisaniu części kodu stosu efekt ten sam czyli po wysłaniu SYN, odebraniu SYN, ACK i wysłaniu ACK i PSH ACK i odebraniu ACK brak ramki z serwera ACK, PSH z zawartością strony. Po 5 minutach serwer kończy FIN ACK. Oczywiście zmieiłem okno od 1460 do 800 oraz kombinowałem z Maxframelen od 500 do 1200 ale bez rezultatów.

    W załączniku zrzut z wiresharka i print screeny i kod programu, jeśli ktoś mógłby przeanalizować to zapraszam

    pozdrawiam

  • #6 03 Lip 2012 00:12
    Mundi1970
    Poziom 24  

    RZI napisał:
    Oczywiście zmieiłem okno od 1460 do 800 oraz kombinowałem z Maxframelen od 500 do 1200 ale bez rezultatów.

    ATmega644p ma 4KB ramu więc możesz się bawić pełną ramka Ethernet. Wypróbuj takie ustawienia MAX_FRAMELEN=1518 dla enc28j60, dla TCP MSS=1460 (maximum segment size) i okno 2000.

    RZI napisał:
    W załączniku zrzut z wiresharka i print screeny i kod programu, jeśli ktoś mógłby przeanalizować to zapraszam

    W Wireshrku masz możliwość zapisania sesji jako plik *.pcap, nie rób zrzutów ekranu. Skompresuj plik jako *.zip i możesz dać na elektrode.pl.

  • #7 07 Lip 2012 21:04
    RZI
    Poziom 8  

    witam,

    Według wskazówek MAX_FRAMELEN=1518, dla TCP MSS=1460 i okno 2000.
    W załączniku kod programu i zrzut z wireshark.
    Z filtrem ip.addr == 192.168.1.60 widać tylko transmisje do ENC

    Problem cały czas ten sam po około 5 min dostaje FIN ACK zamiast PHY ACK ze stroną z serwera.

    Niestety nadal nie widzę błędu ?
    pozdrawiam

  • #8 08 Lip 2012 00:45
    piotrva
    Moderator Mikrokontrolery

    Poszukaj na elce tematu związanego z enc28j60, Bascom i urządzeniami mobilnymi. Ten stos pod Bascom od Bena ma oryginalnie pewne błędy i tu one wychodzą. A tak czy siak zastanów się nad przejściem na C. Oryginalne tux-graphics pod C działa jak marzenie i nawet sam robiłem bardzo podobny projekt i wszystko smigalo aż miło;-)

  • Pomocny post
    #9 08 Lip 2012 12:04
    Mundi1970
    Poziom 24  

    Przez te 5 minut, serwer oczekuje aż wyślesz dalszą część zapytania. :)
    Wysyłasz:

    Code:
    "GET /~test HTTP/1.1" , &H0D , &H0A
    
    "Host: 192.168.1.241" , &H0D , &H0A

    a powinno być:
    Code:
    "GET /~test HTTP/1.1" , &H0D , &H0A
    
    "Host: 192.168.1.241" , &H0D , &H0A
     &H0D , &H0A

  • #10 11 Lip 2012 18:15
    RZI
    Poziom 8  

    Witam,

    Tak zgadza się tu jest błąd. Po dodaniu 0D,0A dostaje odpowiedź od serwera ze stroną i jest prawie dobrze. Prawie bo wyłonił się nowy problem a mianowicie po wysłaniu PSH, ACK z serwera wysyła również jeszcze 2 razy retransmisie i ENC czasami się zawiesza i muszę resetować serwer( krasnal).
    Spróbuje jeszcze prześledzić kod pewnie jest jeszcze jakiś bug.

    Dzięki za pomooc Mundi1970, bo już miałem zacząć uczyć się C (nawet kupiłem książke) a tak powalczę jeszcze troche z bascomem.

    pzdr
    RZI

  • #11 11 Lip 2012 23:02
    piotrva
    Moderator Mikrokontrolery

    1. Moim skromnym zdaniem tak czy inaczej ucz się C - to język z wielką przyszłością, tymczasem niestety Bascom... pozostawia wiele do życzenia. Porównaj sobie choćby czasy pingów - na bascomie wyciągnąłem maksymalnie 2-3ms, w C mam <1ms -2ms (ale te 2 bardzo rzadko).
    2. Jeśli chodzi o serwer - krasnal jest już archaiczny, zamiast niego stosuj WebServ 2.0: http://www.webserv.pl/

  • #12 12 Lip 2012 10:43
    Mundi1970
    Poziom 24  

    Cytat:
    Prawie bo wyłonił się nowy problem a mianowicie po wysłaniu PSH, ACK z serwera wysyła również jeszcze 2 razy retransmisie i ENC czasami się zawiesza i muszę resetować serwer( krasnal).

    Niektóre funkcje do komunikacji z enc28j60 trzeba poprawić żeby układ działał stabilnie Link . Ale przyczyną retransmisji niekoniecznie musi być zawieszenie układu, mogłeś też błędnie odpowiedzieć lub bufor układy jest pełny i nie przyjmuje następnych danych. Jeżeli będziesz wykorzystywał większe okno, program musi być odporny na zagubione ramki, na ramki które już otrzymałeś i potwierdziłeś. Tu jest filmik który pomógł mi zrozumieć jak działa okno:


    Link

    Jeżeli program będzie prawidłowo napisany to podczas połączenia TCP z serwerem, spokojnie możesz odłączyć pachcorda, odczekać chwilę i ponownie podłączyć. Przerwana transmisja będzie dalej kontynuowana :).

  • #13 25 Wrz 2012 19:22
    RZI
    Poziom 8  

    temat rozwiązany, przesiadka na C, w załączniku kod dla zainteresowanych na platformie eclipse
    wszystko działa !:) zmierzona temperatura jest wysyłana na zewnętrzny serewer i umieszczana w bazie danych mysql.
    Następny krok to jakiś wykresik w php

    pzdr RZI