Files
bishe-STM32/User/main_encrypted_example.c
T
2026-05-01 11:15:54 +08:00

195 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* main.c 示例修改(方案C - AES加密版本)
*
* 修改要点:
* 1. 包含加密库头文件
* 2. 初始化加密模块
* 3. 使用HTTP连接替代TCP
* 4. 签到时加密JSON数据
*/
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "K210_USART.h"
#include "esp8266.h" // 使用新版驱动
#include "Buzzer_LED.h"
#include "Attendance.h"
#include "Crypto.h" // ← 新增:加密模块
#include <stdio.h>
#include <string.h>
/* ========== 用户配置区域 ========== */
const char* WIFI_SSID = "Your_WiFi_Name"; // 修改为你的WiFi名称
const char* WIFI_PASSWORD = "Your_WiFi_Password"; // 修改为你的WiFi密码
const char* HTTP_SERVER_IP = "192.168.1.100"; // 修改为服务器IP
const char* HTTP_SERVER_PORT = "8082"; // HTTP端口(8082)
// 全局变量
uint8_t server_connected = 0;
// 初始化系统
void System_Init(void)
{
OLED_Init();
Serial_Init();
K210_USART_Init();
Buzzer_LED_Init();
Attendance_Init();
Crypto_Init(); // ← 新增:初始化加密模块
OLED_ShowString(1, 1, "Face Attendance");
OLED_ShowString(2, 1, "System Starting");
OLED_ShowString(3, 1, "Please wait...");
}
// 连接WiFi和服务器
uint8_t ConnectToServer(void)
{
OLED_Clear();
OLED_ShowString(1, 1, "Connecting WiFi");
// 1. 初始化ESP8266
if (ESP8266_Setup() == 0) {
OLED_ShowString(2, 1, "ESP8266 Failed!");
return 0;
}
// 2. 连接WiFi
OLED_ShowString(2, 1, "WiFi...");
if (ESP8266_ConnectWiFi(WIFI_SSID, WIFI_PASSWORD) == 0) {
OLED_ShowString(2, 1, "WiFi Failed!");
return 0;
}
OLED_ShowString(2, 1, "WiFi OK!");
Delay_ms(500);
// 3. 连接HTTP服务器(使用新函数)
OLED_ShowString(3, 1, "Server...");
if (ESP8266_ConnectHTTPServer(HTTP_SERVER_IP, HTTP_SERVER_PORT) == 0) {
OLED_ShowString(3, 1, "Server Failed!");
return 0;
}
OLED_ShowString(3, 1, "Server OK!");
Delay_ms(500);
return 1;
}
// 处理签到(加密版本)
void ProcessCheckIn(const char* student_id, const char* name, float confidence)
{
char json_data[256];
char encrypted_data[512];
// 1. 构建JSON数据
sprintf(json_data,
"{\"student_id\":\"%s\",\"name\":\"%s\",\"confidence\":%.2f,\"status\":\"success\"}",
student_id, name, confidence);
printf("[CHECKIN] JSON: %s\r\n", json_data);
// 2. 加密JSON数据
uint32_t encrypted_len = Crypto_EncryptJSON(json_data, encrypted_data);
if (encrypted_len == 0) {
printf("[ERROR] Encryption failed!\r\n");
Buzzer_Beep(BEEP_FAIL);
OLED_ShowString(4, 1, "Encrypt Error!");
return;
}
printf("[CRYPTO] Encrypted length: %u\r\n", encrypted_len);
printf("[CRYPTO] Encrypted data: %s\r\n", encrypted_data);
// 3. 发送加密数据到服务器
if (ESP8266_SendEncryptedData(encrypted_data) == 1) {
printf("[OK] Data sent successfully\r\n");
Buzzer_Beep(BEEP_SUCCESS);
OLED_Clear();
OLED_ShowString(1, 1, "Check-in OK!");
OLED_ShowString(2, 1, "ID:");
OLED_ShowString(2, 4, student_id);
OLED_ShowString(3, 1, name);
} else {
printf("[ERROR] Send failed\r\n");
Buzzer_Beep(BEEP_FAIL);
OLED_ShowString(4, 1, "Send Failed!");
}
Delay_ms(2000);
OLED_Clear();
OLED_ShowString(1, 1, "Ready...");
}
int main(void)
{
System_Init();
printf("\r\n========================================\r\n");
printf(" STM32 Face Recognition System\r\n");
printf(" With AES-128-CBC Encryption\r\n");
printf("========================================\r\n");
// 连接服务器
if (ConnectToServer()) {
server_connected = 1;
OLED_Clear();
OLED_ShowString(1, 1, "System Ready!");
OLED_ShowString(2, 1, "Encrypted Mode");
printf("[INFO] Server connected!\r\n");
} else {
OLED_Clear();
OLED_ShowString(1, 1, "Connection");
OLED_ShowString(2, 1, "Failed!");
printf("[ERROR] Connection failed!\r\n");
}
Delay_ms(1000);
OLED_Clear();
OLED_ShowString(1, 1, "Please scan");
OLED_ShowString(2, 1, "your face...");
// 主循环
while (1) {
// 处理K210识别结果
if (K210_GetRxFlag()) {
char* k210_data = K210_GetRxData();
printf("[K210] %s\r\n", k210_data);
// 解析K210数据(格式:ID:2,NAME:ID2,CONF:0.95,TS:xxx)
char student_id[16] = {0};
char name[32] = {0};
float confidence = 0.0f;
if (sscanf(k210_data, "ID:%[^,],NAME:%[^,],CONF:%f",
student_id, name, &confidence) == 3) {
printf("[PARSE] ID=%s, Name=%s, Conf=%.2f\r\n",
student_id, name, confidence);
// 检查置信度
if (confidence >= 0.75f) {
// 执行签到(加密发送)
ProcessCheckIn(student_id, name, confidence);
} else {
printf("[REJECT] Low confidence: %.2f\r\n", confidence);
Buzzer_Beep(BEEP_FAIL);
}
} else if (strstr(k210_data, "UNKNOWN")) {
printf("[INFO] Unknown face\r\n");
Buzzer_Beep(BEEP_FAIL);
}
K210_ClearRxFlag();
}
Delay_ms(10);
}
}