0、背景
本项目物联网通讯协议参考国标车联网协议,编写c语言版本供后期单片机使用。
1、车联网组包格式C语言版本
#include <stdio.h>
#include <string.h>
#include <malloc.h>
//字节数组转为16进制字符串01
void ByteToHexStr01(const unsigned char* source, char* dest, int sourceLen)
{
short i;
unsigned char highByte, lowByte;
for (i = 0; i < sourceLen; i++)
{
highByte = source[i] >> 4;
lowByte = source[i] & 0x0f;
highByte += 0x30;
if (highByte > 0x39)
dest[i * 2] = highByte + 0x07;
else
dest[i * 2] = highByte;
lowByte += 0x30;
if (lowByte > 0x39)
dest[i * 2 + 1] = lowByte + 0x07;
else
dest[i * 2 + 1] = lowByte;
}
//printf("out = %s\n", dest);
}
int HexStrToByteBCC(const char* source/*, unsigned char* dest*/, int sourceLen)
{
unsigned char * dest = (char*)malloc((sourceLen + 1) / 2);
short i;
unsigned char highByte, lowByte;
int aubChecksum = 0;
for (i = 0; i < sourceLen; i += 2)
{
highByte = toupper(source[i]);
lowByte = toupper(source[i + 1]);
if (highByte > 0x39)
highByte -= 0x37;
else
highByte -= 0x30;
if (lowByte > 0x39)
lowByte -= 0x37;
else
lowByte -= 0x30;
dest[i / 2] = (highByte << 4) | lowByte;
aubChecksum ^= dest[i / 2];
//printf("%d\n", dest[i / 2]);
}
free(dest);
dest = NULL;
//printf("aubChecksum:%d\n", aubChecksum);
return aubChecksum;
}
void HexStrToByte(const char* source, unsigned char* dest, int sourceLen)
{
//unsigned char * dest = (char*)malloc((sourceLen + 1) / 2);
short i;
unsigned char highByte, lowByte;
int aubChecksum = 0;
for (i = 0; i < sourceLen; i += 2)
{
highByte = toupper(source[i]);
lowByte = toupper(source[i + 1]);
if (highByte > 0x39)
highByte -= 0x37;
else
highByte -= 0x30;
if (lowByte > 0x39)
lowByte -= 0x37;
else
lowByte -= 0x30;
dest[i / 2] = (highByte << 4) | lowByte;
//aubChecksum ^= dest[i / 2];
//printf("%d\n", dest[i / 2]);
}
//free(dest);
//dest = NULL;
//printf("aubChecksum:%d\n", aubChecksum);
//return aubChecksum;
}
/*int CalculateChecksum(char *aubData_p, int auwDataLength)
{
int aubChecksum = 0x0;
int auwCnt = 0;
while (auwCnt < auwDataLength)
{
aubChecksum ^= toupper(aubData_p[auwCnt]);
auwCnt++;
}
return aubChecksum;
}*/
char * loginpack() {
char head_hex[] = "2323";
char cmd_hex_01[] = "01FE";
char clientid[] = "ken_ji_jian";
char clientidArr[50] = { 0 };
ByteToHexStr01(clientid, clientidArr, strlen(clientid));
char * cmd_hex = (char*)malloc(sizeof(char)*(strlen(cmd_hex_01) + strlen(clientidArr) + 3));
sprintf(cmd_hex, "%s%s%s", cmd_hex_01, clientidArr, "01");
printf("cmd_hex:[%s]\n", cmd_hex);
char datetime[] = "191029132425";
char datetime_hex[13] = {0};
char loginCount[8] = {0};
sprintf(datetime_hex, "%02X%02X%02X%02X%02X%02X", 19,10,29,13,24,25);
//HexStrToByte(datetime, datetime_hex, strlen(datetime));
//ByteToHexStr01(datetime, datetime_hex, strlen(datetime));
printf("datetime:[%s]\n", datetime_hex);
long count = 2001;
sprintf(loginCount, "%04X", count);
printf("login count:[%04X]\n", count);
char iccid[] = "898600MFSSYYGXXXXXXP";
char iccid_hex[100] = {0};
ByteToHexStr01(iccid, iccid_hex, strlen(iccid));
printf("iccid:[%s]\n", iccid_hex);
char * monitflag = "110000";
char monitflag_hex[14] = {0};
ByteToHexStr01(monitflag, monitflag_hex, strlen(monitflag));
printf("monitflag:[%s]\n", monitflag_hex);
int datalength = strlen(datetime_hex) + strlen(loginCount) + strlen(iccid_hex) + strlen(monitflag_hex);
char datalength_hex[8] = {0};
sprintf(datalength_hex, "%04X", datalength);
char * data_hex = (char*)malloc(datalength + 1);
sprintf(data_hex, "%s%s%s%s", datetime_hex, loginCount, iccid_hex, monitflag_hex);
printf("datalenth:[%04X]\n", datalength);
char * bcc_data_hex = (char*)malloc(strlen(cmd_hex) + strlen(datalength_hex) + strlen(data_hex) + 1);
sprintf(bcc_data_hex, "%s%s%s", cmd_hex, datalength_hex, data_hex);
printf("bcc_hex:[%s]\n", bcc_data_hex);
//int bcc_byte[200] = {0};
//char * bcc_byte = (int*)malloc((strlen(bcc_hex) + 1) / 2);
int result = HexStrToByteBCC(bcc_data_hex, strlen(bcc_data_hex));
char * bcc_hex = (char*)malloc(3);
sprintf(bcc_hex, "%02X", result);
//string s = head + cmd + dataLength + data + check;
//printf("bcc:%s\n", bcc_hex);
char * pack = (char*)malloc(strlen(head_hex) + strlen(cmd_hex) + strlen(datalength_hex) + strlen(data_hex) + strlen(bcc_hex) + 1);
sprintf(pack, "%s%s%s%s%s", head_hex, cmd_hex, datalength_hex, data_hex, bcc_hex);
free(cmd_hex);
cmd_hex = NULL;
free(data_hex);
data_hex = NULL;
free(bcc_data_hex);
bcc_data_hex = NULL;
free(bcc_hex);
bcc_hex = NULL;
return pack;
}
char * postpack(float temper, float humidity) {
char head_hex[] = "2323";
char cmd_hex_01[] = "02FE";
char clientid[] = "ken_ji_jian";
char clientidArr[50] = { 0 };
ByteToHexStr01(clientid, clientidArr, strlen(clientid));
char * cmd_hex = (char*)malloc(strlen(cmd_hex_01) + strlen(clientidArr) + 3);
sprintf(cmd_hex, "%s%s%s", cmd_hex_01, clientidArr, "01");
printf("[%s]\n", cmd_hex);
//char datetime[] = { '19','10','29','13','24','25' };//"191029132425";
char datetime_hex[100] = { 0 };
//char loginCount[8] = { 0 };
//ByteToHexStr01(datetime, datetime_hex, strlen(datetime));
sprintf(datetime_hex, "%02X%02X%02X%02X%02X%02X", 19, 10, 29, 13, 24, 25);
printf("datetime:[%s]\n", datetime_hex);
char monit_data_hex[20] = {0};
char temperArray[4], humidityArray[4] = {0};
char temperHex[8], humidityHex[8] = { 0 };
sprintf(temperArray, "%04.1f", temper);
sprintf(humidityArray, "%04.1f", humidity);
ByteToHexStr01(temperArray, temperHex, strlen(temperArray));
ByteToHexStr01(humidityArray, humidityHex, strlen(humidityArray));
sprintf(monit_data_hex, "01%s02%s", temperHex, humidityHex);
printf("monit:[%s]", monit_data_hex);
int datalength = strlen(datetime_hex) + strlen(monit_data_hex);
char datalength_hex[8] = { 0 };
sprintf(datalength_hex, "%04X", datalength);
char * data_hex = (char*)malloc(datalength + 1);
sprintf(data_hex, "%s%s", datetime_hex, monit_data_hex);
printf("datalenth:[%04X]\n", datalength);
char * bcc_data_hex = (char*)malloc(strlen(cmd_hex) + strlen(datalength_hex) + strlen(data_hex) + 1);
sprintf(bcc_data_hex, "%s%s%s", cmd_hex, datalength_hex, data_hex);
printf("bcc_hex:[%s]\n", bcc_data_hex);
//int bcc_byte[200] = {0};
//char * bcc_byte = (int*)malloc((strlen(bcc_hex) + 1) / 2);
int result = HexStrToByteBCC(bcc_data_hex, strlen(bcc_data_hex));
char * bcc_hex = (char*)malloc(3);
sprintf(bcc_hex, "%02X", result);
//string s = head + cmd + dataLength + data + check;
printf("bcc:%s\n", bcc_hex);
char * pack = (char*)malloc(strlen(head_hex) + strlen(cmd_hex) + strlen(datalength_hex) + strlen(data_hex) + strlen(bcc_hex) + 1);
sprintf(pack, "%s%s%s%s%s", head_hex, cmd_hex, datalength_hex, data_hex, bcc_hex);
free(cmd_hex);
free(data_hex);
free(bcc_data_hex);
free(bcc_hex);
cmd_hex = NULL;
data_hex = NULL;
bcc_data_hex = NULL;
bcc_hex = NULL;
return pack;
}
int main(void)
{
char * result = loginpack();
printf("main-result:[%s]\n", result);
free(result);
result = NULL;
char * result2 = postpack(28.5, 34.7);
printf("main-result2:[%s]\n", result2);
free(result2);
result2 = NULL;
return 0;
}