#include "publicdata/publicdata.h" #if WH_GM5_EN #include "plat_comm/4g_module/bs_wh_gm5.h" #include "app_init/app_init.h" #include "mylog/mylog.h" #include "sys_drv_init.h" #include "plat_comm/impl/bs_connect_impl.h" S_4G_CTRL_DATA s_4g_ctrl; S8_T s8_FindAck(U8_T *src, U8_T *des); S8_T s8_UART3_Send_AT_Cmd(U8_T *sendBuf, U8_T sendLen, U8_T *ack, U8_T resendCnt, U16_T delayTimeMs); // 对外提供函数 #if 1 /** * ************************************************************************ * @brief -状态清空函数 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-28 * ************************************************************************ */ void v_wh_gm5_data_init(S_4G_CONFIG_PARA *s_4g_para) { //4G模块硬件重启 RST_4G(0); PWR_4G(0); mSleep(NUM_100); RST_4G(1); PWR_4G(1); mSleep(NUM_100); memset(&s_4g_ctrl , 0 ,sizeof(S_4G_CTRL_DATA)); memcpy(&s_4g_ctrl.s_4g_para ,s_4g_para,sizeof(S_4G_CONFIG_PARA)); } /** * ************************************************************************ * @brief -SIM卡号 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-28 * ************************************************************************ */ U8_T v_GM5_get_sim(U8_T *data) { U8_T ret = 0; if (data == NULL) return ret; memset(data, 0, 20); if (s_4g_ctrl.u8_Sim_Card[0] != 0) { memcpy(data, s_4g_ctrl.u8_Sim_Card, 20); ret = 1; } return ret; } /** * ************************************************************************ * @brief -4G模块版本卡号 * * @param[in] data 4G模块版本号获取数组 长度固定位20 * @param[out] * * @author LQ * @date 2025-08-28 * ************************************************************************ */ U8_T v_GM5_get_4g_version(U8_T *data) { U8_T ret = 0; if (data == NULL) return ret; memset(data, 0, 20); if (s_4g_ctrl.u8_4g_Version[0] != 0) { memcpy(data, s_4g_ctrl.u8_4g_Version, 20); ret = 1; } return ret; } /** * ************************************************************************ * @brief -查询信号强度 * * @param[in] * @param[out] -信号强度(-1-n) * * @author LQ * @date 2025-08-28 * ************************************************************************ */ S8_T s8_UAT_check_signal_quality() { U8_T u8_sendBuf[] = "iesztAT+CSQ\r\n"; U8_T u8_recvBuf[50] = {0}; U8_T u8_ack[] = "+CSQ:"; U8_T ackOK[] = "OK"; U8_T rcvLen = 0; S8_T ackIndex = -1; U8_T temp[3] = {0}; U8_T i, j; u16_usart_send(COM_PORT_BS, u8_sendBuf, sizeof(u8_sendBuf)); mSleep(200); memset(u8_recvBuf, 0, 50); rcvLen = u16_usart_recv(COM_PORT_BS, u8_recvBuf, 50); if (rcvLen > 0) { if (s8_FindAck(u8_recvBuf, ackOK)) // 收到OK,如果后面有数据,说明数据也接收完全 { ackIndex = s8_FindAck(u8_recvBuf, u8_ack); // 找到期望应答有效数据 if ((ackIndex >= 0)) { for (i = ackIndex + 6, j = 0; i < rcvLen; i++) { if (u8_recvBuf[i] != ',') temp[j++] = u8_recvBuf[i]; else break; } return atoi((const char *)temp); } } } return -1; } /** * ************************************************************************ * @brief -查询socketA连接状态,回复+SOCKALK:Connected/Disconnected\r\n\r\nOK\r\n * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_check_socket_LinkState(U8_T u8_id) { U8_T u8_sendBuf_A[] = "iesztAT+SOCKALK?\r\n"; U8_T u8_sendBuf_B[] = "iesztAT+SOCKBLK?\r\n"; U8_T u8_ack[] = "+SOCKALK:Connected"; if(u8_id == 0) return s8_UART3_Send_AT_Cmd(u8_sendBuf_A, sizeof(u8_sendBuf_A) - 1, u8_ack, 2, 1000); else return s8_UART3_Send_AT_Cmd(u8_sendBuf_B, sizeof(u8_sendBuf_B) - 1, u8_ack, 2, 1000); } /** * ************************************************************************ * @brief -通过串口AT指令查询网络连接状态 * * @param[in] * @param[out] -0未连接,1连接 * * @author LQ * @date 2025-08-26 * ************************************************************************ */ U8_T u8_UAT_CheckConnState() { U8_T u8_sendBuf[] = "iesztAT+SOCKALK?\r\n"; U8_T u8_ack[] = "+SOCKALK:Connected"; S8_T s8_ret = -1; s8_ret = s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, u8_ack, 2, 2000); if (s8_ret == -1) return 0; else return 1; } /** * ************************************************************************ * @brief - 4G 模块串口缓存清空 * * * * @author jiankalka * @date 2025-12-20 * ************************************************************************ */ void v_4g_uart_cache_clear(void) { U8_T rcvLen = 0; U8_T u8_recvBuf[200] = {0}; rcvLen = u16_usart_recv(COM_PORT_BS, u8_recvBuf, 200); if (rcvLen > 0) { printf("4G uart cache discard, len=%u\r\n", (unsigned)rcvLen); } } #endif /** * 1.AT+WKMOD 查询/设置工作模式,默认NET网络数据透传/AT指令 * 2.AT+SOCKA 查询/设置socketA参数 * 3.AT+SOCKAEN 查询/设置是否使能socketA * 4.AT+SOCKALK 查询socketA 连接状态 * * 从网络透传切换至指令模式的时序: * 1.串口设备给模块连续发送“+++”,模块回复“a” 串口——+++——>模块 * 2.在发送“+++”之前的一个串口打包间隔时间内不可发送任何数据 串口<——a——模块 * 3.当设备接收‘a’后,必须3秒内给模块发送一个‘a’ 串口——a——>模块 * 4.模块在接收到a之后,给设备发送“+ok”,并进入临时指令模式 串口<——+ok——模块 * 5.设备接收到“+ok”后,知道模块已进入临时指令模式,可以向其发送AT指令 */ /****************UART3发送等回复****************/ /** * ************************************************************************ * @brief -在接收缓存中,查找是否收到期望应答 * * @param[in] src -缓存数据 * @param[in] des -目标值 * @param[out] s8_findResult - 目标值下标 * * @author LQ * @date 2025-08-22 * ************************************************************************ */ S8_T s8_FindAck(U8_T *src, U8_T *des) { S8_T s8_findResult = -1; // 查询结果 char *p_strstr = NULL; p_strstr = strstr((const char *)src, (const char *)des); if (p_strstr != NULL) { s8_findResult = p_strstr - (char *)src; // des所在下标 } return s8_findResult; } /** * ************************************************************************ * @brief -AT指令设置命令 * * @param[in] sendbuf -发送数据指针 * @param[in] sendLen -发送数据长度 * @param[in] ack -期望应答有效数据 * @param[in] resendCnt -重发次数计数 * @param[in] delayTimeMs -延时时间 * @param[out] ackIndex - 期望应答有效数据 * * @author LQ * @date 2025-08-22 * ************************************************************************ */ S8_T s8_UART3_Send_AT_Cmd(U8_T *sendBuf, U8_T sendLen, U8_T *ack, U8_T resendCnt, U16_T delayTimeMs) { U8_T count = 0; U8_T rcvLen = 0; S8_T ackIndex = -1; U8_T ackOK[] = "OK"; #define RECV_BUF_SIZE (100) U8_T rcvBuf[RECV_BUF_SIZE] = {0}; // com_write(COM_PORT_BS, sendBuf, sendLen, 0); u16_usart_send(COM_PORT_BS, sendBuf, sendLen); memset(rcvBuf, 0, RECV_BUF_SIZE); do { mSleep(delayTimeMs); if(rcvLen < RECV_BUF_SIZE) //已接收数据满了 不再接收新数据 rcvLen += u16_usart_recv(COM_PORT_BS,&rcvBuf[rcvLen], RECV_BUF_SIZE-rcvLen); if (rcvLen > 2) { if((count != resendCnt) && //没有检测到\r\n 最后一次接收也让允许解析 (rcvBuf[rcvLen - 2] != 0x0d || rcvBuf[rcvLen - 1] != 0x0a)) //确保AT指令最后两位是 \r\n { continue; } else if (s8_FindAck(rcvBuf, ackOK)) // 收到OK,如果后面有数据,说明数据也接收完全 { if (ack != NULL) { ackIndex = s8_FindAck(rcvBuf, ack); // 找到期望应答有效数据 if ((ackIndex >= 0)) return ackIndex; } else return 1; } } count++; } while (count < resendCnt); // 如果没收到期望应答,重新发送 return -1; } /** * ************************************************************************ * @brief -工作模式设置 * * @param[in] sendbuf -发送数据指针 * @param[in] sendLen -发送数据长度 * @param[in] ack -期望应答有效数据 * @param[in] resendCnt -重发次数计数 * @param[in] delayTimeMs -延时时间 * @param[out] ackIndex - 期望应答有效数据 * * @author LQ * @date 2025-08-22 * ************************************************************************ */ S8_T s8_UART3_set_work_mode_cmd(U8_T *sendBuf, U8_T sendLen, U8_T *ack, U8_T resendCnt, U16_T delayTimeMs) { U8_T count = 0; U8_T rcvLen = 0; S8_T ackIndex = -1; U8_T rcvBuf[100] = {0}; do { memset(rcvBuf, 0, 100); u16_usart_send(COM_PORT_BS, sendBuf, sendLen); mSleep(delayTimeMs); rcvLen = u16_usart_recv(COM_PORT_BS, rcvBuf, 100); if (rcvLen > 0) { ackIndex = s8_FindAck(rcvBuf, ack); // 找到期望应答有效数据 if ((ackIndex >= 0)) return ackIndex; } count++; } while (count < resendCnt); // 如果没收到期望应答,重新发送 return -1; } /****************通用指令****************/ /** * ************************************************************************ * @brief -保存当前设置并重启,回复OK * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_save_restart() { U8_T u8_sendBuf[] = "AT+S\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置工作模式 - 默认网络透传模式net * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_word_mode() { U8_T u8_sendBuf[] = "AT+WKMOD=NET\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -查询4g版本号 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_query_version(U8_T *data) { U8_T u8_sendBuf[] = "AT+VER?\r\n"; U8_T u8_recvBuf[50] = {0}; U8_T u8_ack[] = "+VER:"; U8_T ackOK[] = "OK"; U8_T rcvLen = 0; S8_T ackIndex = -1; U8_T u8_ret = 0; if (data == NULL) return u8_ret; mSleep(NUM_30); u16_usart_send(COM_PORT_BS, u8_sendBuf, sizeof(u8_sendBuf) - 1); mSleep(NUM_200); memset(u8_recvBuf, 0, 50); rcvLen = u16_usart_recv(COM_PORT_BS, u8_recvBuf, 50); if (rcvLen > 0) { if (s8_FindAck(u8_recvBuf, ackOK) >= 0) { ackIndex = s8_FindAck(u8_recvBuf, u8_ack); if ((ackIndex >= 0)) { u8_ret = 1; memset(data, 0, 20); strncpy((char *)data, (char *)&u8_recvBuf[ackIndex + 5],20); } } } mSleep(NUM_30); return u8_ret; } // S8_T s8_query_version() //查询固件版本号 // { // U8_T u8_sendBuf[] = "AT+VER?\r\n"; // return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf)-1, NULL, 2, 50); // } /****************串口参数指令****************/ /** * ************************************************************************ * @brief -设置串口参数,默认值即可 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_uart() { U8_T u8_sendBuf[] = "AT+UART=115200,8,1,NONE,NONE\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置串口打包时间 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_uart_PackTime() { U8_T u8_sendBuf[] = "AT+UARTFT=20\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /****************透传相关指令****************/ /** * ************************************************************************ * @brief -设置命令密码 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_cmdPw() { U8_T u8_sendBuf[] = "AT+CMDPW=ieszt\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置串口AT指令使能 ,ON开启 OFF关闭,回复OK * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_UAT_EN() { U8_T u8_sendBuf[] = "AT+UATEN=ON\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置串口缓存使能,打开 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_catch_EN() // 设置串口缓存使能,打开 { U8_T u8_sendBuf[] = "AT+CACHEN=ON\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /****************网络参数指令****************/ /** * ************************************************************************ * @brief -设置APN信息 - 默认CMNET无需设置 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_APN(U8_T u8_apn_type) { if (u8_apn_type == 0) // 公网 { U8_T u8_sendBuf[] = "AT+APN=CMNET,,\r\n"; // 公网默认配置 用户名/密码默认为空 return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } else if (u8_apn_type == 1) { U8_T u8_sendBuf[] = "AT+APN=CMIOTECHARGENET,,0,0\r\n"; // 国网移动卡 用户名/密码默认为空 return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } else if (u8_apn_type == 2) { U8_T u8_sendBuf[] = "AT+APN=SHIEVSP01.SCHJ.NJM2MAPN,,0,0\r\n"; // 国网联通卡 用户名/密码默认为空 return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } else if (u8_apn_type == 3) { U8_T u8_sendBuf[] = "AT+APN=evs.vpdn.sh,,0,0\r\n"; // 国网电信卡 用户名/密码默认为空 return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } else return 1; // 其余情况默认不设置 } /** * ************************************************************************ * @brief -设置串口分发使能 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_sdp_EN() { U8_T u8_sendBuf[] = "AT+SDPEN=ON\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置串口分发不使能 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_sdp_OFF() // 设置串口分发bu使能 { U8_T u8_sendBuf[] = "AT+SDPEN=OFF\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置socketA使能 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_socketA_EN() { U8_T u8_sendBuf[] = "AT+SOCKAEN=ON\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置socketB使能 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_socketB_EN() { U8_T u8_sendBuf[] = "AT+SOCKBEN=ON\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置socketB不使能 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_socketB_NoEN() // 设置socketB不使能 { U8_T u8_sendBuf[] = "AT+SOCKBEN=OFF\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /** * ************************************************************************ * @brief -设置socketA参数 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_socketA_para(U8_T *u8_server_domain) // 设置socketA参数 { U8_T u8_sendBuf[50] = {0}; U8_T u8_len; if(u8_server_domain == NULL) return 0; u8_len = sprintf((char *)(&u8_sendBuf[0]), "AT+SOCKA=TCP,%s\r\n", u8_server_domain); return s8_UART3_Send_AT_Cmd(u8_sendBuf, u8_len, NULL, 2, 700); } /** * ************************************************************************ * @brief -设置socketB参数 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_socketB_para(U8_T *u8_server_domain) // 设置socketB参数 { U8_T u8_sendBuf[50] = {0}; U8_T u8_len; u8_len = sprintf((char *)(&u8_sendBuf[0]), "AT+SOCKB=TCP,%s\r\n", u8_server_domain); return s8_UART3_Send_AT_Cmd(u8_sendBuf, u8_len, NULL, 2, 700); } /****************注册包指令******************/ /****************心跳包指令******************/ /** * ************************************************************************ * @brief -设置心跳包不使能 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_set_heart_off() { U8_T u8_sendBuf[] = "AT+HEARTEN=OFF\r\n"; return s8_UART3_Send_AT_Cmd(u8_sendBuf, sizeof(u8_sendBuf) - 1, NULL, 2, 500); } /****************模式切换到指令模式******************/ /** * ************************************************************************ * @brief -切换到指令模式 * * @param[in] * @param[out] - * * @author LQ * @date 2025-08-22 * ************************************************************************ */ U8_T u8_work_mode_cmd() // 切换到指令模式 { static U8_T u8_step = 0; S8_T s8_ret = -1; S8_T s8_entm_ret = -1; U8_T u8_cmd[] = "+++"; U8_T u8_cmd_ack[] = "a"; U8_T u8_ok[] = "+ok"; U8_T u8_entm[] = "AT+ENTM\r\n"; switch (u8_step) { case 0: { // 串口设备连续发送+++,等待模块回复a s8_ret = s8_UART3_set_work_mode_cmd(&u8_cmd[0], sizeof(u8_cmd) - 1, u8_cmd_ack, 3, 2000);//处理发送太快、回复慢问题 // 如果收不到回复,判断模块在配置状态,退出,重新进入配置状态 //20201228zpc if (s8_ret == -1) { s8_entm_ret = s8_UART3_Send_AT_Cmd(u8_entm, sizeof(u8_entm) - 1, NULL, 2, 500); if (s8_entm_ret == -1) return 0; s8_ret = s8_UART3_set_work_mode_cmd(u8_cmd, sizeof(u8_cmd) - 1, u8_cmd_ack, 3, 500); if (s8_ret == -1) return 0; } mSleep(20); u8_step = 1; } case 1: { // 串口设备发送a,等待模块回复+ok s8_ret = s8_UART3_set_work_mode_cmd(u8_cmd_ack, sizeof(u8_cmd_ack) - 1, u8_ok, 3, 500); if (s8_ret == -1) { s8_entm_ret = s8_UART3_Send_AT_Cmd(u8_entm, sizeof(u8_entm) - 1, NULL, 2, 500); if (s8_entm_ret == -1) u8_step = 0; return 0; } u8_step = 0; break; } default: break; } return 1; } /** * ************************************************************************ * @brief -切换到数据透传模式 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ U8_T u8_work_mode_data() { S8_T s8_ret = -1; U8_T u8_entm[] = "AT+ENTM\r\n"; s8_ret = s8_UART3_Send_AT_Cmd(u8_entm, sizeof(u8_entm) - 1, NULL, 2, 500); if (s8_ret == -1) return 0; else return 1; } /** * ************************************************************************ * @brief -查询SIM卡号 * * @param[in] * @param[out] * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_check_number(U8_T *data) { U8_T u8_sendBuf[] = "AT+ICCID?\r\n"; U8_T u8_ack[] = "+ICCID:"; U8_T u8_recvBuf[100] = {0}; U8_T rcvLen = 0; U8_T ackOK[] = "OK"; S8_T ackIndex = -1; U8_T u8_ret = 0; if (data == NULL) return u8_ret; u16_usart_send(COM_PORT_BS, u8_sendBuf, sizeof(u8_sendBuf) - 1); mSleep(NUM_300); memset(u8_recvBuf, 0, 100); rcvLen = u16_usart_recv(COM_PORT_BS, u8_recvBuf, 100); if (rcvLen > 0) { if (s8_FindAck(u8_recvBuf, ackOK)) { ackIndex = s8_FindAck(u8_recvBuf, u8_ack); if ((ackIndex >= 0)) { u8_ret = 1; memset(data, 0, 20); strncpy((char *)data, (char *)&u8_recvBuf[ackIndex + 7],20); } } } return u8_ret; } /** * ************************************************************************ * @brief -WH-GM5模块初始化,设置模式/参数等 * * @param[in] *s_4g-4g模块配置参数结构体数据 * @param[out] -配网流程状态 0配网成功 非0 配网中(1-15配网步骤) * * @author LQ * @date 2025-08-26 * ************************************************************************ */ S8_T s8_WH_GM5_init(void) { S8_T step ; // 备注 -- 默认值正确的,即使设置未收到应答,也进入下一步 lyn20201229 switch (s_4g_ctrl.e_wh_gm5_init_step) { case STEP_SWCHTO_CMD_MODE: // 切换到指令模式,模块新版默认串口AT指令使能,以防现场有老模块,仍保持指令模式设置 { if (u8_work_mode_cmd()) { s_4g_ctrl.e_wh_gm5_init_step = STEP_MODE_NET_ON; s_4g_ctrl.u8_out_cnt = 0; } break; } case STEP_MODE_NET_ON: // 设置工作模式为网络透传模式,工作模式默认NET { s8_query_version(&s_4g_ctrl.u8_4g_Version[0]); // 测试,查询固件版本号 s8_check_number(&s_4g_ctrl.u8_Sim_Card[0]); if (s8_set_word_mode() >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_UAT_ON; if ((s_4g_ctrl.u8_out_cnt++) > 3) { s_4g_ctrl.e_wh_gm5_init_step = STEP_UAT_ON; s_4g_ctrl.u8_out_cnt = 0; } break; } case STEP_UAT_ON: // 使能串口AT指令(默认使能),串口AT指令需要密码,默认usr.cn, usr.cn#AT+[CMD] { if (s8_set_UAT_EN() >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_UAT_SET_PACK_TIME; break; } case STEP_UAT_SET_PACK_TIME: // 打包时间 20ms { if (s8_set_uart_PackTime() >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_SET_PWD; break; } case STEP_SET_PWD: // 设置命令密码“ieszt” { if (s8_set_cmdPw() >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_SET_APN; break; } case STEP_SET_APN: // 设置APN { if (s8_set_APN(s_4g_ctrl.s_4g_para.u8_Sim_Type) >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_SET_SDPEN; break; } case STEP_SET_SDPEN: // 设置套接字分发 { if (s_4g_ctrl.s_4g_para.u8_socketB_en && (s8_set_sdp_EN() >= 0)) //套接字分发使能 s_4g_ctrl.e_wh_gm5_init_step = STEP_SCKA_ON; else if (s8_set_sdp_OFF() >= 0) //套接字分发使能 不使能 s_4g_ctrl.e_wh_gm5_init_step = STEP_SCKA_ON; break; } case STEP_SCKA_ON: // 设置socketA使能,默认ON { if (s8_set_socketA_EN() >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_SET_SCKA_PARA; if ((s_4g_ctrl.u8_out_cnt++) > 3) { s_4g_ctrl.e_wh_gm5_init_step = STEP_SET_SCKA_PARA; s_4g_ctrl.u8_out_cnt = 0; } break; } case STEP_SET_SCKA_PARA: // 设置socketA参数 { if (s8_set_socketA_para(s_4g_ctrl.s_4g_para.socketA_IP) >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_SCKB_ON; break; } case STEP_SCKB_ON: // 设置socketB使能,默认ON { if ((s_4g_ctrl.s_4g_para.u8_socketB_en) && (s8_set_socketB_EN() >= 0)) s_4g_ctrl.e_wh_gm5_init_step = STEP_SET_SCKB_PARA; else if ((s_4g_ctrl.s_4g_para.u8_socketB_en != 1) && (s8_set_socketB_NoEN() >= 0)) s_4g_ctrl.e_wh_gm5_init_step = STEP_HEART_OFF; if ((s_4g_ctrl.u8_out_cnt++) > 3) { s_4g_ctrl.e_wh_gm5_init_step = STEP_HEART_OFF; s_4g_ctrl.u8_out_cnt = 0; } break; } case STEP_SET_SCKB_PARA: // 设置socketB参数 { if (s8_set_socketB_para(s_4g_ctrl.s_4g_para.socketB_IP) >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_HEART_OFF; break; } case STEP_HEART_OFF: // 设置心跳包不使能 { if (s8_set_heart_off() >= 0) s_4g_ctrl.e_wh_gm5_init_step = STEP_SAVE; break; } case STEP_SAVE: // 保存当前设置并重启 { if (s8_save_restart() >= 0) { s_4g_ctrl.e_wh_gm5_init_step = STEP_INIT_OK; s_4g_ctrl.u8_out_cnt = 0; mSleep(500); } break; } default: break; } //流程结果输出 if (s_4g_ctrl.e_wh_gm5_init_step == STEP_INIT_OK) step = 0; else step = (U8_T)s_4g_ctrl.e_wh_gm5_init_step + 1; return step; } #endif /* WH_GM5_EN */