convert function from c to b4j

victormedranop

Well-Known Member
Licensed User
Longtime User
Hi i need to convert this function to use it on a b4j non ui aplication

B4X:
achment 1 CRC-ITU Algorithm in C (Fragments) static const U16 crctab16[] = { 0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, 0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E, 0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876, 0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD, 0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5, 0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C, 0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974, 0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB, 0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3, 0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A, 0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72, 0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1, 0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738, 0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70, 0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7, 0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF, AM01 Communication Protocol 36 Shenzhen Concox Information Technology Co., Ltd 0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036, 0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E, 0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5, 0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD, 0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134, 0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C, 0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3, 0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB, 0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232, 0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A, 0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1, 0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9, 0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78, }; 
// Calculate 16-bit CRC of the given-length data. 
U16 GetCrc16(const U8* pData, int nLength) { 
U16 fcs = 0xffff; 
// Initialize while(nLength>0)
{
 fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff]; nLength--; pData++; 
} 
return ~fcs; // Negate } 3.2
 

JordiCP

Expert
Licensed User
Longtime User
B4X:
Sub GetCRC16( pData() As Byte, nLength As Int) As Short
    
    Dim crctab16() As Short = Array As Short( _
        0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, _
        0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E, 0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876, _
        0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD, 0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5, _
        0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C, 0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974, _
        0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB, 0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3, _
        0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A, 0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72, _
        0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1, _
        0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738, 0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70, _
        0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7, 0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF, _
        0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036, 0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E, _
        0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5, 0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD, _
        0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134, 0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C, _
        0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3, 0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB, _
        0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232, 0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A, _
        0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1, 0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9, _
        0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78 _
    )
    
    Dim fcs As Short = 0xFFFF            'U16 fcs = 0xffff;
    
    For k=0 To nLength-1     
        ' fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff]; nLength--; pData++;
        fcs = Bit.Xor( _
            Bit.And( Bit.ShiftRight(fcs, 8), 0xFF), _
            crctab16( Bit.And( Bit.Xor(fcs, pData(k)), 0xFF)) _
        )
    Next    

    fcs = Bit.Xor(fcs, 0xFFFF)        ' negate

    Return fcs
    
End Sub


' For validation purposes
Sub testCRC
    
    Dim data() As Byte = Array As Byte(0x01, 0x11)    'expected result 0x1797 (https://stackoverflow.com/questions/36395142/crc16-itu-proof)
    Dim res(1) As Short
    res(0) = GetCRC16(data, 2)        
    Dim bc As ByteConverter
    Log( bc.HexFromBytes(bc.ShortsToBytes( res)) )
    
End Sub
 

emexes

Expert
Licensed User
JordiCP pipped me at the finish line, and his code looks better (but very similar, which bodes well). Nonetheless, here's what I almost won the race with, in case there's something useful in it:

Not quite sure how that C code's going to go, what with the loop commented out, but heck, I'll get you pointed in the right direction.
B4X:
'''achment 1 CRC-ITU Algorithm in C (Fragments)

'''static const U16 crctab16[] = {

'probably have to put this into process variables sub, or into GetCrc16 function
Dim crctab() as Int = ( _
    0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, _
    0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E, 0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876, _
    0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD, 0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5, _
    0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C, 0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974, _
    0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB, 0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3, _
    0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A, 0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72, _
    0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1, _
    0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738, 0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70, _
    0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7, 0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF, _
    0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036, 0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E, _
    0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5, 0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD, _
    0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134, 0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C, _
    0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3, 0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB, _
    0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232, 0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A, _
    0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1, 0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9, _
    0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78 _
)

'not sure why this comment was embedded in the above data:
'AM01 Communication Protocol 36 Shenzhen Concox Information Technology Co., Ltd

'Calculate 16-bit CRC of the given-length data.
'U16 GetCrc16(const U8* pData, int nLength) {

Sub GetCrc16(pData() As Byte, nLength As Int)    'don't really need nLength if can use pData.Length

    '''U16 fcs = 0xffff;
    Dim fcs As Int = 0xFFFF

    '''// Initialize while(nLength>0)
    '''{
    For I = 0 To nLength - 1

        '''fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];

        'split into two steps to make it (slightly) easier to see what's going on:

        'first calculate the index into the crctab array
        Dim Temp As Int = Bit.And( Bit.Xor(fcs, pData(I)), 0xFF)    'the bitwise And conveniently unsigns the Bytes too - bonus!

        'then shift the crc by one byte and merge in the crctab value
        fcs = Bit.Xor( Bit.ShiftRight(fcs, 8), crctab(Temp))
    
        'not sure if crctab interpreted 16-bit hex numbers as signed 32-bit numbers, so just in case:
        fcs = Bit.And(fcs, 0xFFFF)

        ''' nLength--; pData++;
        'not needed since done by For loop

    '''}
    Next I

    '''return ~fcs; // Negate } 3.2

    'looks like a complement rather than a negate, but I'll leave that for you to check out
    Return b.Not(fcs)

'''}
End Sub
 
Last edited:

victormedranop

Well-Known Member
Licensed User
Longtime User
let me check, this for a gps, that must login to a services.

JordiCP pipped me at the finish line, and his code looks better (but very similar, which bodes well). Nonetheless, here's what I almost won the race with, in case there's something useful in it:

Not quite sure how that C code's going to go, what with the loop commented out, but heck, I'll get you pointed in the right direction.
B4X:
'''achment 1 CRC-ITU Algorithm in C (Fragments)

'''static const U16 crctab16[] = {

'probably have to put this into process variables sub, or into GetCrc16 function
Dim crctab() as Int = ( _
    0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, _
    0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E, 0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876, _
    0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD, 0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5, _
    0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C, 0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974, _
    0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB, 0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3, _
    0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A, 0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72, _
    0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1, _
    0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738, 0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70, _
    0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7, 0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF, _
    0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036, 0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E, _
    0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5, 0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD, _
    0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134, 0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C, _
    0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3, 0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB, _
    0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232, 0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A, _
    0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1, 0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9, _
    0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78 _
)

'not sure why this comment was embedded in the above data:
'AM01 Communication Protocol 36 Shenzhen Concox Information Technology Co., Ltd

'Calculate 16-bit CRC of the given-length data.
'U16 GetCrc16(const U8* pData, int nLength) {

Sub GetCrc16(pData() As Byte, nLength As Int)    'don't really need nLength if can use pData.Length

    '''U16 fcs = 0xffff;
    Dim fcs As Int = 0xFFFF

    '''// Initialize while(nLength>0)
    '''{
    For I = 0 To nLength - 1

        '''fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];

        'split into two steps to make it (slightly) easier to see what's going on:

        'first calculate the index into the crctab array
        Dim Temp As Int = Bit.And( Bit.Xor(fcs, pData(I)), 0xFF)    'the bitwise And conveniently unsigns the Bytes too - bonus!

        'then shift the crc by one byte and merge in the crctab value
        fcs = Bit.Xor( Bit.ShiftRight(fcs, 8), crctab(Temp))
   
        'not sure if crctab interpreted 16-bit hex numbers as signed 32-bit numbers, so just in case:
        fcs = Bit.And(fcs, 0xFFFF)

        ''' nLength--; pData++;
        'not needed since done by For loop

    '''}
    Next I

    '''return ~fcs; // Negate } 3.2

    'looks like a complement rather than a negate, but I'll leave that for you to check out
    Return b.Not(fcs)

'''}
End Sub
 

victormedranop

Well-Known Member
Licensed User
Longtime User
try without any luke with this

the service must respond. i try it with golang and i can identify the login package but missing the response.
take a look of the golang file



B4X:
Private Sub AStream_NewData (Buffer() As Byte)
    
    
    
    Dim s As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
    Log($"Result  1=>  ${s}"$)
    Try
        Dim m As int
        m = GetCrc16(0x11) 'here is the error 
        Dim f() As Int = Array As Int (0xf8,0xf8,0x05,0x01,m,0X0d,0X0a)
        
        SendData(f)

    Catch
        Log(LastException)
    End Try

End Sub

Sub GetCrc16(pData() As Byte) As int

    Dim fcs As Int = 0xFFFF
    For I = 0 To pData.Length - 1
        Dim Temp As Int = Bit.And( Bit.Xor(fcs, pData(I)), 0xFF)
        fcs = Bit.Xor( Bit.ShiftRight(fcs, 8), crctab(Temp))
        fcs = Bit.And(fcs, 0xFFFF)
    Next
    Return fcs
End Sub


golang script


B4X:
_a := new(bytes.Buffer)
    _len := uint8(5)
    binary.Write(_a, binary.LittleEndian, _len)
    binary.Write(_a, binary.LittleEndian, []byte{0x01})
    binary.Write(_a, binary.LittleEndian, login.InfoSN)
    //_cs := GetCrc16(_a.Bytes())
    _cs := GetCrc16(_a.Bytes())
    data := new(bytes.Buffer)
    binary.Write(data, binary.LittleEndian, []byte{0x78, 0x78})
    binary.Write(data, binary.LittleEndian, _a.Bytes())
    binary.Write(data, binary.LittleEndian, _cs)
    binary.Write(data, binary.LittleEndian, []byte{0x0d, 0x0a})


fmt.Println("Sending -> ",data)
        fmt.Println("Sending -> ", data.Bytes())
        i, errc := conn.Write(data.Bytes())
        if errc != nil {
            fmt.Println(errc)
            os.Exit(1)
        }



func GetCrc16(pData []uint8) uint16 {
    fcs := uint16(0xffff)
    for _, d := range pData {
        fcs = (fcs >> 8) ^ crctab16[(fcs^uint16(d))&0xff]
    }
    return ^fcs
}
 

Attachments

  • uno.png
    uno.png
    34.2 KB · Views: 178

emexes

Expert
Licensed User
The GetCrc16 function is expecting an array:
B4X:
Sub GetCrc16(pData() As Byte) As int

but you are giving it a single number (aka scalar):
B4X:
m = GetCrc16(0x11) 'here is the error
 
Last edited:

victormedranop

Well-Known Member
Licensed User
Longtime User
i havent found the proper way to answer to device.


0x01: "Login",
0x22: "GPS location packet (UTC)",
0x23: "Heartbeat packet",
0x21: "Return packet (from terminal)",
0x26: "Alarm data (UTC)",
0x2A: "GPS address request packet (UTC)",
0x28: "LBS extended information packet",
0x17: "LBS address request packet ",
0x80: "Online command",
0x8A: "Time calibration packet",
0x95: "Information transfer packet",
//0x17: "Chinese address packet", // TODO: repetida
0x97: "English address packet",


with golang i could decode the pacage but i try to response like the document said but nothing happend.

can anyone of you can hel me with the initial login data. i already posted in the forum "job offers"

with donation include.
 

Attachments

  • ACFrOgCT_z6t95WbDCKezsMxZRE3wAw0Xp-OpTx735LsAQHRDb80i84_K7EwqjkxmL-ktGzMhnV5qhpohjOrKXGgTo-8Es...pdf
    262 KB · Views: 485

victormedranop

Well-Known Member
Licensed User
Longtime User
Hola JordiCP, Perdona que te molestes y si tienes alo de tiempo. Cual seria la propia manera de decodificar e}los paquetes ya puedo identificar el Imei de los dispositivos pero
aun trato de ver string tu bytes y todo eso pero no he tenido buenos resultados.

Aqui te dejo un ejempl, tanto en hex como en binario

Protocol number -> 35
Incoming frame binary: 01111000011110000000101100100011100000000000000110010111000000100000000000000010000000000000100101101110000000110000110100001010
Incoming frame hex : 78780B2380019702000200096E030D0A


Protocol number -> 1
01111000011110000001000100000001000000110101011101011001000100010000000000010010011000000010010110000000000001100001100100001001000000000101011100011001101000010000110100001010
Incoming frame: 78781101035759110012602580061909005719A10D0A
login protocol Imei -> 0357591100126025 ip new conn -> 190.8.32.219 date 03/22/2021 15:05:20
011110000111100000001010000100111000000001010101000000100000000000000010000000000101100000101011011110010000110100001010
 

JordiCP

Expert
Licensed User
Longtime User
Protocol number -> 35
Incoming frame binary: 01111000011110000000101100100011100000000000000110010111000000100000000000000010000000000000100101101110000000110000110100001010
Incoming frame hex : 78780B2380019702000200096E030D0A
(Hi Victor, you wrote in the forum ;))

You only need hex conversion, in this case binary does not help

78 78 --> Frame preamble
0B --> It says that in total there are 11 bytes ( Procol number(1 byte) + msg.content (6 bytes) + SN (2) + CRC16 (2 bytes) )
23 80 01 97 02 00 02 00 09 6E 03 --> the 11 above defined message bytes. the first is 23h, that is msg #35
23h : protocol number = 35​
80 01 97 02 00 02: 6 bytes --> data to be interpreted according to the protocol (*)​
00 09: SN. don't have to worry about this one, is automatically increased by the sender on each transmission​
6E 03 --> CRC16​
0D 0A --> Frame terminator.

(*) It's strange. If I reade it correctly, cccording to the docs, 23h is heartbeat (although there seems to be a typo in the documentation where it says that the heartbeat sent by the terminal is 0x13, and it only adds 10 data bytes, not 11 to the frame) --> Are you sure that the doc that you attached corresponds to the same version as your device?
 
Last edited:
Top