0
点赞
收藏
分享

微信扫一扫

物联网项目-通讯协议之 C语言版 STM32

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;
}

举报

相关推荐

0 条评论