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.
EricP
mét CE
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
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.
EricP
mét CE
@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
SparkyGSX
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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)
EricP
mét CE
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)
EricP
mét CE
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?!
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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