#include #include #define MAX_PACKETS 12 // 最大包数量 #define MAX_PACKET_LEN 128 // 单个包的最大长度 typedef struct { unsigned char data[MAX_PACKET_LEN]; // 包的数据 int length; // 包的长度(包括帧头和校验和) int data_length; // 数据部分的长度(不包括帧头和校验和) int valid; // 校验是否通过 } Packet; typedef struct { Packet packets[MAX_PACKETS]; // 解析出的包数组 int count; // 解析出的包数量 int valid_count; // 校验通过的包数量 } PacketResult; // 计算校验和并验证 int verify_checksum(const unsigned char* packet_data, int length) { if (length < 3) return 0; // 至少要有帧头+1数据+1校验和 unsigned char calculated_checksum = 0; // 从帧头开始计算到倒数第二个字节的和 for (int i = 0; i < length - 1; i++) { calculated_checksum += packet_data[i]; } // 对256取余 calculated_checksum %= 256; // 比较计算值和包中的校验和(最后一个字节) return (calculated_checksum == packet_data[length - 1]); } void parse_packets(const unsigned char* hex_array, int array_length, PacketResult* result) { result->count = 0; result->valid_count = 0; int start_index = -1; for (int i = 0; i < array_length - 1 && result->count < MAX_PACKETS; i++) { if (hex_array[i] == 0x55 && hex_array[i + 1] == 0xAA) { if (start_index != -1) { // 保存上一个包的信息 int packet_length = i - start_index; if (packet_length > MAX_PACKET_LEN) { packet_length = MAX_PACKET_LEN; // 截断超长包 } // 复制数据 memcpy(result->packets[result->count].data, hex_array + start_index, packet_length); // 设置包信息 result->packets[result->count].length = packet_length; result->packets[result->count].data_length = packet_length - 3; // 减去帧头和校验和 // 验证校验和 result->packets[result->count].valid = verify_checksum( result->packets[result->count].data, packet_length); if (result->packets[result->count].valid) { result->valid_count++; } result->count++; } start_index = i; } } // 处理最后一个包 if (start_index != -1 && start_index < array_length && result->count < MAX_PACKETS) { int packet_length = array_length - start_index; if (packet_length > MAX_PACKET_LEN) { packet_length = MAX_PACKET_LEN; } // 复制数据 memcpy(result->packets[result->count].data, hex_array + start_index, packet_length); // 设置包信息 result->packets[result->count].length = packet_length; result->packets[result->count].data_length = packet_length - 3; // 验证校验和 result->packets[result->count].valid = verify_checksum( result->packets[result->count].data, packet_length); if (result->packets[result->count].valid) { result->valid_count++; } result->count++; } } void usr_tuya_data_ana(const unsigned char* data,int len); void usr_mcu_data_recieve(const unsigned char* hex_array, int array_length) { PacketResult result; parse_packets(hex_array,array_length,&result); printf("Total packets parsed: %d\n", result.count); printf("Valid packets: %d\n", result.valid_count); for (int i = 0; i < result.count; i++) { printf("\nPacket %d: Length=%d, Data Length=%d, Valid=%s\n", i+1, result.packets[i].length, result.packets[i].data_length, result.packets[i].valid ? "Yes" : "No"); if (result.packets[i].valid) { printf("Data: "); printf_buf(result.packets[i].data, result.packets[i].length); usr_tuya_data_ana(result.packets[i].data,result.packets[i].length); printf("\n"); } else { printf("Invalid checksum - Packet ignored\n"); } } } //void usr_set_fool_val(unsigned char wei_cnt); extern void usr_data_notify_auto(); extern unsigned char usr_weishi_type; extern unsigned char usr_weishi_fenshu; extern void usr_weishi_notify(); extern unsigned char usr_led_on_flag; void usr_tuya_data_ana(const unsigned char* data,int len) { switch(data[6])///DP ID { case 0x01:///喂食计划 break; case 0x02:///一键喂食 break; case 0x03:///手动喂食 break; case 0x04:///喂食状态 switch(data[10]) { case 0x00:///就绪 usr_weishi_type=0; usr_weishi_fenshu=1; usr_data_notify_auto(); break; case 0x01:///正在喂食 // usr_set_fool_val(usr_weishi_fenshu); // usr_weishi_notify(); break; case 0x02:///喂食结束 usr_weishi_type=0; usr_weishi_fenshu=1; break; default: break; } break; case 0x0a:///电池电量 ///电池电量=data[13]; break; case 0x0b:///充电状态 ///充电状态=data[10] break; case 0x0d:///故障上报 ///故障=data[10] /* bit0:food_jam bit1:food_shortages bit2:food_run_out bit3:desiccant bit4:battery_low bit5:device_stuck */ break; case 0x0e:///喂食结果上报 break; case 0x11:///状态指示灯应答 ///LED开关=data[10] usr_led_on_flag=data[10]; break; case 0x17:///慢放投喂 break; case 0x18:///恢复出厂设置应答 break; case 0x1c:///MCU获取BLE模块的本地时间 break; default: break; } } /* int ana_demo() { // 示例数据 unsigned char hex_data[] = { 0x55, 0xAA, 0x03, 0x07, 0x00, 0x0E, 0x01, 0x00, 0x00, 0x0A, 0x7F, 0x0F, 0x26, 0x01, 0x01, 0x7F, 0x0F, 0x28, 0x01, 0x01, 0x90, 0x55, 0xAA, 0x03, 0x07, 0x00, 0x08, 0x03, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x1B, 0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x04, 0x04, 0x00, 0x01, 0x00, 0x17, 0x55, 0xAA, 0x03, 0x07, 0x00, 0x08, 0x0A, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x21, 0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x0D, 0x05, 0x00, 0x01, 0x00, 0x21, 0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x11, 0x01, 0x00, 0x01, 0x01, 0x22, 0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x17, 0x01, 0x00, 0x01, 0x00, 0x87, 0x55, 0xAA, 0x03, 0x1C, 0x00, 0x00, 0x17 }; int data_length = sizeof(hex_data) / sizeof(hex_data[0]); PacketResult result; parse_packets(hex_data, data_length, &result); printf("Total packets parsed: %d\n", result.count); printf("Valid packets: %d\n", result.valid_count); for (int i = 0; i < result.count; i++) { printf("\nPacket %d: Length=%d, Data Length=%d, Valid=%s\n", i+1, result.packets[i].length, result.packets[i].data_length, result.packets[i].valid ? "Yes" : "No"); if (result.packets[i].valid) { printf("Data: "); printf_buf(result.packets[i].data, result.packets[i].length); printf("\n"); } else { printf("Invalid checksum - Packet ignored\n"); } } return 0; } */