/************************************************************************************ * @Copyright (c) :(C)2017, Qindao ieslab Co., Ltd * @FileName :pic24_nb_driver.c * @Author :QDIES PLATFORM TEAM * @Version :V1.0 * @Date :2017-03-01 * @Description : ************************************************************************************/ #include "sys_config.h" #ifdef NB_MODULE_BC28 #ifdef __cplusplus extern "C" { #endif #include "nb_uart_driver_bc28.h" #include "nb_driver_bc28.h" #include "stdio.h" #include #include "UWater_timer1uS_driver.h" #include "UWater_uart_driver.h" #include "UWater_Rtcc_Driver.h" #include "UWater_frame_app.h" #include "UWater_Adc_driver.h" #include "nb_upload_monitor.h" /********************************变量定义************************************/ NBIOT_PARA Nbiot_Para; NBIOT_MSG Nbiot_Msg; static NBIOT_SEND_DATA Nbiot_Send_Data; //static u8 *g_s_csq_value; //状态变量(各个状态机运行的状态变量) u8 g_s_nbiot_main_state = NBIOT_S_IDLE; //u8 s_send_state; //任务标志位 u8 g_s_nbiot_task_flag = TASK_INIT; u8 g_s_nbiot_mode_flag = NO_NBIOT_TASK; u8 g_s_nbiot_send_type; u8 g_s_nbiot_read_ccid_flag = FALSE; u8 g_s_nbiot_read_ECL_flag = FALSE; u8 flag_clear_ncsearfcn = 0; u8 nb_power_flag = FALSE; u8 s_init_state = S_INIT_POWER_ON; u8 s_coap_connect_state = S_COAP_CONNECT_START; TYP_UDP_CONNECT s_udp_connect_state = S_UDP_CONNECT_IDLE; u8 s_coap_send_state = S_SEND_START; TYP_UDP_SEND s_udp_send_state = S_UDP_SEND_IDLE; u8 s_power_off_state = S_START; char c_AT_NMGS[40 + UP_BUF_SIZE*2];//发送数据长度较小 static const char* c_AT_NUESTATS = "AT+NUESTATS\r";//"AT+QENG=0\r"; static const char* c_AT_CCLK = "AT+CCLK?\r"; //查询基站时间 //ip地址和端口指针 unsigned char *coap_ip; u16 coap_port; unsigned char *udp_ip1; u16 udp_port1; unsigned char *udp_ip2; u16 udp_port2; u8 nbiot_temp_connect_type=NBIOT_CONNECT_COAP; //PSM状态 TYP_PSM_STATE psm_model_state = PSM_STATE_OUT; TYP_PSM_WAKEUP_STATE s_psm_wakeup_state = PSM_WKUPSTA_IDLE; TYP_PSM_SLEEP_STATE s_psm_sleep_state = PSM_SLPSTA_IDLE; //PSM异常检测 static u8 s_psm_adc_done = 0; // AD装换结果完成标志 static u32 s_psm_adc_result = 0; // AD转换后结果存放 /*****************************内部功能状态机***********************************/ void NbiotInitMachine(void); void CoapConnectMachine(void); void UdpConnectMachine(void); void CoapSendDataMachine(void); void UdpSendDataMachine(void); void NbiotPowerOffMachine(void); void UdpReadDataMachine(void); //static void NbiotMsgDeal(void); void NbiotReadECLSNRMachine(void); void StartUdpSendData(void); void sys_get_three_code (void); void OnenetConnectMachine(void); void OneNetSendDataMachine(void); void StartOnenetAckRev(void); void NbiotRevAckMachine(void); static void Psm_Wakup_Machine(void); static void Psm_Sleep_Machine(void); /*****************************内部定时器接口**********************************/ void set_timer_1s(u16 time); u16 check_timer_1s(void); void set_timer_1ms(u16 time); u16 check_timer_1ms(void); void CoapStartConnect(void); void StartCoapSendData(void); void StartNbiotInit(void); void UdpStartConnect(u8 udp_num); void OneNetStartConnect(void); void StartOnenetSendData(void); /*****************************外部接口****************************************/ void NB_Power_Disable(void) { Gpio_WriteOutputIO(BAT_NB_PORT, BAT_NB_PIN, FALSE); nb_power_flag = FALSE; } void NB_Power_Enable(void) { Gpio_WriteOutputIO(BAT_NB_PORT, BAT_NB_PIN, TRUE); nb_power_flag = TRUE; } u8 If_NB_Poweron(void) { return nb_power_flag; } /*************************************************************************** * @fun_name void NbModuleIOInit(void) * @brief 模块供电IO、模块复位、电源、PSM唤醒引脚初始化 ***************************************************************************/ void NbModuleIOInit(void) { stc_gpio_cfg_t stcGpioCfg; DDL_ZERO_STRUCT(stcGpioCfg); stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置 stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力 stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无 stcGpioCfg.enPd = GpioPdDisable; stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置 stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB Gpio_Init(BAT_NB_PORT, BAT_NB_PIN, &stcGpioCfg); //模块供电IO Gpio_Init(RSTN_NB_PORT, RSTN_NB_PIN, &stcGpioCfg); Gpio_Init(NB_PSM_WAKE_PORT, NB_PSM_WAKE_PIN, &stcGpioCfg); Gpio_Init(PWR_NB_PORT, PWR_NB_PIN, &stcGpioCfg); //电源控制脚 Gpio_WriteOutputIO(BAT_NB_PORT, BAT_NB_PIN, FALSE); Gpio_WriteOutputIO(PWR_NB_PORT, PWR_NB_PIN, FALSE); Gpio_WriteOutputIO(RSTN_NB_PORT, RSTN_NB_PIN, FALSE); Gpio_WriteOutputIO(NB_PSM_WAKE_PORT , NB_PSM_WAKE_PIN, FALSE); } /*************************************************************************** * @fun_name void NbiotMainMachine() * @brief NBIOT主任务机,放在主程序空间的主循环中,进行NBIOT任务处理 ***************************************************************************/ void NbiotMainMachine(void) { switch (g_s_nbiot_main_state) { case NBIOT_S_IDLE: { //沈阳规约修改,udp下发指令和应答帧间隔太短,需要主动查询数据 // if(TRUE == UdpIfNeedReadDataBc25(NBIOT_CONNECT_UDP1)) // { // ClearUdpReadDataFlag(NBIOT_CONNECT_UDP1); // SetRcvDataType(NB_RCV_UDP1_DATA); // g_s_nbiot_main_state = NBIOT_READ_UDP_DATA; // } // else if(TRUE == UdpIfNeedReadDataBc25(NBIOT_CONNECT_UDP2)) // { // ClearUdpReadDataFlag(NBIOT_CONNECT_UDP2); // SetRcvDataType(NB_RCV_UDP2_DATA); // g_s_nbiot_main_state = NBIOT_READ_UDP_DATA; // } // else if(TRUE == Check_Udp_Data_Received()) // { // Clear_Udp_Rec_Data_Flag(); // g_s_nbiot_main_state = NBIOT_READ_UDP_DATA; // } // else if(TRUE == NbiotGetRevAck())//收到ONNET下发的数据,先进入应答流程应答一下 { ClearNbiotGetRevAck(); StartOnenetAckRev(); g_s_nbiot_main_state = NBIOT_REV_ACK; } else if(FrameCheckMsgApp(Msg_PsmPowerCheck)) { FrameClearMsgApp(Msg_PsmPowerCheck); if(psm_model_state == PSM_STATE_SLEEP) { NbiotPsmCheckTask(); } } } break; case NBIOT_POWER_INIT: { if (TASK_INIT == g_s_nbiot_task_flag) //如果是初始状态 { NbiotInitMachine(); //模块初始化状态机 } else if (TASK_SUCCESS == g_s_nbiot_task_flag) //任务成功 { u8 temp_iccid_buf[20]; NbiotGetICCID((char*)temp_iccid_buf); //中国移动的为:898600;898602;898604;898607 中国电信898603;898611 Nbiot_Para.Telecom = SIM_CARD_TELECOM;//电信卡 if(temp_iccid_buf[4]=='0') { if((temp_iccid_buf[5]=='0')||(temp_iccid_buf[5]=='2')||(temp_iccid_buf[5]=='4')||(temp_iccid_buf[5]=='7')) { Nbiot_Para.Telecom = SIM_CARD_MOBILE; } } Nbiot_Para.net_state = NB_ON_LINE; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } else //任务失败 { *Nbiot_Send_Data.state = NBIOT_ERROR; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } break; case NBIOT_NET_OPEN: { if (TASK_INIT == g_s_nbiot_task_flag) { if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP1) { UdpConnectMachine(); } else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP2) { UdpConnectMachine(); } else { if(Nbiot_Para.Telecom == SIM_CARD_MOBILE)//移动卡 { OnenetConnectMachine();//与ONNET平台建立连接状态机 } else//电信卡 { CoapConnectMachine(); //与主站建立连接状态机 } } } else if (TASK_SUCCESS == g_s_nbiot_task_flag) { if((Sys_data_object.P1.func_cfg_bytes[12]&0x80)&&(Sys_data_object.P1.func_cfg_bytes[12]&0x03)) //PSM模式上报判断 { psm_model_state = PSM_STATE_WAKE; } else { psm_model_state = PSM_STATE_OUT; } if(nbiot_temp_connect_type == NBIOT_CONNECT_COAP) { Nbiot_Para.coap_state = CONNECT_ON_LINE; } else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP1) { Nbiot_Para.udp1_state = CONNECT_ON_LINE; } else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP2) { Nbiot_Para.udp2_state = CONNECT_ON_LINE; } g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } else { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } break; case NBIOT_DATA_SEND: { if (g_s_nbiot_task_flag == TASK_INIT) { if(g_s_nbiot_send_type == SEND_TYPE_COAP) { if(Nbiot_Para.Telecom == SIM_CARD_MOBILE)//移动卡 { OneNetSendDataMachine(); } else//电信卡 { CoapSendDataMachine(); //数据发送状态机 } } else if(g_s_nbiot_send_type == SEND_TYPE_UDP1) { UdpSendDataMachine(); //数据发送状态机 } else if(g_s_nbiot_send_type == SEND_TYPE_UDP2) { UdpSendDataMachine(); //数据发送状态机 } else { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } else//发送完毕回到空闲状态 { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } break; case NBIOT_POWER_OFF: { if (TASK_INIT == g_s_nbiot_task_flag) { NbiotPowerOffMachine(); //断电关机 } else { g_s_nbiot_mode_flag = NO_NBIOT_TASK; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; Nbiot_Para.net_state = NB_OFF_LINE; Nbiot_Para.coap_state = CONNECT_OFF_LINE; Nbiot_Para.udp1_state = CONNECT_OFF_LINE; Nbiot_Para.udp2_state = CONNECT_OFF_LINE; } } break; case NBIOT_READ_ECL_SNR: { if (NB_ON_LINE == Nbiot_Para.net_state) { if (g_s_nbiot_task_flag == TASK_INIT) { NbiotReadECLSNRMachine(); //读CSQ状态机,上行规约需要自检,其中一项就是读信号值,因此做成单独的状态机 } else if (g_s_nbiot_task_flag == TASK_SUCCESS) { *Nbiot_Send_Data.state = RSRP_SUCCESS; g_s_nbiot_mode_flag = NO_NBIOT_TASK; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } else { g_s_nbiot_mode_flag = NO_NBIOT_TASK; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } else //如果不在线 { if (TRUE == g_s_nbiot_read_ECL_flag) { if (g_s_nbiot_task_flag == TASK_INIT) { NbiotReadECLSNRMachine(); //读CSQ状态机,上行规约需要自检,其中一项就是读信号值,因此做成单独的状态机 } else if (g_s_nbiot_task_flag == TASK_SUCCESS) { g_s_nbiot_mode_flag = NO_NBIOT_TASK; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } else { g_s_nbiot_mode_flag = NO_NBIOT_TASK; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; //应用层调用关机流程_ } } else { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_POWER_INIT; //模块初始化 StartNbiotInit(); } } } break; // case NBIOT_READ_UDP_DATA: // { // if (TASK_INIT == g_s_nbiot_task_flag) // { // UdpReadDataMachine(); // } // else // { // g_s_nbiot_task_flag = TASK_INIT; // g_s_nbiot_main_state = NBIOT_S_IDLE; // } // } // break; case NBIOT_REV_ACK: { if (TASK_INIT == g_s_nbiot_task_flag) { NbiotRevAckMachine(); } else { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } break; case NBIOT_PSM_WAKEUP: { if (TASK_INIT == g_s_nbiot_task_flag) { Psm_Wakup_Machine(); } else { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } break; case NBIOT_PSM_SLEEP: { if (TASK_INIT == g_s_nbiot_task_flag) { Psm_Sleep_Machine(); } else { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } } break; default: { g_s_nbiot_main_state = NBIOT_S_IDLE; } break; } } /*************************************************************************** * @fun_name u8 NbiotIfIdle() * @brief 查询模块的空闲状态 ***************************************************************************/ u8 NbiotIfIdle(void) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { return TASK_IDLE; } else { return TASK_BUSY; } } /*************************************************************************** * @fun_name u8 NbiotIfOnline() * @brief 查询NBIOT是否在线 ***************************************************************************/ u8 NbiotIfOnline(void) { if (NB_ON_LINE == Nbiot_Para.net_state) { return TRUE; } else { return FALSE; } } /*************************************************************************** * @fun_name u8 ConncetIfOnline() * @brief 查询连接是否在线 ***************************************************************************/ u8 ConncetIfOnline(u8 connect_type) { if(connect_type == NBIOT_CONNECT_COAP) { if (CONNECT_ON_LINE == Nbiot_Para.coap_state) { return TRUE; } else { return FALSE; } } else if(connect_type == NBIOT_CONNECT_UDP1) { if (CONNECT_ON_LINE == Nbiot_Para.udp1_state) { return TRUE; } else { return FALSE; } } else if(connect_type == NBIOT_CONNECT_UDP2) { if (CONNECT_ON_LINE == Nbiot_Para.udp2_state) { return TRUE; } else { return FALSE; } } return FALSE; } /*************************************************************************** * @fun_name void NbiotOnlineTask(u8 *state) * @brief NBIOT上线任务 * @param[in] state:状态信息 ***************************************************************************/ void NbiotOnlineTask(u8 *state) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { if (!NbiotIfOnline()) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { Nbiot_Send_Data.state = state; //地址拷贝 *state = NBIOT_ING; g_s_nbiot_mode_flag = ONLINE_MODE; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_POWER_INIT; StartNbiotInit(); } } else { *state = NBIOT_ONLINE; } } else { *state = NBIOT_ERROR; } } /*************************************************************************** * @fun_name void NB_NetConnectStart * @brief 根据连接类型建立连接 * @param[in] state:状态信息 ***************************************************************************/ void NB_NetConnectStart(unsigned char* temp_ip, u16 temp_port, u8 connect_type) { if(connect_type == NBIOT_CONNECT_COAP) { coap_ip = temp_ip; coap_port = temp_port; if(Nbiot_Para.Telecom == SIM_CARD_MOBILE)//移动卡 { OneNetStartConnect(); } else//电信卡 { CoapStartConnect(); } nbiot_temp_connect_type = NBIOT_CONNECT_COAP; } else if(connect_type == NBIOT_CONNECT_UDP1) { udp_ip1 = temp_ip; udp_port1 = temp_port; UdpStartConnect(NBIOT_CONNECT_UDP1); } else if(connect_type == NBIOT_CONNECT_UDP2) { udp_ip2 = temp_ip; udp_port2 = temp_port; UdpStartConnect(NBIOT_CONNECT_UDP2); } g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_NET_OPEN; } void NbiotPsmWakeupTask(void) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_PSM_WAKEUP; s_psm_wakeup_state = PSM_WKUPSTA_START; } } void NbiotPsmSleepTask(void) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_PSM_SLEEP; s_psm_sleep_state = PSM_SLPSTA_START; } } void NbiotPsmCheckTask(void) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_PSM_SLEEP; s_psm_sleep_state = PSM_CHECK_START; } } /*************************************************************************** * @fun_name void NbiotSendTask(u8 *addr, u16 len, u8 send_type,u8 *state) * @brief NBIOT数据发送任务 * @param[in] addr:内容的首地址 len:长度 * @param[out] state:状态信息 * @retval None * @other state(NBIOT_ING:查询中, NBIOT_SUCCES:成功 其他:异常) ***************************************************************************/ void NbiotSendTask(u8 *addr, u16 len, u8 send_type,u8 *state) { if ((NBIOT_S_IDLE == g_s_nbiot_main_state) && (len > 0) && (len <= UP_BUF_SIZE)) { Nbiot_Send_Data.buf = addr; //地址拷贝 Nbiot_Send_Data.len = len; //值拷贝 Nbiot_Send_Data.state = state; //地址拷贝 *state = NBIOT_ING; g_s_nbiot_mode_flag = SEND_MODE; g_s_nbiot_send_type = send_type; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_DATA_SEND; StartNbiotSendData(); } else { *state = NBIOT_ERROR; } } //获取发送类型 u8 GetNbiotSendType(void) { return g_s_nbiot_send_type; } /*************************************************************************** * @fun_name void NbiotReadCsqTask(u8 *out_csq,u8 *state) * @brief NBIOT查询信号值任务 * @param[in] out_csq:存放数据地址 * @param[out] state:状态信息 * @retval None * @other state(CSQ_ING:查询中, CSQ_SUCCES:成功 其他:异常) ***************************************************************************/ /*void NbiotUdpOpenTask(void) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { if(!UdpIfOnline()) { g_s_nbiot_mode_flag = ONLINE_MODE; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_UDP_OPEN; UdpStartConnect(); } } }*/ void NbiotReadECLSNRTask(u8 *state) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { Nbiot_Send_Data.state = state; *state = ECL_SNR_ING; g_s_nbiot_mode_flag = READ_ECL_SNR; g_s_nbiot_read_ECL_flag = FALSE; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_READ_ECL_SNR; } else { *state = ECL_SNR_ERROR; } } /*************************************************************************** * @fun_name u8 NbiotIfSleep() * @brief 是否允许休眠 * @param[in] None * @param[out] None * @retval TRUE: 允许 FALSE:不允许 * @other None ***************************************************************************/ u8 NbiotIfSleep(void) { if (NBIOT_S_IDLE == g_s_nbiot_main_state) { return TRUE; } else { return FALSE; } } /*************************************************************************** * @fun_name void NbiotPreSleep() * @brief 休眠前操作 * @param[in] None * @param[out] None * @retval None * @other None ***************************************************************************/ static void NbiotPreSleepNormal(void) { NB_Power_Disable(); //切断电源 UartPreSleep(NB_UART_COM); g_s_nbiot_main_state = NBIOT_S_IDLE; Nbiot_Para.coap_state = CONNECT_OFF_LINE; Nbiot_Para.udp1_state = CONNECT_OFF_LINE; Nbiot_Para.udp2_state = CONNECT_OFF_LINE; Nbiot_Para.net_state = NB_OFF_LINE; //配置NB相关引脚 stc_gpio_cfg_t stcGpioCfg; DDL_ZERO_STRUCT(stcGpioCfg); stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置 stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力 stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无 stcGpioCfg.enPd = GpioPdDisable; stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置 stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB Gpio_Init(BAT_NB_PORT, BAT_NB_PIN, &stcGpioCfg); //模块供电IO Gpio_Init(RSTN_NB_PORT, RSTN_NB_PIN, &stcGpioCfg); Gpio_Init(NB_PSM_WAKE_PORT, NB_PSM_WAKE_PIN, &stcGpioCfg); Gpio_Init(PWR_NB_PORT, PWR_NB_PIN, &stcGpioCfg); //电源控制脚 Gpio_WriteOutputIO(BAT_NB_PORT, BAT_NB_PIN, FALSE); Gpio_WriteOutputIO(PWR_NB_PORT, PWR_NB_PIN, FALSE); Gpio_WriteOutputIO(RSTN_NB_PORT, RSTN_NB_PIN, FALSE); Gpio_WriteOutputIO(NB_PSM_WAKE_PORT , NB_PSM_WAKE_PIN, FALSE); Gpio_Init(LPUART1_TX_PORT, LPUART1_TX_PIN, &stcGpioCfg); Gpio_WriteOutputIO(LPUART1_TX_PORT, LPUART1_TX_PIN, FALSE); //TX也配置为输出低 stcGpioCfg.enDir = GpioDirIn; //RX输入 Gpio_Init(LPUART1_RX_PORT, LPUART1_RX_PIN, &stcGpioCfg); } static void NbiotPreSleepPsm(void) { UartPreSleep(NB_UART_COM); g_s_nbiot_main_state = NBIOT_S_IDLE; } void NbiotPreSleep(void) { if(Sys_data_object.P3.NBSleepMode == 1)//PSM模式休眠 { NbiotPreSleepPsm(); } else { NbiotPreSleepNormal(); } } /*************************************************************************** * @fun_name void NbiotWakeSleep() * @brief 休眠后唤醒 * @param[in] None * @param[out] None * @retval None * @other None ***************************************************************************/ void NbiotWakeSleep(void) { } /******************************内部状态机***********************************/ void StartNbiotInit(void) { s_init_state = S_INIT_POWER_ON; } /*************************************************************************** * @fun_name void NbiotInitMachine() * @brief NBIOT初始化状态机 * @param[in] None * @param[out] None * @retval None * @other None ***************************************************************************/ /*模组端串口调试配置*/ void NB_UartInitForGPIO(void)//debug { stc_gpio_cfg_t stcGpioCfg; DDL_ZERO_STRUCT(stcGpioCfg); //PA0,PA1:配置为数字输入 stcGpioCfg.enDir = GpioDirIn; ///< 端口方向配置->输入 stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力 stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无 stcGpioCfg.enPd = GpioPdDisable; stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭 stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB Gpio_Init(GpioPortA, GpioPin0, &stcGpioCfg); Gpio_Init(GpioPortA, GpioPin1, &stcGpioCfg); } #define MODULE_POWER_DELAY_TIME 2000 //mS #define MODULE_RESET_DELAY_TIME 1000 //mS //AT+QBAND AT+QBAND=1,5 //设置频段为 BAND 5 //中国移动的为:898600;898602;898604;898607 中国电信898603;898611 void NbiotInitMachine_BC28(void) { static u8 s_at_error_count = 0; //记录AT错误或者指令超时次数 超过指定次数后认为任务失败 static const char* c_AT = "ATE1\r";//"ATE1\r"; //AT+NSMI=1 不保存 static const char* c_AT_IMEI = "AT+CGSN=1\r"; static const char* c_AT_CIMI = "AT+CIMI\r"; static const char* c_AT_ICCID = "AT+NCCID\r"; static const char* c_AT_CMEE = "AT+CMEE=1\r"; //打开ERROR错误码显示 static const char* c_AT_CPSMS = "AT+CPSMS=0\r"; //关闭PSM模式 static const char* c_AT_NPTWEDRXS = "AT+CEDRXS=0,5\r"; //关闭eDRX模式 static const char* c_AT_CSQ = "AT+CSQ\r"; //查询信号值 static const char* c_AT_CEREG = "AT+CEREG?\r"; //static const char* c_AT_NCFG = "AT+NCFG=0,172800\r";//设置lifetime 平台端的生存周期 超过指定时间设备显示离线,48小时 static const char* c_AT_NCFG = "AT+QCFG=\"LWM2M/lifetime\",172800\r";//设置lifetime static const char* c_AT_CGATT = "AT+CGATT?\r"; static u8 c_AT_CGDCONT_APN[APN_SIZE+50] = "AT+CGDCONT=0,\"IP\",\""; //指定APN,定义数组大小为固定20字节+APN数组大小,再加预留空间 /** BC28:模块VBAT上电后,保持RESET_N输入不被拉低,即可实现模块自动开机.booting时间500ms BC28:pin7为boot引脚,BC25为开机键 */ switch (s_init_state) { case S_INIT_POWER_ON://NB模块送电 { NbModuleIOInit(); //初始化默认模块断电 UartInit(NB_UART_COM, BAUD9600, DATA_BIT_8, STOPBIT_1, UART_NONE_PARITY,UART_LPUART_Disable); RSTN_NB_HIG(); //PWR_NB_HIG(); BC28:pin7为boot引脚 NB_Power_Enable(); set_timer_1ms(MODULE_POWER_DELAY_TIME); s_init_state = S_INIT_POWER_ON_WAIT; clearRegindState(); } break; /* case S_INIT_PWRKEY_LOW://NB模块送电 { if (!check_timer_1ms()) { PWR_NB_LOW(); s_init_state = S_INIT_PWRKEY_HIGH; set_timer_1ms(MODULE_RESET_DELAY_TIME*4); } } break; case S_INIT_PWRKEY_HIGH://NB模块送电 { if (!check_timer_1ms()) { PWR_NB_HIG(); //高电平 set_timer_1s(1); s_init_state = S_INIT_POWER_ON_WAIT; } } break; */ case S_INIT_POWER_ON_WAIT://等待模块搜网注册延时 { if (!check_timer_1ms())//if (!check_timer_1s()) { s_at_error_count = 0; //AT指令错误次数清零 set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); if(getUploadControlPara(UP_AT_SIMPLE)!=AT_SIMPLE_NULL) { s_init_state = S_INIT_ASK_CEREG; } else { s_init_state = S_INIT_ATS; } } } break; case S_INIT_ATS://发送"AT" 确认模块正常运行 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT, strlen(c_AT), cst_AT_No_AT); s_init_state = S_INIT_ATS_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_INIT_ATS_R://等待"AT"应答 { if (NbiotCheckAtAck() == UART_OK)//返回正确的应答 { s_at_error_count = 0; s_init_state = S_INIT_ASK_IMEI; //下一步开始查询IMEI set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) //应答超时或者错误 { if (++s_at_error_count >= NUM_AT_ERROR) { s_at_error_count = 0; s_init_state = S_INIT_ASK_IMEI; //下一步开始查询IMEI set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_INIT_ATS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_ASK_IMEI: //开始查询IMEI号 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_IMEI, strlen(c_AT_IMEI), cst_AT_No_AT_IMEI); s_init_state = S_INIT_ASK_IMEI_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间) } } break; case S_INIT_ASK_IMEI_R://等待IMEI应答 { if (NbiotCheckAtAck() == UART_OK)//返回正确的应答 { s_at_error_count = 0; s_init_state = S_INIT_ASK_CIMI; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_CIMI_ERROR) { s_at_error_count = 0; s_init_state = S_INIT_ASK_CIMI; set_timer_1ms(2 * AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_INIT_ASK_IMEI; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_ASK_CIMI://开始查询CIMI { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CIMI, strlen(c_AT_CIMI), cst_AT_No_AT_CIMI); s_init_state = S_INIT_ASK_CIMI_R; set_timer_1ms(3*AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间) } } break; case S_INIT_ASK_CIMI_R://等待CIMI应答 { if (NbiotCheckAtAck() == UART_OK)//返回正确的应答 { s_at_error_count = 0; s_init_state = S_INIT_ASK_ICCID; //开始查询ICCID set_timer_1ms(2*AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_CIMI_ERROR) { s_at_error_count = 0; s_init_state = S_INIT_ASK_ICCID; //开始查询ICCID set_timer_1ms(2*AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_INIT_ASK_CIMI; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_ASK_ICCID://开始查询ICCID { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_ICCID, strlen(c_AT_ICCID), cst_AT_No_AT_ICCID); s_init_state = S_INIT_ASK_ICCID_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间) } } break; case S_INIT_ASK_ICCID_R://等待ICCID应答 { if (NbiotCheckAtAck() == UART_OK)//返回正确的应答 { s_at_error_count = 0; //将IMEI IMSI ICCID 转换并拷贝到全局RAM sys_get_three_code(); s_init_state = S_INIT_CMEE; //下一步打开ERROR错误代码显示 set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_ICCID_ERROR) { s_at_error_count = 0; s_init_state = S_INIT_CMEE; //下一步打开ERROR错误代码显示 set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_INIT_ASK_ICCID; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_CMEE: // { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CMEE, strlen(c_AT_CMEE), cst_AT_No_AT_CMEE); s_init_state = S_INIT_CMEE_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间) } } break; case S_INIT_CMEE_R://等待CMEE应答 { if (NbiotCheckAtAck() == UART_OK)//返回正确的应答 { s_at_error_count = 0; s_init_state = S_TCP_CPSMS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_CMEE_ERROR) { s_at_error_count = 0; s_init_state = S_TCP_CPSMS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_INIT_CMEE; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_TCP_CPSMS://设置关闭PSM模式 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CPSMS, strlen(c_AT_CPSMS), cst_AT_No_AT_CPSMS); s_init_state = S_TCP_CPSMS_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_TCP_CPSMS_R: { if (NbiotCheckAtAck() == UART_OK)//应答正确-下一步 { s_at_error_count = 0; s_init_state = S_TCP_NPTWEDRXS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_CPSMS_ERROR) { s_at_error_count = 0; s_init_state = S_TCP_NPTWEDRXS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_TCP_CPSMS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_TCP_NPTWEDRXS://关闭eDRX模式 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_NPTWEDRXS, strlen(c_AT_NPTWEDRXS), cst_AT_No_AT_NPTWEDRXS); s_init_state = S_TCP_NPTWEDRXS_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_TCP_NPTWEDRXS_R://关闭eDRX模式 --等待应答 { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_init_state = S_INIT_AT_CGDCONT; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_NPTWEDRXS_ERROR) { s_at_error_count = 0; s_init_state = S_INIT_AT_CGDCONT; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_TCP_NPTWEDRXS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_AT_CGDCONT: { if(!check_timer_1ms()) { u8 ip_apn = 19; int i; for(i = 0; i < Sys_data_object.P1.apn[1]; i++) { c_AT_CGDCONT_APN[ip_apn++] = Sys_data_object.P1.apn[2 + i]; } c_AT_CGDCONT_APN[ip_apn++] = '"'; c_AT_CGDCONT_APN[ip_apn++] = '\r'; NbiotUartSend((u8*) c_AT_CGDCONT_APN, ip_apn, cst_AT_No_AT_CGDCONT); set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); s_init_state = S_INIT_AT_CGDCONT_R; } } break; case S_INIT_AT_CGDCONT_R: { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); s_init_state = S_INIT_ASK_CSQ; } else if ((NbiotCheckAtAck() == UART_ERROR) || (!check_timer_1ms())) { s_at_error_count++; if (s_at_error_count >= AT_ERROR) { s_at_error_count = 0; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); s_init_state = S_INIT_ASK_CSQ; } else { s_init_state = S_INIT_AT_CGDCONT; } } } break; case S_INIT_ASK_CSQ://查询CSQ { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CSQ, strlen(c_AT_CSQ), cst_AT_No_AT_CSQ); s_init_state = S_INIT_ASK_CSQ_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间) } } break; case S_INIT_ASK_CSQ_R://等待CSQ应答 { if (NbiotCheckAtAck() == UART_OK)//返回正确的应答 { s_at_error_count = 0; s_init_state = S_INIT_ASK_CEREG; //开始查询CEREG set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_CSQ_ERROR) { s_at_error_count = 0; s_init_state = S_INIT_ASK_CEREG; //开始查询CEREG set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_INIT_ASK_CSQ; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_ASK_CEREG://开始查询CEREG { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CEREG, strlen((const char*) c_AT_CEREG), cst_AT_No_AT_CEREG); s_init_state = S_INIT_ASK_CEREG_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME * 2); } } break; case S_INIT_ASK_CEREG_R://等待CEREG应答 { if (NbiotCheckAtAck() == UART_OK)//正确应答 { s_at_error_count = 0; s_init_state = S_INIT_SET_NCFG; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR))//应答超时 { /*u8 NB_login_ask_times = FrameCheckParaApp(FramePara_NbParaLoginAckTimes); if (NB_login_ask_times < 30) { NB_login_ask_times = 30; } if (NB_login_ask_times > 150) { NB_login_ask_times = 150; } if (++s_at_error_count >= NB_login_ask_times)*/ if (++s_at_error_count >= NUM_AT_CEREG_ERROR) { s_at_error_count = 0; s_init_state = S_INIT_SET_NCFG; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_init_state = S_INIT_ASK_CEREG; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_SET_NCFG: { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_NCFG, strlen((const char*) c_AT_NCFG), cst_AT_No_AT); s_init_state = S_INIT_SET_NCFG_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME * 2); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间) } } break; case S_INIT_SET_NCFG_R: { if (NbiotCheckAtAck() == UART_OK)//正确应答 { s_init_state = S_INIT_ASK_CGATT; } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR))//应答超时 { s_init_state = S_INIT_ASK_CGATT; } } break; case S_INIT_ASK_CGATT://开始查询CGATT { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CGATT, strlen(c_AT_CGATT), cst_AT_No_AT_CGATT_how); s_init_state = S_INIT_ASK_CGATT_R; set_timer_1ms(2*AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间) } } break; case S_INIT_ASK_CGATT_R://等待CGATT应答 { if (NbiotCheckAtAck() == UART_OK)//正确应答 { s_at_error_count = 0; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); s_init_state = S_INIT_ASK_NUESTATS; } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR))//应答超时 { u8 NB_login_ask_times = FrameCheckParaApp(FramePara_NbParaLoginAckTimes); if (NB_login_ask_times < 30) { NB_login_ask_times = 30; } if (NB_login_ask_times > 150) { NB_login_ask_times = 150; } if (++s_at_error_count >= NB_login_ask_times) { s_at_error_count = 0; g_s_nbiot_task_flag = TASK_FAIL; //初始化失败 s_init_state = S_INIT_POWER_ON; } else { s_init_state = S_INIT_ASK_CGATT; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_ASK_NUESTATS: { if(!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_NUESTATS, strlen(c_AT_NUESTATS), cst_AT_No_AT_NUESTATS); set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); s_init_state = S_INIT_ASK_NUESTATS_R; } } break; case S_INIT_ASK_NUESTATS_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); s_init_state = S_INIT_ASK_CCLK; } else if(!check_timer_1ms()) { //返回错误的应答或者定时时间到 s_at_error_count++; if (s_at_error_count >= NUM_AT_ECL_ERROR) { s_at_error_count = 0; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); s_init_state = S_INIT_ASK_CCLK; } else { s_init_state = S_INIT_ASK_NUESTATS; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_INIT_ASK_CCLK://开始查询网络时间 { if(!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CCLK, strlen(c_AT_CCLK), cst_AT_No_AT_CCLK); s_init_state = S_INIT_ASK_CCLK_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_INIT_ASK_CCLK_R://等待应答 { if (NbiotCheckAtAck() == UART_OK)//正确应答 { s_at_error_count = 0; g_s_nbiot_task_flag = TASK_SUCCESS; //初始化成功 s_init_state = S_INIT_POWER_ON; // 任务指针返回 } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR))//应答超时 { if (++s_at_error_count >= NUM_AT_CCLK_ERROR) { s_at_error_count = 0; g_s_nbiot_task_flag = TASK_SUCCESS; //初始化成功 s_init_state = S_INIT_POWER_ON; // 任务指针返回 } else { s_init_state = S_INIT_ASK_CCLK; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; default: { s_at_error_count = 0; s_init_state = S_INIT_POWER_ON; } break; } } void NbiotInitMachine(void) { NbiotInitMachine_BC28(); } // void CoapStartConnect(void) { s_coap_connect_state = S_COAP_CONNECT_START; } /*************************************************************************** * @fun_name static void CoapConnectMachine() * @brief 连接Coap状态机 ***************************************************************************/ void CoapConnectMachine_BC25(void) { static u8 s_at_error_count = 0; unsigned char *nbiot_ip; u16 nbiot_port; //static char c_AT_NCDP[50] = "AT+NCDPOPEN=\"117.060.157.137\",05683\r"; // static char c_AT_NCDP[50] = "AT+NCDP=117.060.157.137,05683\r"; // //static const char* c_AT_NCDP_CK = "AT+NMSTATUS?\r"; // static const char* c_AT_QLWSREGIND = "AT+QLWSREGIND=0\r"; // switch (s_coap_connect_state) { case S_COAP_CONNECT_START: //任务开始 { s_at_error_count=0; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); if(getRegindState()==TRUE)//已经连接,则跳过连接服务器 { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ONLINE; s_coap_connect_state = S_COAP_CONNECT_START; g_s_nbiot_task_flag = TASK_SUCCESS; } else { s_coap_connect_state = S_COAP_NCDP; } } break; case S_COAP_NCDP: { if (!check_timer_1ms()) { u16 len = 8; nbiot_port = coap_port; nbiot_ip = coap_ip; //IP 的存储仍然使用水表原来格式,不保存“.”号,使用时加入 for (int i = 0; i < 4; i++) { if (nbiot_ip[i] < 10) { c_AT_NCDP[len++] = nbiot_ip[i] + 0x30; } else if (nbiot_ip[i] < 100) { c_AT_NCDP[len++] = (nbiot_ip[i] / 10) + 0x30; c_AT_NCDP[len++] = (nbiot_ip[i] % 10) + 0x30; } else { c_AT_NCDP[len++] = (nbiot_ip[i] / 100) + 0x30; c_AT_NCDP[len++] = (nbiot_ip[i] / 10) % 10 + 0x30; c_AT_NCDP[len++] = (nbiot_ip[i] % 10) + 0x30; } c_AT_NCDP[len++] = '.'; } len--; //消除多余的点号 c_AT_NCDP[len++] = ','; c_AT_NCDP[len++] = ((nbiot_port) / 10000) + 0x30; c_AT_NCDP[len++] = (((nbiot_port) % 10000) / 1000) + 0x30; c_AT_NCDP[len++] = (((nbiot_port) % 1000) / 100) + 0x30; c_AT_NCDP[len++] = (((nbiot_port) % 100) / 10) + 0x30; c_AT_NCDP[len++] = ((nbiot_port) % 10) + 0x30; c_AT_NCDP[len++] = '\r'; NbiotUartSend((u8*)c_AT_NCDP, len, cst_AT_No_AT_NCDP); set_timer_1s(2); s_coap_connect_state = S_COAP_NCDP_R; } } break; case S_COAP_NCDP_R: { if(getRegindState()==TRUE)//跳过连接服务器 { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ONLINE; s_coap_connect_state = S_COAP_CONNECT_START; g_s_nbiot_task_flag = TASK_SUCCESS; } else { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_coap_connect_state = S_COAP_NCDP_CK; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if (!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR) { s_at_error_count++; if (s_at_error_count >= NUM_AT_NCDP_ERROR)// { //一般不会发生,肯定能查到返回结果 s_at_error_count = 0; s_coap_connect_state = S_COAP_NCDP_CK; set_timer_1s(2); } else { s_coap_connect_state = S_COAP_NCDP; } } } } break; case S_COAP_NCDP_CK: { if(!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_QLWSREGIND, strlen(c_AT_QLWSREGIND), cst_AT_No_AT_NCDP_CK); set_timer_1s(35); s_coap_connect_state = S_COAP_NCDP_CK_R; } } break; case S_COAP_NCDP_CK_R: { if(getRegindState()==TRUE)//跳过连接服务器 { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ONLINE; s_coap_connect_state = S_COAP_CONNECT_START; g_s_nbiot_task_flag = TASK_SUCCESS; } else if((!check_timer_1s())) { s_at_error_count++; if (s_at_error_count >= NUM_AT_NCDP_CK_ERROR) { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ERROR; s_coap_connect_state = S_COAP_CONNECT_START; g_s_nbiot_task_flag = TASK_FAIL; } else { s_coap_connect_state = S_COAP_NCDP_CK; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; default: { s_coap_connect_state = S_COAP_CONNECT_START; //状态机回归初始状态 } break; } } void CoapConnectMachine() { CoapConnectMachine_BC25(); } void StartNbiotSendData(void) { if(g_s_nbiot_send_type == SEND_TYPE_COAP) { if(Nbiot_Para.Telecom == SIM_CARD_MOBILE)//移动卡 { StartOnenetSendData(); } else//电信卡 { StartCoapSendData(); //数据发送状态机 } } else if(g_s_nbiot_send_type == SEND_TYPE_UDP1) { StartUdpSendData(); //数据发送状态机 // UdpStartCheckData();//查询UDP数据 } else if(g_s_nbiot_send_type == SEND_TYPE_UDP2) { StartUdpSendData(); //数据发送状态机 // UdpStartCheckData();//查询UDP数据 } } #if SEND_ACKID_ENABLE u16 Send_AckID = 0; #endif // void StartCoapSendData(void) { s_coap_send_state = S_SEND_START; } void CoapSendDataMachine_BC25(void) { static u8 s_at_error_count = 0; //AT指令累计发送失败次数 static const u8 temp_AT_Buffer[]= {"AT+NMGS="}; static const char* c_AT_ACK = "AT+NSMI=1\r";//不保存 switch (s_coap_send_state) { case S_SEND_START: { s_coap_send_state = S_SEND_DATA; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); if((Sys_data_object.P1.func_cfg_bytes[10] == 0x55)||(Sys_data_object.P3.ProductUploadFlag == 0x55))//ACK判上报成功 { s_coap_send_state = S_SEND_ACK; } else { s_coap_send_state = S_SEND_DATA; } } break; case S_SEND_ACK://ACK { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_ACK, strlen(c_AT_ACK), cst_AT_No_AT); s_coap_send_state = S_SEND_ACK_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_SEND_ACK_R: { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_coap_send_state = S_SEND_DATA; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) //应答超时或者错误 { s_coap_send_state = S_SEND_DATA; } } break; case S_SEND_DATA: { if (!check_timer_1ms()) { u16 len = 8; //整条AT指令的长度,根据发送长度的位数来定 int i; for(i=0; i<8; i++) { c_AT_NMGS[i]=temp_AT_Buffer[i]; } c_AT_NMGS[len++] = (Nbiot_Send_Data.len / 10000) + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 10000) / 1000 + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 1000) / 100 + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 100) / 10 + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 10) + 0x30; c_AT_NMGS[len++] = ','; //内容 for (i = 0; i < Nbiot_Send_Data.len; i++)//获取发送数据内容 { if ((*(Nbiot_Send_Data.buf + i) >> 4) >= 0x0A) { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) >> 4) + 0x37; } else { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) >> 4) + 0x30; } if ((*(Nbiot_Send_Data.buf + i) & 0x0F) >= 0x0A) { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) & 0x0F) + 0x37; } else { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) & 0x0F) + 0x30; } } if((Sys_data_object.P1.func_cfg_bytes[12]&0x80)&&(Sys_data_object.P1.func_cfg_bytes[12]&0x03)) //PSM模式上报判断 { c_AT_NMGS[len++] = ','; c_AT_NMGS[len++] = '1'; c_AT_NMGS[len++] = '0'; c_AT_NMGS[len++] = '1';//c_AT_NMGS[len++] = '2'; c_AT_NMGS[len++] = '\r'; NbiotUartSend((u8*) c_AT_NMGS, len, cst_AT_No_AT_NMGS_ACKID); } else { if((Sys_data_object.P1.func_cfg_bytes[10] == 0x55)||(Sys_data_object.P3.ProductUploadFlag == 0x55))//ACK判上报成功 { c_AT_NMGS[len++] = ','; c_AT_NMGS[len++] = '1'; c_AT_NMGS[len++] = '0'; c_AT_NMGS[len++] = '0'; c_AT_NMGS[len++] = '\r'; NbiotUartSend((u8*) c_AT_NMGS, len, cst_AT_No_AT_NMGS_ACKID); } else { c_AT_NMGS[len++] = '\r'; NbiotUartSend((u8*) c_AT_NMGS, len, cst_AT_No_AT_NMGS); } } set_timer_1s(4); s_coap_send_state = S_SEND_DATA_R; } } break; case S_SEND_DATA_R: { if (NbiotCheckAtAck() == UART_OK) //返回正确的应答 { s_at_error_count = 0; g_s_nbiot_task_flag = TASK_SUCCESS; *Nbiot_Send_Data.state = NBIOT_SUCCESS; s_coap_send_state = S_SEND_START; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1s())) { s_at_error_count++; if (s_at_error_count >= 1) { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ERROR; g_s_nbiot_task_flag = TASK_FAIL; s_coap_send_state = S_SEND_START; } else { s_coap_send_state = S_SEND_DATA_R; } } } break; default: { s_coap_send_state = S_SEND_START; } break; } } void CoapSendDataMachine(void) { CoapSendDataMachine_BC25(); } //启动连接UDP void UdpStartConnect(u8 udp_num) { nbiot_temp_connect_type = udp_num; s_udp_connect_state = S_UDP_CONNECT_START; } /*************************************************************************** * @fun_name void UdpConnectMachine(void) * @brief 连接UDP状态机 ***************************************************************************/ u8 temp_udp_socket1 = '0'; u8 temp_udp_socket2 = '1'; static void UdpConnectMachine_BC28(void) { static u8 s_at_error_count = 0; static u8 c_AT_NSOCR[]="AT+NSOCR=DGRAM,17,12345"; const char* c_AT_NSONMI="AT+NSONMI=3\r"; switch (s_udp_connect_state) { case S_UDP_CONNECT_IDLE: { break; } case S_UDP_CONNECT_START: { s_at_error_count = 0; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); s_udp_connect_state = S_UDP_CONNECT_NSONMI; } break; case S_UDP_CONNECT_NSONMI: { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_NSONMI, strlen(c_AT_NSONMI), cst_AT_No_AT_NSONMI);//设置是否显示可选长度参数 s_udp_connect_state = S_UDP_CONNECT_NSONMI_R; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } break; case S_UDP_CONNECT_NSONMI_R: { if (NbiotCheckAtAck() == UART_OK)//应答正确-下一步 { s_at_error_count = 0; s_udp_connect_state = S_UDP_CONNECT_NSOCR; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= NUM_AT_NSONMI_ERROR) { s_at_error_count = 0; s_udp_connect_state = S_UDP_CONNECT_NSOCR; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_udp_connect_state = S_UDP_CONNECT_NSONMI; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_UDP_CONNECT_NSOCR: { u16 len = 18; //整条AT指令的长度,根据发送长度的位数来定 if (!check_timer_1ms()) { //local端口号 c_AT_NSOCR[len++] = '1'; c_AT_NSOCR[len++] = '2'; c_AT_NSOCR[len++] = '3'; c_AT_NSOCR[len++] = '4'; if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP1) { c_AT_NSOCR[len++] = '1'; } else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP2) { c_AT_NSOCR[len++] = '2'; } c_AT_NSOCR[len++] = '\r'; NbiotUartSend((u8*) c_AT_NSOCR, len, cst_AT_No_AT_NSOCR); set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); s_udp_connect_state = S_UDP_CONNECT_NSOCR_R; } } break; case S_UDP_CONNECT_NSOCR_R: { if (NbiotCheckAtAck() == UART_OK) { if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP1) { temp_udp_socket1 = getTempUdpCode(); } else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP2) { temp_udp_socket2 = getTempUdpCode(); } s_udp_connect_state = S_UDP_CONNECT_IDLE; g_s_nbiot_task_flag = TASK_SUCCESS; } else if (!check_timer_1ms() || NbiotCheckAtAck() == UART_ERROR) { s_udp_connect_state = S_UDP_CONNECT_IDLE; g_s_nbiot_task_flag = TASK_FAIL; } } break; default: { g_s_nbiot_task_flag = TASK_FAIL; s_udp_connect_state = S_UDP_CONNECT_IDLE; break; } } } void UdpConnectMachine(void) { UdpConnectMachine_BC28(); } // void StartUdpSendData(void) { s_udp_send_state = S_UDP_SEND_START; } // //AT+NSOST=1,118.123.19.67,40001,13,30313233343536373839415344 static void UdpSendDataMachine_BC28(void) { unsigned char *nbiot_ip; u16 nbiot_port; u16 len = 0;//9; //整条AT指令的长度,根据发送长度的位数来定 int i; switch (s_udp_send_state) { case S_UDP_SEND_IDLE: { } break; case S_UDP_SEND_START: { set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); s_udp_send_state = S_UDP_SEND_NSOFT; } break; case S_UDP_SEND_NSOFT: { if (!check_timer_1ms()) { //内容 if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP1) { nbiot_port = udp_port1; nbiot_ip = udp_ip1; } else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP2) { nbiot_port = udp_port2; nbiot_ip = udp_ip2; } len = 0; c_AT_NMGS[len++] = 'A'; c_AT_NMGS[len++] = 'T'; c_AT_NMGS[len++] = '+'; c_AT_NMGS[len++] = 'N'; c_AT_NMGS[len++] = 'S'; c_AT_NMGS[len++] = 'O'; c_AT_NMGS[len++] = 'S'; c_AT_NMGS[len++] = 'T'; c_AT_NMGS[len++] = '='; if(g_s_nbiot_send_type == SEND_TYPE_UDP1) { c_AT_NMGS[len++] = temp_udp_socket1;//socket范围为0~6 } else if(g_s_nbiot_send_type == SEND_TYPE_UDP2) { c_AT_NMGS[len++] = temp_udp_socket2;//socket范围为0~6 } c_AT_NMGS[len++] = ','; //IP for (i = 0; i < 4; i++) { if (nbiot_ip[i] < 10) { c_AT_NMGS[len++] = nbiot_ip[i] + 0x30; } else if (nbiot_ip[i] < 100) { c_AT_NMGS[len++] = (nbiot_ip[i] / 10) + 0x30; c_AT_NMGS[len++] = (nbiot_ip[i] % 10) + 0x30; } else { c_AT_NMGS[len++] = (nbiot_ip[i] / 100) + 0x30; c_AT_NMGS[len++] = (nbiot_ip[i] / 10) % 10 + 0x30; c_AT_NMGS[len++] = (nbiot_ip[i] % 10) + 0x30; } c_AT_NMGS[len++] = '.'; } //端口号 len--; //消除多余的点号 c_AT_NMGS[len++] = ','; c_AT_NMGS[len++] = (nbiot_port / 10000) + 0x30; c_AT_NMGS[len++] = (nbiot_port % 10000) / 1000 + 0x30; c_AT_NMGS[len++] = (nbiot_port % 1000) / 100 + 0x30; c_AT_NMGS[len++] = (nbiot_port % 100) / 10 + 0x30; c_AT_NMGS[len++] = (nbiot_port % 10) + 0x30; c_AT_NMGS[len++] = ','; //长度 c_AT_NMGS[len++] = (Nbiot_Send_Data.len / 10000) + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 10000) / 1000 + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 1000) / 100 + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 100) / 10 + 0x30; c_AT_NMGS[len++] = (Nbiot_Send_Data.len % 10) + 0x30; c_AT_NMGS[len++] = ','; //内容 for (i = 0; i < Nbiot_Send_Data.len; i++) { if ((*(Nbiot_Send_Data.buf + i) >> 4) >= 0x0A) { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) >> 4) + 0x37; } else { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) >> 4) + 0x30; } if ((*(Nbiot_Send_Data.buf + i) & 0x0F) >= 0x0A) { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) & 0x0F) + 0x37; } else { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) & 0x0F) + 0x30; } } c_AT_NMGS[len++] = '\r'; NbiotUartSend((u8*) c_AT_NMGS, len, cst_AT_No_AT_NMGS); set_timer_1s(4); s_udp_send_state = S_UDP_SEND_NSOFT_R; } } break; case S_UDP_SEND_NSOFT_R: { if(NbiotCheckAtAck() == UART_OK) { *Nbiot_Send_Data.state = NBIOT_SUCCESS; g_s_nbiot_task_flag = TASK_SUCCESS; s_udp_send_state = S_UDP_SEND_IDLE; } else if(!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR) { *Nbiot_Send_Data.state = NBIOT_ERROR; g_s_nbiot_task_flag = TASK_FAIL; s_udp_send_state = S_UDP_SEND_IDLE; } } break; default: break; } } void UdpSendDataMachine(void) { UdpSendDataMachine_BC28(); } void UdpReadDataMachine_BC25(void) { static u8 s_error_count; //AT指令累计发送失败次数 static u8 s_read_upd_data_state = S_START; static const char* c_AT_QIRD1 = "AT+NSORF=0,512\r"; static const char* c_AT_QIRD2 = "AT+NSORF=1,512\r"; switch (s_read_upd_data_state) { case S_START: { set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME*2); s_error_count = 0; s_read_upd_data_state = S_AT_QIRD; } break; case S_AT_QIRD: { if (!check_timer_1ms()) { if(GetRcvDataType() == NB_RCV_UDP1_DATA) { NbiotUartSend((u8*) c_AT_QIRD1, strlen((const char*) c_AT_QIRD1), cst_AT_No_AT_UPD_READ); } else if(GetRcvDataType() == NB_RCV_UDP2_DATA) { NbiotUartSend((u8*) c_AT_QIRD2, strlen((const char*) c_AT_QIRD2), cst_AT_No_AT_UPD_READ); } set_timer_1ms(5*AT_COMMAND_RECEIVE_WAIT_TIME); s_read_upd_data_state = S_AT_QIRD_R; } } break; case S_AT_QIRD_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 *Nbiot_Send_Data.state = QIRD_SUCCESS; g_s_nbiot_task_flag = TASK_SUCCESS; s_read_upd_data_state = S_START; } else if (!check_timer_1ms()) { //返回错误的应答或者定时时间到 s_error_count++; if (s_error_count >= 3) { s_error_count = 0; *Nbiot_Send_Data.state = QIRD_ERROR; g_s_nbiot_task_flag = TASK_FAIL; s_read_upd_data_state = S_START; } else { set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME*5); s_read_upd_data_state = S_AT_QIRD; } } } break; default: { s_read_upd_data_state = S_START; } break; } } void UdpReadDataMachine(void) { UdpReadDataMachine_BC25(); } // //OnenetConnectMachine u8 s_onenet_connect_state=0; void OneNetStartConnect(void) { s_onenet_connect_state = S_ONENET_CONNECT_START; } /*************************************************************************** * @fun_name static void CoapConnectMachine() * @brief 连接Coap状态机 ***************************************************************************/ void OnenetConnectMachine(void) { static u8 s_at_error_count = 0; unsigned char *nbiot_ip; u16 nbiot_port; static char c_AT_MIPLCONFIG[40]="AT+MIPLCONFIG=0,183.230.040.040,05683\r"; static const char* c_AT_MIPLCONFIG_CK="AT+MIPLCONFIG?\r";//+MIPLCONFIG: 0,183.230.40.40,5683 +MIPLCONFIG: 2,2 +MIPLCONFIG: 3,1 +MIPLCONFIG: 4,0,1 static const char* c_AT_MIPLCREATE="AT+MIPLCREATE\r"; static const char* c_AT_MIPLADDOBJ = "AT+MIPLADDOBJ=0,3200,1,\"1\",4,2\r"; static const char* c_AT_MIPLOPEN ="AT+MIPLOPEN=0,600,60\r"; static const char* c_AT_MIPLOPENPSM ="AT+MIPLOPEN=0,172800,60\r"; static char c_AT_MIPLDISCOVERRSP[30];// AT+MIPLDISCOVERRSP=0,48839,1,4,"5750" switch (s_onenet_connect_state) { case S_ONENET_CONNECT_IDLE: { break; } case S_ONENET_CONNECT_START: //任务开始 { s_at_error_count=0; s_onenet_connect_state = S_ONENET_MIPLCONFIG; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } break; case S_ONENET_MIPLCONFIG: { if (!check_timer_1ms()) { u16 len = 16; //整条AT指令的长度,根据发送长度的位数来定 nbiot_port = Sys_data_object.P1.server_port.datas; nbiot_ip = Sys_data_object.P1.server_ip; //IP 的存储仍然使用水表原来格式,不保存“.”号,使用时加入 int i; for (i = 0; i < 4; i++) { if (nbiot_ip[i] < 10) { c_AT_MIPLCONFIG[len++] = nbiot_ip[i] + 0x30; } else if (nbiot_ip[i] < 100) { c_AT_MIPLCONFIG[len++] = (nbiot_ip[i] / 10) + 0x30; c_AT_MIPLCONFIG[len++] = (nbiot_ip[i] % 10) + 0x30; } else { c_AT_MIPLCONFIG[len++] = (nbiot_ip[i] / 100) + 0x30; c_AT_MIPLCONFIG[len++] = (nbiot_ip[i] / 10) % 10 + 0x30; c_AT_MIPLCONFIG[len++] = (nbiot_ip[i] % 10) + 0x30; } c_AT_MIPLCONFIG[len++] = '.'; } len--; //消除多余的点号 c_AT_MIPLCONFIG[len++] = ','; //c_AT_MIPLCONFIG[len++] = ((nbiot_port) / 10000) + 0x30; c_AT_MIPLCONFIG[len++] = (((nbiot_port) % 10000) / 1000) + 0x30; c_AT_MIPLCONFIG[len++] = (((nbiot_port) % 1000) / 100) + 0x30; c_AT_MIPLCONFIG[len++] = (((nbiot_port) % 100) / 10) + 0x30; c_AT_MIPLCONFIG[len++] = ((nbiot_port) % 10) + 0x30; c_AT_MIPLCONFIG[len++] = '\r'; NbiotUartSend((u8*)c_AT_MIPLCONFIG, len, cst_AT_No_AT_MIPLCONFIG); set_timer_1s(5); s_onenet_connect_state = S_ONENET_MIPLCONFIG_R; } } break; case S_ONENET_MIPLCONFIG_R: { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLCONFIG_CK; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if (!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR) { s_at_error_count++; if (s_at_error_count >= NUM_AT_MIPLCONF_ERROR)// { //一般不会发生,肯定能查到返回结果 s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLCONFIG_CK; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_onenet_connect_state = S_ONENET_MIPLCONFIG; } } } break; case S_ONENET_MIPLCONFIG_CK: { if (!check_timer_1ms()) { if(TASK_IDLE == UartIfIdle(NB_UART_COM)) { NbiotUartSend((u8*)c_AT_MIPLCONFIG_CK, strlen(c_AT_MIPLCONFIG_CK), cst_AT_No_AT_MIPLCONFIG_CK); s_onenet_connect_state = S_ONENET_MIPLCONFIG_CK_R; set_timer_1s(2); } } } break; case S_ONENET_MIPLCONFIG_CK_R: { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLCREATE; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if (!check_timer_1s()) { s_at_error_count++; if (s_at_error_count >= NUM_AT_MIPLCONF_ERROR)// { //一般不会发生,肯定能查到返回结果 s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLCREATE; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_onenet_connect_state = S_ONENET_MIPLCONFIG_CK; } } } break; case S_ONENET_MIPLCREATE: { if(!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_MIPLCREATE, strlen(c_AT_MIPLCREATE), cst_AT_No_AT_MIPLCREATE); set_timer_1s(2); s_onenet_connect_state = S_ONENET_MIPLCREATE_R; } } break; case S_ONENET_MIPLCREATE_R: { if(NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLADDOBJ; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if(!check_timer_1s()) { s_at_error_count++; if (s_at_error_count >= NUM_AT_MIPLCREATE_ERROR) { s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLADDOBJ; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_onenet_connect_state = S_ONENET_MIPLCREATE; set_timer_1s(2); } } } break; case S_ONENET_MIPLADDOBJ: { if(!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_MIPLADDOBJ, strlen(c_AT_MIPLADDOBJ), cst_AT_No_AT_MIPLADDOBJ); set_timer_1s(2); s_onenet_connect_state = S_ONENET_MIPLADDOBJ_R; } } break; case S_ONENET_MIPLADDOBJ_R: { if(NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLOPEN; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if((!check_timer_1s())) { s_at_error_count++; if (s_at_error_count >= NUM_AT_MIPLADDOBJ_ERROR) { s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLOPEN; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_onenet_connect_state = S_ONENET_MIPLADDOBJ; } } } break; case S_ONENET_MIPLOPEN: { if(!check_timer_1ms()) { if((Sys_data_object.P1.func_cfg_bytes[12]&0x80)&&(Sys_data_object.P1.func_cfg_bytes[12]&0x03)) //PSM模式上报判断 { NbiotUartSend((u8*) c_AT_MIPLOPENPSM, strlen(c_AT_MIPLOPENPSM), cst_AT_No_AT_MIPLOPEN); } else { NbiotUartSend((u8*) c_AT_MIPLOPEN, strlen(c_AT_MIPLOPEN), cst_AT_No_AT_MIPLOPEN); } set_timer_1s(10); s_onenet_connect_state = S_ONENET_MIPLOPEN_R; } } break; case S_ONENET_MIPLOPEN_R: { if(NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; NbiotClearAtAck(); NbiotSetRevMipldiscover(); set_timer_1s(20); s_onenet_connect_state = S_ONENET_MIPLDISCOVER; } else if((!check_timer_1s())) { s_at_error_count++; if (s_at_error_count >= NUM_AT_MIPLOPEN_ERROR) { set_timer_1s(5); s_at_error_count = 0; s_onenet_connect_state = S_ONENET_MIPLDISCOVER; } else { s_onenet_connect_state = S_ONENET_MIPLOPEN; set_timer_1s(1); } } } break; case S_ONENET_MIPLDISCOVER: //static char c_AT_MIPLDISCOVERRSP[30];// AT+MIPLDISCOVERRSP=0,48839,1,4,"5750" { if (NbiotCheckAtAck() == UART_OK) { u8 len; char discover_num[10]; memset(discover_num,0,sizeof(discover_num)); memset(c_AT_MIPLDISCOVERRSP,0,sizeof(c_AT_MIPLDISCOVERRSP)); strcpy(c_AT_MIPLDISCOVERRSP,"AT+MIPLDISCOVERRSP=0,"); NbiotGetDiscover_num(discover_num); strcat(c_AT_MIPLDISCOVERRSP,discover_num); strcat(c_AT_MIPLDISCOVERRSP,",1,4,\"5750\"\r"); len = strlen(c_AT_MIPLDISCOVERRSP); NbiotUartSend((u8*)c_AT_MIPLDISCOVERRSP, len, cst_AT_No_AT); set_timer_1s(5); s_onenet_connect_state = S_ONENET_MIPLDISCOVER_R; } else if(!check_timer_1s()) { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ERROR; g_s_nbiot_task_flag = TASK_FAIL; //到此为止任务成功 s_onenet_connect_state = S_ONENET_CONNECT_IDLE; } } break; case S_ONENET_MIPLDISCOVER_R://应答接收到数据--等待响应 { if(NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ONLINE; g_s_nbiot_task_flag = TASK_SUCCESS; //到此为止任务成功 s_onenet_connect_state = S_ONENET_CONNECT_IDLE; } else if((!check_timer_1s())) { s_at_error_count++; if (s_at_error_count >= NUM_AT_MIPLDISCOVERRSP_ERROR) { s_at_error_count = 0; *Nbiot_Send_Data.state = NBIOT_ONLINE; g_s_nbiot_task_flag = TASK_SUCCESS; //到此为止任务成功 s_onenet_connect_state = S_ONENET_CONNECT_IDLE; } else { NbiotClearAtAck(); NbiotSetRevMipldiscover(); s_onenet_connect_state = S_ONENET_MIPLDISCOVER; set_timer_1s(5); } } } break; default: { s_onenet_connect_state = S_ONENET_CONNECT_IDLE; //状态机回归初始状态 } break; } } #if SEND_ACKID_ENABLE u16 Send_AckID=0; #endif //Onnet发送数据状态机 #define S_ONENET_SEND_START 0 #define S_ONENET_SEND_DATA 1 #define S_ONENET_SEND_DATA_R 2 u8 s_onenet_send_state = S_ONENET_SEND_START; void StartOnenetSendData(void) { s_onenet_send_state = S_ONENET_SEND_START; } u8 Send_AckID=0; void OneNetSendDataMachine(void) { // static u8 s_at_error_count=0; //AT指令累计发送失败次数 static const char temp_AT_MIPLDISCOVERRSP[] = "AT+MIPLNOTIFY=0,0,3200,0,5750,1,"; //static char c_AT_MIPLNOTIFY[50+SEND_DATA_LENGTH];//内存不足,使用公用发送缓存 c_AT_NMGS switch (s_onenet_send_state) { case S_ONENET_SEND_START: { s_onenet_send_state = S_ONENET_SEND_DATA; //收到数据立即进行数据发送,模块会报ERROR,因此延时1S,消除此ERROR set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } break; case S_ONENET_SEND_DATA://发送数据 { if (!check_timer_1ms()) { if(TASK_IDLE == UartIfIdle(NB_UART_COM)) { //u16 len = 31; //整条AT指令的长度,根据发送长度的位数来定 u16 len,i,len_Gprs_Send_Data; char len_buffer[6]={0}; c_AT_NMGS[0]=0;//强制归零 strcat(c_AT_NMGS,temp_AT_MIPLDISCOVERRSP); len_Gprs_Send_Data=2*Nbiot_Send_Data.len; sprintf(len_buffer,"%u",len_Gprs_Send_Data); strcat(c_AT_NMGS,len_buffer); strcat(c_AT_NMGS,",\""); len=strlen(c_AT_NMGS); for (i = 0; i < Nbiot_Send_Data.len; i++)//获取发送数据内容 { if ((*(Nbiot_Send_Data.buf + i) >> 4) >= 0x0A) { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) >> 4) + 0x37;//字符转换 } else { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) >> 4) + 0x30;//数字转换 } if ((*(Nbiot_Send_Data.buf + i) & 0x0F) >= 0x0A) { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) & 0x0F) + 0x37; } else { c_AT_NMGS[len++] = (*(Nbiot_Send_Data.buf + i) & 0x0F) + 0x30; } } c_AT_NMGS[len++] = 0;//手动加字符串结束符防止意外溢出 strcat(c_AT_NMGS,"\",0,0"); if((Sys_data_object.P1.func_cfg_bytes[10] == 0x55)||(Sys_data_object.P3.ProductUploadFlag == 0x55))//ACK判上报成功 { char strtemp[8]; if(++Send_AckID==0) { Send_AckID=1; } sprintf(strtemp,",%u",Send_AckID); strcat(c_AT_NMGS,strtemp); strcat(c_AT_NMGS,"\r"); NbiotClearMsg(); NbiotUartSend((u8*) c_AT_NMGS,strlen(c_AT_NMGS), cst_AT_No_AT_MIPLNOTIFY_ACKID); } else { strcat(c_AT_NMGS,"\r"); NbiotClearMsg(); NbiotUartSend((u8*) c_AT_NMGS,strlen(c_AT_NMGS), cst_AT_No_AT_MIPLNOTIFY); } s_onenet_send_state = S_ONENET_SEND_DATA_R; set_timer_1ms(5*AT_COMMAND_RECEIVE_WAIT_TIME); //发送数据延时较长5倍时间等待 } } } break; case S_ONENET_SEND_DATA_R: { if (NbiotCheckAtAck() == UART_OK) //返回正确的应答 { g_s_nbiot_task_flag = TASK_SUCCESS; *Nbiot_Send_Data.state = NBIOT_SUCCESS; s_onenet_send_state = S_ONENET_SEND_START; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms()))//返回错误的应答或者定时时间到 { *Nbiot_Send_Data.state = NBIOT_ERROR; g_s_nbiot_task_flag = TASK_FAIL; s_onenet_send_state = S_ONENET_SEND_START; } } break; default: break; } } /*************************************************************************** * @fun_name static void NbiotPowerOffMachine() * @brief 关机状态机 ***************************************************************************/ void NbiotPowerOffMachine(void) //先注销网络然后断电关机 { //关机流程 static u8 s_at_error_count = 0; static const char* c_AT_MIPLCLOSE = "AT+MIPLCLOSE=0\r"; //登录注销流程 static const char* c_AT_MIPLDELOBJ = "AT+MIPLDELOBJ=0,3200\r"; //模组侧订阅资源列表释放 static const char* c_AT_MIPLDEL = "AT+MIPLDELETE=0\r"; //模组侧通信实例删除 static const char* c_AT_CFUN0 = "AT+CFUN=0\r"; //设置最小功能模式 static const char* c_AT_NCSEARFCN = "AT+NCSEARFCN\r"; //清除已保存频点 static const char* c_AT_CFUN1 = "AT+CFUN=1\r"; //设置正常功能模式 //static const char* c_AT_NETCLOSE = "AT+NCDPCLOSE\r"; static const char* c_AT_COPS = "AT+COPS=2\r"; //从注册网络注销 static const u8 c_AT_QPOWD[] = "AT+QPOWD=1\r";//模组正常关机 switch (s_power_off_state) { case S_POWER_OFF_START: { s_at_error_count = 0; if (Nbiot_Para.net_state == NB_ON_LINE) { Nbiot_Para.net_state = NB_OFF_LINE; Nbiot_Para.coap_state = CONNECT_OFF_LINE; Nbiot_Para.udp1_state = CONNECT_OFF_LINE; Nbiot_Para.udp2_state = CONNECT_OFF_LINE; if(Nbiot_Para.Telecom == SIM_CARD_MOBILE) { s_power_off_state = S_AT_QPOWD; } else { s_power_off_state = S_AT_NETCLOSE; } set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_power_off_state = S_AT_CFUN0; } } break; case S_AT_MIPLCLOSE://登录注销流程 //注销指令改为5s,重试2次 { if(!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_MIPLCLOSE, strlen(c_AT_MIPLCLOSE), cst_AT_No_AT_MIPLCLOSE); s_power_off_state = S_AT_MIPLCLOSE_R; set_timer_1ms(5*AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_AT_MIPLCLOSE_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; s_power_off_state = S_AT_MIPLDELOBJ; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms())) { //返回错误的应答或者定时时间到 if (++s_at_error_count >= NUM_AT_MIPLCLOSE_ERROR) { s_at_error_count = 0; *Nbiot_Send_Data.state = cst_AT_No_AT_MIPLCLOSE; s_power_off_state = S_AT_MIPLDELOBJ; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_power_off_state = S_AT_MIPLCLOSE; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_AT_MIPLDELOBJ://模组侧订阅资源列表释放 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_MIPLDELOBJ, strlen(c_AT_MIPLDELOBJ), cst_AT_No_AT_MIPLDELOBJ); s_power_off_state = S_AT_MIPLDELOBJ_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_AT_MIPLDELOBJ_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; s_power_off_state = S_AT_MIPLDEL; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms())) { //返回错误的应答或者定时时间到 if (++s_at_error_count >= NUM_AT_MIPLDEL_ERROR) { s_at_error_count = 0; *Nbiot_Send_Data.state = cst_AT_No_AT_MIPLDELOBJ; s_power_off_state = S_AT_MIPLDEL; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } else { s_power_off_state = S_AT_MIPLDELOBJ; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_AT_MIPLDEL://模组侧订阅资源列表释放 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_MIPLDEL, strlen(c_AT_MIPLDEL), cst_AT_No_AT_MIPLDEL); s_power_off_state = S_AT_MIPLDEL_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_AT_MIPLDEL_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; s_power_off_state = S_AT_NETCLOSE; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms())) { //返回错误的应答或者定时时间到 if (++s_at_error_count >= NUM_AT_MIPLDEL_ERROR) { s_at_error_count = 0; *Nbiot_Send_Data.state = cst_AT_No_AT_MIPLDEL; s_power_off_state = S_AT_NETCLOSE; } else { s_power_off_state = S_AT_MIPLDEL; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; case S_AT_NETCLOSE: { if(Nbiot_Para.Telecom == SIM_CARD_MOBILE) { s_power_off_state = S_AT_QPOWD; } else { NbiotUartSend((u8*) c_AT_COPS, strlen(c_AT_COPS), cst_AT_No_AT_COPS); set_timer_1s(3); s_power_off_state = S_AT_NETCLOSE_R; } } break; case S_AT_NETCLOSE_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; set_timer_1s(1); s_power_off_state = S_AT_QPOWD; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1s())) { //返回错误的应答或者定时时间到 s_at_error_count++; if (s_at_error_count >= 2) //两次不成功直接关机 { s_at_error_count = 0; s_power_off_state = S_AT_QPOWD; //关机命令 } else { s_power_off_state = S_AT_NETCLOSE; } } } break; case S_AT_QPOWD: { if (!check_timer_1s()) { NbiotUartSend((u8*) c_AT_QPOWD, strlen((const char*) c_AT_QPOWD), cst_AT_No_AT_QPOWD); set_timer_1s(3); s_power_off_state = S_AT_QPOWD_R; } } break; case S_AT_QPOWD_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; set_timer_1s(1); s_power_off_state = S_POWER_OFF; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1s())) { //返回错误的应答或者定时时间到 s_at_error_count++; if (s_at_error_count >= 2) //两次不成功直接关机 { s_at_error_count = 0; s_power_off_state = S_POWER_OFF; //直接去关机 } else { s_power_off_state = S_AT_QPOWD; } } } break; case S_AT_CFUN0://设置模组最小功能模式 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CFUN0, strlen((const char*) c_AT_CFUN0), cst_AT_No_AT_CFUN); s_power_off_state = S_AT_CFUN0_R; set_timer_1ms(2 * AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_AT_CFUN0_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; set_timer_1ms( AT_COMMAND_SEND_INTERVAL_TIME); s_power_off_state = S_AT_NCSEARFCN; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms())) { //返回错误的应答或者定时时间到 if (++s_at_error_count >= NUM_AT_CFUN_ERROR) { s_at_error_count = 0; s_power_off_state = S_AT_NCSEARFCN; } else { s_power_off_state = S_AT_CFUN0; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } } break; case S_AT_NCSEARFCN://清除频点 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_NCSEARFCN, strlen((const char*) c_AT_NCSEARFCN), cst_AT_No_AT_NCSEARFCN); s_power_off_state = S_AT_NCSEARFCN_R; set_timer_1ms(2 * AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_AT_NCSEARFCN_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; set_timer_1ms( AT_COMMAND_SEND_INTERVAL_TIME*6);//清频后延时3秒 s_power_off_state = S_AT_CFUN1; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms())) { //返回错误的应答或者定时时间到 if (++s_at_error_count >= NUM_AT_NCSEARFCN_ERROR) { s_at_error_count = 0; s_power_off_state = S_AT_CFUN1; } else { s_power_off_state = S_AT_NCSEARFCN; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } } break; case S_AT_CFUN1://设置模组正常功能模式 { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_CFUN1, strlen((const char*) c_AT_CFUN1), cst_AT_No_AT_CFUN); s_power_off_state = S_AT_CFUN1_R; set_timer_1ms(2 * AT_COMMAND_RECEIVE_WAIT_TIME); } } break; case S_AT_CFUN1_R: { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 s_at_error_count = 0; set_timer_1s(1); s_power_off_state = S_AT_QPOWD; } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms())) { //返回错误的应答或者定时时间到 if (++s_at_error_count >= NUM_AT_CFUN_ERROR) { s_at_error_count = 0; set_timer_1s(1); s_power_off_state = S_AT_QPOWD; } else { s_power_off_state = S_AT_CFUN1; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); } } } break; case S_POWER_OFF: { if (!check_timer_1s()) { NB_Power_Disable(); //切断电源 set_timer_1s(1); s_power_off_state = S_POWER_OFF_WAIT; Nbiot_Para.net_state = NB_OFF_LINE; Nbiot_Para.coap_state = CONNECT_OFF_LINE; Nbiot_Para.udp1_state = CONNECT_OFF_LINE; Nbiot_Para.udp2_state = CONNECT_OFF_LINE; } } break; case S_POWER_OFF_WAIT: { if (!check_timer_1s()) { NbiotPreSleep(); g_s_nbiot_task_flag = TASK_SUCCESS; s_power_off_state = S_START; } } break; default: { s_power_off_state = S_START; } break; } } void NbiotReadECLSNRMachine(void) { static u8 s_error_count; //AT指令累计发送失败次数 static u8 s_ecl_state = S_START; switch (s_ecl_state) { case S_START: { set_timer_1ms(1000); s_error_count = 0; s_ecl_state = S_AT_ECL; } break; case S_AT_ECL: { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_NUESTATS, strlen((const char*) c_AT_NUESTATS), cst_AT_No_AT_NUESTATS); set_timer_1ms(500); s_ecl_state = S_AT_ECL_R; } } break; case S_AT_ECL_R: { if (!check_timer_1ms()) { if (NbiotCheckAtAck() == UART_OK) { //返回正确的应答 *Nbiot_Send_Data.state = ECL_SNR_SUCCESS; g_s_nbiot_task_flag = TASK_SUCCESS; s_ecl_state = S_START; } else { //返回错误的应答或者定时时间到 s_error_count++; if (s_error_count >= 1) { s_error_count = 0; *Nbiot_Send_Data.state = ECL_SNR_ERROR; g_s_nbiot_task_flag = TASK_FAIL; s_ecl_state = S_START; } else { s_ecl_state = S_AT_ECL; } } } } break; default: { s_ecl_state = S_START; } break; } } /*****************************ONENET应答下发指令*********************/ static u8 s_onenet_ack_rev_state = S_ONENET_ACKREV_START; static void StartOnenetAckRev(void) { s_onenet_ack_rev_state = S_ONENET_ACKREV_START; } /******************************************************* NbiotRevAckMachine 对接收到的指令先应答 *******************************************************/ void NbiotRevAckMachine(void) { static u8 s_error_count; //AT指令累计发送失败次数 static char c_AT_MIPLWRITE_EXECUTE[30];// = "AT+MIPLWRITERSP=0,12345,2\r"; //static char c_AT_MIPLEXECUTE[30];// = "AT+MIPLEXECUTERSP=0,12345,2\r"; switch (s_onenet_ack_rev_state) { case S_ONENET_ACKREV_IDLE: { } break; case S_ONENET_ACKREV_START: { set_timer_1ms(1000); s_onenet_ack_rev_state = S_ONENET_REPLY_REV_ACKID; s_error_count = 0; } break; case S_ONENET_REPLY_REV_ACKID://应答接收到数据 { u8 len; char ack_num[10]; if (!check_timer_1ms()) { memset(ack_num,0,sizeof(ack_num)); memset(c_AT_MIPLWRITE_EXECUTE,0,sizeof(c_AT_MIPLWRITE_EXECUTE)); if(ORDER_EXECUTE == NbiotGetOnenetTypeDownOrder()) { strcpy(c_AT_MIPLWRITE_EXECUTE,"AT+MIPLEXECUTERSP=0,"); } else { strcpy(c_AT_MIPLWRITE_EXECUTE,"AT+MIPLWRITERSP=0,"); } NbiotGetWriteAck_num(ack_num); strcat(c_AT_MIPLWRITE_EXECUTE,ack_num); strcat(c_AT_MIPLWRITE_EXECUTE,",2\r"); len = strlen(c_AT_MIPLWRITE_EXECUTE); NbiotUartSend((u8*)c_AT_MIPLWRITE_EXECUTE, len, cst_AT_No_AT_MIPLWRITE); set_timer_1ms(5*AT_COMMAND_RECEIVE_WAIT_TIME); s_onenet_ack_rev_state = S_ONENET_REPLY_REV_ACKID_R; } } break; case S_ONENET_REPLY_REV_ACKID_R://应答接收到数据--等待响应 { if (NbiotCheckAtAck() == UART_OK) { g_s_nbiot_task_flag = TASK_SUCCESS; s_onenet_ack_rev_state = S_ONENET_ACKREV_IDLE; SetUartCommRevFlag(); //应答写命名完成--进行数据处理 } else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms()))//返回错误的应答或者定时时间到 { if (++s_error_count >= NUM_AT_MIPLWRITE_ERROR) { *Nbiot_Send_Data.state = cst_AT_No_AT_MIPLWRITE; g_s_nbiot_task_flag = TASK_FAIL; s_onenet_ack_rev_state = S_ONENET_ACKREV_IDLE; } else { s_onenet_ack_rev_state = S_ONENET_REPLY_REV_ACKID; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; default: break; } } /*************************************************************************** * @fun_name void PsmWakupMachine(void) * @brief 唤醒PSM ***************************************************************************/ static void Psm_Wakup_Machine(void) { static const char *c_AT_QSCLK = "AT+QSCLK=0\r"; //临时关闭深度休眠功能,进行NB通信 static const char *c_AT_QPING = "AT+CSCON=1\r";//"AT+NPING=8.8.8.8,1,1\r";//+CSCON: 1 触发模组与基站交互后查询信号值 static const char* c_AT_NCDP_CK = "AT+NMSTATUS?\r"; //查询信号值 static const char* c_AT_UPDATE_LIFETIME = "AT+MIPLUPDATE?\r"; //ONNET更新lifetime static u8 s_at_error_count = 0; switch(s_psm_wakeup_state) { //硬件唤醒:当模块处于PSM模式时,拉低PSM_EINT(下降沿>100ms)可将模块从 PSM 唤醒 case PSM_WKUPSTA_IDLE: { } break; case PSM_WKUPSTA_START: { UartInit(NB_UART_COM, BAUD9600, DATA_BIT_8, STOPBIT_1, UART_NONE_PARITY,UART_LPUART_Disable); NB_PSM_WAKE_HIG(); set_timer_1ms(500); s_psm_wakeup_state= PSM_WKUPSTA_EINT_LOW; } break; case PSM_WKUPSTA_EINT_LOW: { if (!check_timer_1ms()) { NB_PSM_WAKE_LOW(); set_timer_1ms(500); s_psm_wakeup_state= PSM_WKUPSTA_EINT_HIGH; } } break; case PSM_WKUPSTA_EINT_HIGH: { if (!check_timer_1ms()) { NB_PSM_WAKE_HIG(); NbiotUartSend(0, 0, cst_AT_No_AT_NCDP);//查询+QLWEVTIND状态 set_timer_1ms(5000);//5s,超时等待5s,信号差的时候+QLWEVTIND: 6响应也很快,但PING和上报都失败 s_psm_wakeup_state= PSM_WKUPSTA_QLWEVTIND6; } } break; case PSM_WKUPSTA_QLWEVTIND6://检查深度睡眠唤醒连接恢复成功 +QLWEVTIND: 6, { if (NbiotCheckAtAck() == UART_OK) { set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); s_psm_wakeup_state = PSM_WKUPSTA_QSCLK0; } else if (!check_timer_1ms()) { s_psm_wakeup_state = PSM_WKUPSTA_WAKE_FAIL; } } break; //模块进入工作模式 case PSM_WKUPSTA_QSCLK0: { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_QSCLK, strlen(c_AT_QSCLK), cst_AT_QSCLK_CLOSE); s_at_error_count = 0; set_timer_1ms(2000); s_psm_wakeup_state = PSM_WKUPSTA_QSCLK0_R; } } break; case PSM_WKUPSTA_QSCLK0_R: { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_psm_wakeup_state = PSM_WKUPSTA_NUESTATS;//PSM_WKUPSTA_NCDP_CK; } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { if (++s_at_error_count >= 3) { s_at_error_count = 0; s_psm_wakeup_state = PSM_WKUPSTA_WAKE_FAIL; } else { s_psm_wakeup_state = PSM_WKUPSTA_QSCLK0; set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME); } } } break; //检查连接服务器是否成功 case PSM_WKUPSTA_NCDP_CK: { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_NCDP_CK, strlen((const char*) c_AT_NCDP_CK), cst_AT_No_AT_NCDP_CK); set_timer_1s(3); s_psm_wakeup_state = PSM_WKUPSTA_NCDP_CK_R; } } break; case PSM_WKUPSTA_NCDP_CK_R://应答的应该是模组保存的状态,跟本次唤醒是否真正成功连到服务无关.+NMSTATUS: REGISTERED_AND_OBSERVED { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_psm_wakeup_state = PSM_WKUPSTA_NPING; } else if((!check_timer_1s())) { s_at_error_count++; if (s_at_error_count >=3) { s_at_error_count = 0; s_psm_wakeup_state = PSM_WKUPSTA_WAKE_FAIL; } else { s_psm_wakeup_state = PSM_WKUPSTA_NCDP_CK; } } } break; //PING /*当返回+CSCON:1---标准模组与基站建立链接 后执行AT+QENG=0查询---此时在模组与基站建立链接的状态下查询信号*/ case PSM_WKUPSTA_NPING: { if (!check_timer_1ms()) { NbiotUartSend((u8*) c_AT_QPING, strlen((const char*) c_AT_QPING), cst_AT_No_CSCON1); set_timer_1s(5); s_psm_wakeup_state = PSM_WKUPSTA_NPING_R; } } break; case PSM_WKUPSTA_NPING_R: { if (NbiotCheckAtAck() == UART_OK) { s_at_error_count = 0; s_psm_wakeup_state = PSM_WKUPSTA_NUESTATS; } else if((!check_timer_1s())) { s_psm_wakeup_state = PSM_WKUPSTA_NUESTATS; } } break; //更新信号值 case PSM_WKUPSTA_NUESTATS: { if (!check_timer_1s()) { NbiotUartSend((u8*) c_AT_NUESTATS, strlen(c_AT_NUESTATS), cst_AT_No_AT_NUESTATS); set_timer_1s(2); s_psm_wakeup_state = PSM_WKUPSTA_NUESTATS_R; } } break; case PSM_WKUPSTA_NUESTATS_R: { if (NbiotCheckAtAck() == UART_OK) { s_psm_wakeup_state = PSM_WKUPSTA_UPDATE;//PSM_WKUPSTA_WAKE_SUCCESS; } else if((!check_timer_1s())) { s_psm_wakeup_state = PSM_WKUPSTA_UPDATE;//PSM_WKUPSTA_WAKE_SUCCESS; } } break; //移动更新lifetime case PSM_WKUPSTA_UPDATE://更新lifetime { if (!check_timer_1s()) { NbiotUartSend((u8*) c_AT_UPDATE_LIFETIME, strlen(c_AT_UPDATE_LIFETIME), cst_AT_No_AT); set_timer_1s(10); s_psm_wakeup_state = PSM_WKUPSTA_UPDATE_R; } } break; case PSM_WKUPSTA_UPDATE_R://定制对象--等待应答 { if (NbiotCheckAtAck() == UART_OK) { s_psm_wakeup_state = PSM_WKUPSTA_WAKE_SUCCESS; } else if((!check_timer_1s())) { s_psm_wakeup_state = PSM_WKUPSTA_WAKE_FAIL; } } break; case PSM_WKUPSTA_WAKE_SUCCESS: { psm_model_state = PSM_STATE_WAKE; g_s_nbiot_task_flag = TASK_SUCCESS; //初始化成功 s_psm_wakeup_state = PSM_WKUPSTA_IDLE; } break; case PSM_WKUPSTA_WAKE_FAIL: { NbForcePowerOff(); psm_model_state = PSM_STATE_OUT; g_s_nbiot_task_flag = TASK_FAIL; s_psm_wakeup_state = PSM_WKUPSTA_IDLE; } break; default: { s_psm_wakeup_state = PSM_WKUPSTA_IDLE; } break; } } /*************************************************************************** * @fun_name void Psm_Sleep_Machine(void) * @brief 进入低功耗模式 ***************************************************************************/ static void Psm_Sleep_Machine(void) { static const char* c_AT_CPSMS1 = "AT+CPSMS=1\r"; //开启PSM模式 static const char c_AT_QSCLK1[] = "AT+QSCLK=1\r"; //开启深度休眠功能,进行NB通信 switch(s_psm_sleep_state) { case PSM_SLPSTA_IDLE: { } break; case PSM_SLPSTA_START://设置关闭或打开PSM模式 { NbiotUartSend((u8*) c_AT_CPSMS1, strlen(c_AT_CPSMS1), cst_AT_No_AT_CPSMS);//使用PSM s_init_state = S_TCP_CPSMS_R; set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); s_psm_sleep_state = PSM_SLPSTA_CPSMS1_R; } break; case PSM_SLPSTA_CPSMS1_R: { if (NbiotCheckAtAck() == UART_OK)//应答正确-下一步 { NbiotUartSend((u8*) c_AT_QSCLK1, strlen(c_AT_QSCLK1), cst_AT_No_AT);//cst_AT_QSCLK_OPEN); s_psm_sleep_state = PSM_SLPSTA_WAIT; set_timer_1s(30); //进入休眠模式30s超时等待 } else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR)) { NbForcePowerOff(); psm_model_state = PSM_STATE_OUT; g_s_nbiot_task_flag = TASK_FAIL; s_psm_sleep_state = PSM_SLPSTA_IDLE; } } break; case PSM_SLPSTA_WAIT://等待应答 +QATSLEEP { if (NbiotCheckAtAck() == UART_OK)//应答正确-下一步 { psm_model_state = PSM_STATE_SLEEP; g_s_nbiot_task_flag = TASK_SUCCESS; s_psm_sleep_state = PSM_SLPSTA_IDLE; } else if ((!check_timer_1s()) || (NbiotCheckAtAck() == UART_ERROR)) { NbForcePowerOff(); psm_model_state = PSM_STATE_OUT; g_s_nbiot_task_flag = TASK_FAIL; s_psm_sleep_state = PSM_SLPSTA_IDLE; } } break; case PSM_CHECK_START: { if(TASK_IDLE == AdcIfIdle()) { AdcStartConvert(PSM_CHECK_CHANNEL, PSM_CHECK_NUM, PSM_CHECK_INTERVAL, &s_psm_adc_result, &s_psm_adc_done); s_psm_sleep_state =PSM_CHECK_WAIT; } } break; case PSM_CHECK_WAIT: { if (TRUE == s_psm_adc_done) { if (ADC_OK == AdcGetStatus()) { if(s_psm_adc_result>1500)//大于1V左右 { NbForcePowerOff(); psm_model_state = PSM_STATE_OUT; } g_s_nbiot_task_flag = TASK_SUCCESS; s_psm_sleep_state = PSM_SLPSTA_IDLE; } } } break; default: { NbForcePowerOff(); psm_model_state = PSM_STATE_OUT; g_s_nbiot_task_flag = TASK_SUCCESS; s_psm_sleep_state = PSM_SLPSTA_IDLE; } break; } } /*************************************************************************** * @fun_name 定时器资源 * @brief 该内部接口主要为了方便记忆及使用 ***************************************************************************/ void set_timer_1s(u16 time) { Set100msTimer(TIMER_100MS_NBIOT, time * 10); } u16 check_timer_1s(void) { return Check100msTimer(TIMER_100MS_NBIOT); } void set_timer_1ms(u16 time) { Set5msTimer(TIMER_5MS_NBIOT, time / 5); } u16 check_timer_1ms(void) { return Check5msTimer(TIMER_5MS_NBIOT); } /*************************************************************************** * @fun_name void StartPowerOffTask() * @brief 关机接口 ***************************************************************************/ void StartPowerOffTask(void) { g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_POWER_OFF; s_power_off_state = S_POWER_OFF_START; } //NB强制关机 void NbForcePowerOff(void) { NB_Power_Disable(); Nbiot_Para.net_state = NB_OFF_LINE; Nbiot_Para.coap_state = CONNECT_OFF_LINE; Nbiot_Para.udp1_state = CONNECT_OFF_LINE; Nbiot_Para.udp2_state = CONNECT_OFF_LINE; g_s_nbiot_task_flag = TASK_INIT; g_s_nbiot_main_state = NBIOT_S_IDLE; } void set_clear_ncsearfcn (void) { flag_clear_ncsearfcn =1; } void sys_get_three_code (void) { // NbiotGetIMEI(Sys_data_object.P1.NB_module_IMEI_0016); // NbiotGetIMSI(Sys_data_object.P1.NB_module_IMSI); // NbiotGetICCID(Sys_data_object.P1.SIMCard_ICCID_200A); } UNION_4U8TOU32 net_state_data; u32 sys_get_net_state(void) { s16 s_temp_data=0; if(g_s_nbiot_main_state == NBIOT_POWER_INIT) { net_state_data.data_buf[0] = 1; net_state_data.data_buf[1] = s_init_state; //net_state_buf[2]CEREG //net_state_buf[3]cgatt } else if(g_s_nbiot_main_state == NBIOT_NET_OPEN) { net_state_data.data_buf[0] = 2; if(Nbiot_Para.Telecom == SIM_CARD_TELECOM) { net_state_data.data_buf[1] = s_coap_connect_state; } else { net_state_data.data_buf[1] = s_onenet_connect_state; } } else if(If_NB_Poweron()==FALSE) { net_state_data.data_buf[0] = 3; //rsrp NbiotGetRSRP(&s_temp_data); net_state_data.data_buf[1] = -(s_temp_data/10); //SNR NbiotGetSNR(&s_temp_data); if(s_temp_data<0) { net_state_data.data_buf[2] = (-s_temp_data/10)|0x80; } else { net_state_data.data_buf[2] = s_temp_data/10; } //CSQ NbiotGetCSQ(&net_state_data.data_buf[3]); } return net_state_data.datas; } void sys_set_net_state(u8 state, u8 data) { net_state_data.data_buf[state] = data; } TYP_PSM_STATE getPsmState(void) { return psm_model_state; } u16 get_Send_AckID(void) { return Send_AckID; } #ifdef __cplusplus } #endif #endif