beste lezers,

Ik ben in het bezit van een GPS Tracker VT310 en daar wil ik via UDP graag mee willen communiceren. Nu zit ik alleen vast bij de checksum. Ik begrijp niet hoe ik de checksum moet berekenen.

Ik heb het volgende gekregen vanuit de datasheet:

2 bytes. It indicates CRC-CCITT (default is 0xffff) checksum of all data (not including CRC itself and the ending character). It is in hex code.
For example:
24 24 00 11 13 61 23 45 67 8f ff 50 00 05 d8 0d 0a
0x05d8 = CRC-CCITT (24 24 00 11 13 61 23 45 67 8f ff 50 00)

Ik kom er niet uit.. De communicatie gaat tussen de Tracker en de server. De server wordt geschreven in PHP. Maar ik snap niet hoe ik de checksum moet berekenen.

Hopelijk kan iemand mij helpen.

Startpage stuk? Kijk eens hier of hier. Wellicht is hier ook nog wel wat zinnigs voor je te vinden.

Als jij een server in PHP maakt, dan moet het besturingsysteem (linux of windows of wat anders) de UDP checksums uitrekenen voor je.

Ook dat VT310 ding lijkt me iets waar je niet ZELF de UDP checksum in hoeft te programmeren.

@rew: Als ik zo naar dat voorbeeld kijk, dan wordt de output van dat ding terminated met cr/lf. In de UDP-context, is deze CRC dus payload en heeft niks met de UDP (of IP) data-integrity checks te maken.

Ik kon er in 5 klikken geen manual van vinden en heb verder geen moeite gedaan :)

Die sites heb ik zeker al gezien, ik ben nog niet heel bekend is het werken net data overdracht, heb ooit wel eens een projectje gemaakt met een eigen verzonnen protocol, maar ben nu gebonden aan het vaste protocol van het apparaat.

Met die sites werdt ik nog niet wijzer, ik heb al zoveel zitten reken met de getallen, maar ik kom niet uit de formule om het te berekenen.

Heb hier een handleiding:
http://alarmasgsm.mx/manuales/1345917404_VT310_User_Guide_V7.4.pdf

En hier het protocol:
http://www.ertengtec.com/UploadFiles/2010819152713674.pdf

Een CRC berekenen is niet heel moeilijk, maar je moet wel de juiste polynominaal weten; volgens de CRC-CCITT pagina op sourceforge(http://srecord.sourceforge.net/crc16-ccitt.html) waar ErikP ook al naar linkte, is dat 0x1021, en daar staat zelfs een complete implementatie in C bij. Heb je die al geprobeerd?

Ik meen me te herinneren dat de berichtlengte soms wordt uitgevuld (met 0x00?) tot het een veelvoud is van de lengte van de CRC code. Je hebt nu een oneven aantal bytes in je bericht; het wel of niet toevoegen van een byte 0x00 veranderd de CRC code.

hoe kom ik achter de juiste polynominaal? Staat niet in de datasheet.

De CCITT-CRC16 polynomial is 0x(1)1021. De 0xFFFF betekent, dat je de checksum bytes moet initialiseren met 0xFFFF voordat je begint. (i.p.v. 0x0000)

hoe kom ik achter de juiste polynominaal? Staat niet in de datasheet.

Als je de moeite had gedaan om hier te kijken... Dan had je gezien dat met jouw data de uitkomst daar hetzelfde is als in je voorbeeld.

Als je ook hier gekeken zou hebben, dan zou je het volgende gelezen kunnen hebben:

  • Width = 16 bits
  • Truncated
  • polynomial = 0x1021
  • Initial value = 0xFFFF
  • Input data is NOT reflected
  • Output CRC is NOT reflected
  • No XOR is performed on the output CRC

Het is geen rocket science. Maar een beetje eigen inzet is wel vereist.

Ik steek echt de moeite er wel in, maar ik kom er gewoon niet uit, het is de eerste keer dat ik met een checksum werk. Iedereen zegt dat het zo simpel is, maar wat ik ook uitreken is kom niet op het zelfde uit wat ze in de datasheet hebben meegegeven.

Als het dan toch zo simpel schijnt te zijn, zou iemand de formule kunnen opschrijven om mijn voorbeeld uit te rekenen. Als ik de formule heb kom ik er uit, maar met die links, die ik allemaal overigens zelf ook al had gevonden kom ik er blijkbaar nog steeds niet uit, of ik doe iets fout.

Dit staat in me datasheet:
2 bytes. It indicates CRC-CCITT (default is 0xffff) checksum of all data (not including CRC itself and the ending character). It is in hex code.
For example:
24 24 00 11 13 61 23 45 67 8f ff 50 00 05 d8 0d 0a
0x05d8 = CRC-CCITT (24 24 00 11 13 61 23 45 67 8f ff 50 00)

Je bent bezig met CRC, niet met checksum.
Daar is geen formule voor, de lengte van de input ligt niet vast.

2 tellen zoeken, leverde dit op. En anders zoek je zelf eens naar 'CRC CCITT php'. Wellicht levert het wat op?!

Had nog een oude routine in Powerbasic liggen, nooit geoptimaliseerd, want maar 1x nodig gehad... (it did the trick... :) )
Hier staat ook nog een (zeer) uitgebreid stuk over CRC: http://www.zlib.net/crc_v3.txt


#Compile Exe
#Dim All
'
%POLY_CRC16_CCITT   = &H00001021
%INITIALSEED        = &H000084CF  'Nondirect, direct = &h0000FFFF

Function Crc_16(dStr As String) As Word
  Local Cnt As Long, Buff As String, Crc As Word, CrcData As Dword
  For Cnt = 1 To Len(dStr)                                              'Make binary string
    Buff = Buff & Bin$(Asc(dStr, Cnt), 8)                               '
  Next                                                                  '
  Buff = Buff & String$(16, "0")                                        'Add zeros to end
  CrcData = %INITIALSEED                                                '
  For Cnt = 1 To Len(Buff)                                              '
    Shift Left CrcData, 1                                               'Process all bytes.
    Bit Calc CrcData, 0, (Mid$(Buff,Cnt,1) = "1")                       'If bit 16 is set,
    If (Bit (CrcData, 16)) Then CrcData = CrcData Xor %POLY_CRC16_CCITT 'then xor with the
  Next                                                                  'polynomial.
  Function = CrcData                                                    '
End Function

'===================================================================
Function PBMain () As Long
  MsgBox "CRC-16 of string 2424001113612345678fff5000 is:   0x" & Hex$(Crc_16(Chr$(&h24,&h24,&h00,&h11,&h13,&h61,&h23,&h45,&h67,&h8f,&hff,&h50,&h00)),4),,"Result: "
End Function