Sử dụng giao thức MQTT tích hợp trong SIMCom A7680C

Để 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.

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

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

Thẻ: MQTT SIMCom A7680C embedded systems

Đăng vào ngày 11 tháng 9 lúc 00:43