Để sử dụng giao thức MQTT tích hợp sẵn trong module SIMCom A7680C, chúng ta cần thực hiện hai bước chính: khởi tạo mạng và áp dụng giao thức MQTT. Dưới đây là cách triển khai chi tiết.
Control_Network_Module
Manage_MQTT_Connection
Bước 1: Khởi tạo kết nối mạng
/**
* @brief Hàm kiểm soát trạng thái mạng của module
*/
void Control_Network_Module(void) {
static uint32_t led_timer = 0;
uint16_t i, j;
switch (Module_State) {
case MODULE_OFF:
if ((g_Data_Info.co_status == 0) || (g_Data_Info.battery_level == 0)) {
reset_counter = 0;
}
if (reset_counter != 0 || g_Alarm_Status == ALARM_ACTIVE) {
if (g_Alarm_Status == ALARM_ACTIVE) {
printf("Khởi động lại do báo động\n");
} else if (report_flag == 0) {
reset_counter = 0;
break;
} else {
if (reset_counter) reset_counter--;
}
network_active = 0;
set_module_state(MODULE_START);
} else {
if ((uint32_t)(HAL_GetTick() - Module_Delay) > 100) {
if (Allow_Led_Flash == 2) {
for (i = 0; i < 4; i++) {
LED_Indicator = 0;
delay_ms(500);
LED_Indicator = 1;
delay_ms(500);
}
}
Allow_Led_Flash = 0;
Power_Supply = 1;
network_active = 1;
Module_Delay = HAL_GetTick();
}
}
break;
case MODULE_START:
UART_Init();
Power_Supply = 0;
Module_Delay = HAL_GetTick();
set_module_state(MODULE_DELAY);
break;
case MODULE_DELAY:
if ((uint32_t)(HAL_GetTick() - Module_Delay) > 1000) {
Module_Delay = HAL_GetTick();
set_module_state(MODULE_POWER_TOGGLE);
}
break;
case MODULE_POWER_TOGGLE:
if ((uint32_t)(HAL_GetTick() - Module_Delay) > 10) {
Power_Toggle = 1;
Module_Delay = HAL_GetTick();
set_module_state(MODULE_WAIT_ON);
}
break;
case MODULE_WAIT_ON:
if ((uint32_t)(HAL_GetTick() - Module_Delay) > 1000) {
Power_Toggle = 0;
Retry_Count = 0;
set_module_state(MODULE_AT_CHECK);
}
break;
case MODULE_AT_CHECK:
Clear_RX_Buffer();
Send_Command((char*)"AT", false, true);
Retry_Count++;
Module_Delay = HAL_GetTick();
Previous_State = Module_State;
set_module_state(MODULE_OK_RESPONSE);
break;
// Các trạng thái khác được xử lý tương tự...
}
// Điều khiển LED
if (Test_Mode & g_Data_Info.flag) {;}
else if (Allow_Led_Flash) {
if (Allow_Led_Flash == 1) {
if ((uint32_t)(HAL_GetTick() - led_timer) > 500) {
LED_Indicator = !LED_Indicator;
led_timer = HAL_GetTick();
}
} else {
if ((uint32_t)(HAL_GetTick() - led_timer) < 100) {
LED_Indicator = 0;
} else {
LED_Indicator = 1;
if ((uint32_t)(HAL_GetTick() - led_timer) >= 1000) {
led_timer = HAL_GetTick();
}
}
}
} else {
LED_Indicator = 1;
}
}
Bước 2: Áp dụng giao thức MQTT
/**
* @brief Quản lý kết nối TCP/IP và MQTT
*/
void Manage_MQTT_Connection(void) {
static bool is_variable_set = false;
static uint8_t response_ok = 0, last_report_flag = 0;
static MQTT_STATE_e Mqtt_State = MQTT_IDLE;
char command_buffer[32];
char *apn_config;
switch (TCP_IP_State) {
case TCP_IP_DISCONNECTED:
break;
case TCP_IP_START:
if ((uint32_t)(HAL_GetTick() - Module_Delay) > 6) {
TCP_IP_Retry_Count = 0;
is_variable_set = false;
set_tcpip_state(TCP_IP_CONFIGURE_APN);
}
break;
case TCP_IP_CONFIGURE_APN:
if ((uint32_t)(HAL_GetTick() - Module_Delay) > 200) {
Previous_TCP_IP_State = TCP_IP_State;
TCP_IP_Retry_Count++;
Clear_RX_Buffer();
if (!strncmp(Gsm_Info.iccid, ATT_ICCID, 5)) {
apn_config = (char*)ATT_APN;
} else if (!strncmp(&Gsm_Info.iccid[2], CHINA_ICCID, 2)) {
if ((Gsm_Info.iccid[4] == '0') && (Gsm_Info.iccid[5] == '1' || Gsm_Info.iccid[5] == '6' || Gsm_Info.iccid[5] == '9')) {
apn_config = (char*)CHINA_UNICOM_APN;
} else {
apn_config = (char*)CHINA_APN;
}
} else {
apn_config = (char*)DEFAULT_APN;
}
response_ok = 0;
memset(command_buffer, 0, sizeof(command_buffer));
sprintf(command_buffer, "AT+CGDCONT=1,\"IP\",\"%s\"\r\n", apn_config);
Send_Command((char*)command_buffer, false, true);
Module_Delay = HAL_GetTick();
set_tcpip_state(TCP_IP_WAIT_OK);
}
break;
case TCP_IP_CHECK_ATTACH:
if ((uint32_t)(HAL_GetTick() - Module_Delay) > 50) {
Previous_TCP_IP_State = TCP_IP_State;
TCP_IP_Retry_Count++;
response_ok = 0;
Clear_RX_Buffer();
if (TCP_IP_Retry_Count == 2) {
Send_Command((char*)"AT+CGATT=1", false, true);
} else {
Send_Command((char*)"AT+CGATT?", false, true);
}
Module_Delay = HAL_GetTick();
set_tcpip_state(TCP_IP_CHECK_RESULT);
}
break;
case TCP_IP_CHECK_RESULT:
if (Process_Modem_Output()) {
if (!strcmp(Modem_Input_Buffer, "+CGATT: 1")) {
response_ok = 1;
} else if (!strcmp(Modem_Input_Buffer, "OK")) {
if (response_ok == 1) {
response_ok = 0;
TCP_IP_Retry_Count = 0;
set_tcpip_state(TCP_IP_MQTT_CONNECT);
}
}
Modem_Input_Buffer_Index = 0;
} else if ((uint32_t)(HAL_GetTick() - Module_Delay) > 3000) {
if (TCP_IP_Retry_Count < 5) {
set_tcpip_state(Previous_TCP_IP_State);
} else {
set_tcpip_state(TCP_IP_DEACTIVATE);
}
}
break;
// Các trạng thái khác liên quan đến MQTT sẽ được triển khai tiếp theo mô hình tương tự...
default:
set_tcpip_state(TCP_IP_DISCONNECTED);
break;
}
}