P8UWaterPlasticIES4G/hardinterface/E7025/nb_driver_E7025.c

3401 lines
102 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************************
* @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_E7025
#ifdef __cplusplus
extern "C"
{
#endif
#include "nb_uart_driver_e7025.h"
#include "nb_driver_e7025.h"
#include "stdio.h"
#include <time.h>
#include "UWater_timer1uS_driver.h"
#include "UWater_uart_driver.h"
#include "UWater_Rtcc_Driver.h"
#include "UWater_frame_app.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;
u8 s_udp_connect_state = S_UDP_CONNECT_START;
u8 s_coap_send_state = S_SEND_START;
u8 s_udp_send_state = S_SEND_START;
u8 s_power_off_state = S_START;
char c_AT_NMGS[40 + UP_BUF_SIZE*2];//发送数据长度较小
//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;
/*****************************内部功能状态机***********************************/
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 sys_get_net_state (void);
void OnenetConnectMachine(void);
void OneNetSendDataMachine(void);
void StartOnenetAckRev(void);
void NbiotRevAckMachine(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 TcpStartConnect(void);
void TcpConnectMachine(void);
void TcpSendDataMachine(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:
{
if(TRUE == UdpIfNeedReadData())
{
ClearUdpReadDataFlag();
g_s_nbiot_main_state = NBIOT_READ_UDP_DATA;
}
if(TRUE == NbiotGetRevAck())//收到ONNET下发的数据,先进入应答流程应答一下
{
ClearNbiotGetRevAck();
StartOnenetAckRev();
g_s_nbiot_main_state = NBIOT_REV_ACK;
}
}
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
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 //任务失败
{
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_COAP)
{
/*if(Nbiot_Para.Telecom == SIM_CARD_MOBILE)//移动卡
{
OnenetConnectMachine();//与ONNET平台建立连接状态机
}
else//电信卡
{
CoapConnectMachine(); //与主站建立连接状态机
} */
TcpConnectMachine(); //与主站建立连接状态机
}
else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP1)
{
UdpConnectMachine();
}
else if(nbiot_temp_connect_type == NBIOT_CONNECT_UDP2)
{
UdpConnectMachine();
}
/*else if(nbiot_temp_connect_type == NBIOT_CONNECT_COAP)
{
TcpConnectMachine(); //与主站建立连接状态机
}*/
else
{
g_s_nbiot_task_flag = TASK_INIT;
g_s_nbiot_main_state = NBIOT_S_IDLE;
}
}
else if (TASK_SUCCESS == g_s_nbiot_task_flag)
{
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;
}
/*else if (nbiot_temp_connect_type == NBIOT_CONNECT_TCP1)
{
Nbiot_Para.tcp1_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(); //数据发送状态机
}*/
TcpSendDataMachine(); //数据发送状态机
}
else if(g_s_nbiot_send_type == SEND_TYPE_UDP1)
{
UdpSendDataMachine(); //数据发送状态机
}
else if(g_s_nbiot_send_type == SEND_TYPE_UDP2)
{
UdpSendDataMachine(); //数据发送状态机
}
/*else if(g_s_nbiot_send_type == SEND_TYPE_TCP1)
{
TcpSendDataMachine(); //数据发送状态机
}*/
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_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;
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;
}
}
/*else if(connect_type == NBIOT_CONNECT_TCP1)
{
if (CONNECT_ON_LINE == Nbiot_Para.tcp1_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)
{
//Nbiot_Para.Telecom = SIM_CARD_TELECOM;//debug 强制改为电信平台通信
coap_ip = temp_ip;
coap_port = temp_port;
/*if(Nbiot_Para.Telecom == SIM_CARD_MOBILE)//移动卡
{
OneNetStartConnect();
}
else//电信卡
{
CoapStartConnect();
}*/
TcpStartConnect();
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);
}
/*else if(connect_type == NBIOT_CONNECT_TCP1)
{
coap_ip = temp_ip;
coap_port = temp_port;
TcpStartConnect();
}*/
g_s_nbiot_task_flag = TASK_INIT;
g_s_nbiot_main_state = NBIOT_NET_OPEN;
}
u8 getNB_NetConnectType(void)
{
return nbiot_temp_connect_type;
}
/***************************************************************************
* @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 NbiotTcpOpenTask(void)
{
if (NBIOT_S_IDLE == g_s_nbiot_main_state)
{
if(!TcpIfOnline())
{
g_s_nbiot_mode_flag = ONLINE_MODE;
g_s_nbiot_task_flag = TASK_INIT;
g_s_nbiot_main_state = NBIOT_TCP_OPEN;
TcpStartConnect();
}
}
}*/
void NbiotReadECLSNRTask(u8 *state)
{
if (NBIOT_S_IDLE == g_s_nbiot_main_state)
{
// g_s_ecl_val = out_ecl;
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
***************************************************************************/
void NbiotPreSleep(void)
{
NB_Power_Disable(); //切断电源
UartPreSleep(NB_UART_COM);
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;
//Nbiot_Para.tcp1_state = CONNECT_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);
}
/***************************************************************************
* @fun_name void NbiotWakeSleep()
* @brief 休眠后唤醒
* @param[in] None
* @param[out] None
* @retval None
* @other None
***************************************************************************/
void NbiotWakeSleep(void)
{
}
/***************************************************************************
* @fun_name u8 NbiotOfflineReason()
* @brief 查询NBIOT掉线原因
* @param[in] None
* @param[out] None
* @retval NBIOT参数改变心跳异常掉电掉线主站主动下线复位下线
* @other None
***************************************************************************/
//u8 NbiotOfflineReason(void)
//{
// return Nbiot_Para.offline_reason;
//}
/******************************内部状态机***********************************/
//
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
***************************************************************************/
#define MODULE_POWER_DELAY_TIME 1000 //mS
#define MODULE_RESET_DELAY_TIME 1000 //mS
//AT+QBAND AT+QBAND=1,5 //设置频段为 BAND 5
//中国移动的为:898600;898602;898604;898607 中国电信898603;898611
void NbiotInitMachine_E7025(void)
{
static u8 s_at_error_count = 0; //记录AT错误或者指令超时次数 超过指定次数后认为任务失败
static const char* c_ATE1 = "ATE1\r"; //E7025打开回显
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+ECICCID\r";//E7025
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\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_CGATT = "AT+CGATT?\r";
static const char* c_AT_ECCESQS = "AT+ECCESQS=0\r";//关闭信号更新报告
static const char* c_AT_ECSTATUS = "AT+ECSTATUS\r";//查询信号等关键参数
static u8 c_AT_CGDCONT_APN[APN_SIZE+50] = "AT+CGDCONT=1,\"IP\",\""; //指定APN,定义数组大小为固定20字节+APN数组大小再加预留空间
static const char* c_AT_CFUN0 = "AT+CFUN=0\r"; //设置最小功能模式
static const char* c_AT_CFUN1 = "AT+CFUN=1\r"; //设置正常功能模式
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_LOW();//模组复位使能
PWR_NB_HIG();//开机键不使能
NB_Power_Enable(); //打开电源延时1S,等待上电稳定
set_timer_1ms(MODULE_POWER_DELAY_TIME);
s_init_state = S_INIT_RESET_HIGH;//S_INIT_PWRKEY_LOW;
}
break;
case S_INIT_RESET_HIGH://完成复位NB模块
{
if (!check_timer_1ms())
{
RSTN_NB_HIG(); //高电平
s_init_state = S_INIT_POWER_ON_WAIT; //到时候查询CSQ和CEREG来确认搜网注册完成 已节约初始化时间 降低功耗
set_timer_1s(5); //等待NB模块搜网注册5S --5秒时间不够 此时可以继续进行其他任务
}
}
break;
case S_INIT_POWER_ON_WAIT://等待模块搜网注册延时
{
if (!check_timer_1s())
{
s_at_error_count = 0; //AT指令错误次数清零
s_init_state = S_INIT_ATS;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
}
break;
case S_INIT_ATS://打开回显, 确认模块正常运行
{
if (!check_timer_1ms())
{
NbiotUartSend((u8*) c_ATE1, strlen(c_ATE1), 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://等待"ATE1"应答
{
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(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_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();
if(0)//if(0 == Sys_data_object.product_test_state)
{
//Sys_data_object.product_test_state = 1; //单片机已经获取到三码,等待读取
s_init_state = S_INIT_POWER_ON;
g_s_nbiot_task_flag = TASK_INIT;
StartPowerOffTask(); //调用关机流程
}
else
{
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);
}
}
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_CFUN0://设置模组最小功能模式
{
if (!check_timer_1ms())
{
NbiotUartSend((u8*) c_AT_CFUN0, strlen((const char*) c_AT_CFUN0), cst_AT_No_AT_CFUN);
s_init_state = S_INIT_CFUN0_R;
set_timer_1ms(2 * AT_COMMAND_RECEIVE_WAIT_TIME);
}
}
break;
case S_INIT_CFUN0_R:
{
if (NbiotCheckAtAck() == UART_OK)
{
//返回正确的应答
s_at_error_count = 0;
set_timer_1ms( AT_COMMAND_SEND_INTERVAL_TIME);
s_init_state = S_INIT_AT_CGDCONT;
}
else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms()))
{
//返回错误的应答或者定时时间到
if (++s_at_error_count >= NUM_AT_CFUN_ERROR)
{
s_at_error_count = 0;
s_init_state = S_INIT_AT_CGDCONT;
}
else
{
s_init_state = S_INIT_CFUN0;
set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_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_CFUN1://设置模组正常功能模式
{
if (!check_timer_1ms())
{
NbiotUartSend((u8*) c_AT_CFUN1, strlen((const char*) c_AT_CFUN1), cst_AT_No_AT_CFUN);
s_init_state = S_INIT_CFUN1_R;
set_timer_1ms(2 * AT_COMMAND_RECEIVE_WAIT_TIME);
}
}
break;
case S_INIT_CFUN1_R:
{
if (NbiotCheckAtAck() == UART_OK)
{
//返回正确的应答
s_at_error_count = 0;
set_timer_1ms( AT_COMMAND_SEND_INTERVAL_TIME);
s_init_state = S_INIT_ASK_CSQ;
}
else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1ms()))
{
//返回错误的应答或者定时时间到
if (++s_at_error_count >= NUM_AT_CFUN_ERROR)
{
s_at_error_count = 0;
set_timer_1ms( AT_COMMAND_SEND_INTERVAL_TIME);
s_init_state = S_INIT_ASK_CSQ;
}
else
{
s_init_state = S_INIT_CFUN1;
set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME);
}
}
}
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_AT_ECCESQS;
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_AT_ECCESQS; //开始查询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_AT_ECCESQS://关闭信号更新报告
{
if (!check_timer_1s())
{
NbiotUartSend((u8*) c_AT_ECCESQS, strlen(c_AT_ECCESQS), cst_AT_No_AT_ECCESQS);
set_timer_1s(2);
s_init_state = S_INIT_AT_ECCESQS_R;
}
}
break;
case S_INIT_AT_ECCESQS_R:
{
if (!check_timer_1s())
{
if (NbiotCheckAtAck() == UART_OK)
{
//返回正确的应答
s_at_error_count = 0;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
s_init_state = S_INIT_AT_ECSTATUS;
}
else
{
//返回错误的应答或者定时时间到
s_at_error_count++;
if (s_at_error_count >= 2)
{
s_at_error_count = 0;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
s_init_state = S_INIT_AT_ECSTATUS;
}
else
{
s_init_state = S_INIT_AT_ECCESQS;
set_timer_1s(1);
}
}
}
}
break;
case S_INIT_AT_ECSTATUS://查询信号等关键参数
{
if (!check_timer_1ms())
{
NbiotUartSend((u8*)c_AT_ECSTATUS, strlen((const char*) c_AT_ECSTATUS), cst_AT_No_AT_ECSTATUS);
set_timer_1ms(4*AT_COMMAND_SEND_INTERVAL_TIME);//2s
s_init_state = S_INIT_AT_ECSTATUS_R;
}
}
break;
case S_INIT_AT_ECSTATUS_R:
{
if (!check_timer_1ms())
{
if (NbiotCheckAtAck() == UART_OK)
{
s_at_error_count = 0;
s_init_state = S_INIT_ASK_CEREG;
}
else
{
//返回错误的应答或者定时时间到
s_at_error_count++;
if (s_at_error_count >= 2)
{
s_at_error_count = 0;
s_init_state = S_INIT_ASK_CEREG;
}
else
{
s_init_state = S_INIT_AT_ECSTATUS;
}
}
}
}
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_ASK_CGATT;
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)
{
s_at_error_count = 0;
s_init_state = S_INIT_ASK_CGATT;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
else
{
s_init_state = S_INIT_ASK_CEREG;
set_timer_1ms(2 * AT_COMMAND_SEND_INTERVAL_TIME);
}
}
}
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(AT_COMMAND_RECEIVE_WAIT_TIME*2); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间)
}
}
break;
case S_INIT_ASK_CGATT_R://等待CGATT应答
{
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_CGATT_ERROR)
{
s_at_error_count = 0;
*Nbiot_Send_Data.state = NBIOT_ERROR;
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;
default:
{
s_at_error_count = 0;
s_init_state = S_INIT_POWER_ON;
}
break;
}
}
void NbiotInitMachine(void)
{
NbiotInitMachine_E7025();
}
//
void CoapStartConnect(void)
{
s_coap_connect_state = S_COAP_CONNECT_START;
}
/***************************************************************************
* @fun_name static void CoapConnectMachine()
* @brief 连接Coap状态机
***************************************************************************/
void CoapConnectMachine_E7025(void)
{
static u8 s_at_error_count = 0;
unsigned char *nbiot_ip;
u16 nbiot_port;
static char c_AT_CTM2MSETPM[50] = "AT+CTM2MSETPM=\"117.060.157.137\",05683,86400\r"; //配置电信IOT平台连接参数
static const char* c_AT_CTM2MREG = "AT+CTM2MREG\r"; //注册电信IOT平台
static const char* c_AT_CCLK = "AT+CCLK?\r"; //查询基站时间
switch (s_coap_connect_state)
{
case S_COAP_CONNECT_START:
{
s_at_error_count=0;
s_coap_connect_state = S_AT_CTM2MSET;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
break;
case S_AT_CTM2MSET://配置电信IOT平台连接参数
{
if (!check_timer_1ms())
{
u16 len = 15; //整条AT指令的长度根据发送长度的位数来定
nbiot_port = coap_port;
nbiot_ip = coap_ip;
//IP 的存储仍然使用水表原来格式,不保存“.”号,使用时加入
int i;
for (i = 0; i < 4; i++)
{
if (nbiot_ip[i] < 10)
{
c_AT_CTM2MSETPM[len++] = nbiot_ip[i] + 0x30;
}
else if (nbiot_ip[i] < 100)
{
c_AT_CTM2MSETPM[len++] = (nbiot_ip[i] / 10) + 0x30;
c_AT_CTM2MSETPM[len++] = (nbiot_ip[i] % 10) + 0x30;
}
else
{
c_AT_CTM2MSETPM[len++] = (nbiot_ip[i] / 100) + 0x30;
c_AT_CTM2MSETPM[len++] = (nbiot_ip[i] / 10) % 10 + 0x30;
c_AT_CTM2MSETPM[len++] = (nbiot_ip[i] % 10) + 0x30;
}
c_AT_CTM2MSETPM[len++] = '.';
}
len--; //消除多余的点号
c_AT_CTM2MSETPM[len++] = '\"';
c_AT_CTM2MSETPM[len++] = ',';
c_AT_CTM2MSETPM[len++] = ((nbiot_port) / 10000) + 0x30;
c_AT_CTM2MSETPM[len++] = (((nbiot_port) % 10000) / 1000) + 0x30;
c_AT_CTM2MSETPM[len++] = (((nbiot_port) % 1000) / 100) + 0x30;
c_AT_CTM2MSETPM[len++] = (((nbiot_port) % 100) / 10) + 0x30;
c_AT_CTM2MSETPM[len++] = ((nbiot_port) % 10) + 0x30;
c_AT_CTM2MSETPM[len++] = ',';
c_AT_CTM2MSETPM[len++] = '8';
c_AT_CTM2MSETPM[len++] = '6';
c_AT_CTM2MSETPM[len++] = '4';
c_AT_CTM2MSETPM[len++] = '0';
c_AT_CTM2MSETPM[len++] = '0';
c_AT_CTM2MSETPM[len++] = '\r';
NbiotUartSend((u8*)c_AT_CTM2MSETPM, len, cst_AT_No_AT_CTM2MSET);
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
s_coap_connect_state = S_AT_CTM2MSET_R;
}
}
break;
case S_AT_CTM2MSET_R:
{
if (NbiotCheckAtAck() == UART_OK)
{
s_at_error_count = 0;
s_coap_connect_state = S_AT_CTM2MREG;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
else if (!check_timer_1ms() || NbiotCheckAtAck() == UART_ERROR)
{
s_at_error_count++;
if (s_at_error_count >= NUM_AT_CTM2MSET_ERROR)//
{
s_at_error_count = 0;
s_coap_connect_state = S_AT_CTM2MREG;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
else
{
s_coap_connect_state = S_AT_CTM2MSET;
}
}
}
break;
case S_AT_CTM2MREG://注册电信IOT平台
{
if(!check_timer_1ms())
{
NbiotUartSend((u8*) c_AT_CTM2MREG, strlen(c_AT_CTM2MREG), cst_AT_No_AT_CTM2MREG);
set_timer_1s(8);
s_coap_connect_state = S_AT_CTM2MREG_R;
}
}
break;
case S_AT_CTM2MREG_R:
{
if (NbiotCheckAtAck() == UART_OK)
{
s_at_error_count = 0;
s_coap_connect_state = S_AT_COAP_CCLK;
set_timer_1s(1);
}
else if (!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR)
{
s_at_error_count++;
if (s_at_error_count >= NUM_AT_CTM2MREG_ERROR)//
{
*Nbiot_Send_Data.state = NBIOT_ERROR;
g_s_nbiot_task_flag = TASK_FAIL; //到此为止任务成功
s_at_error_count = 0;
set_timer_1s(1);
s_coap_connect_state = S_COAP_CONNECT_START; //状态机回归初始状态
}
else
{
set_timer_1ms(8*AT_COMMAND_SEND_INTERVAL_TIME);
s_coap_connect_state = S_AT_CTM2MREG;
}
}
}
break;
case S_AT_COAP_CCLK://开始查询网络时间
{
if (!check_timer_1s())
{
NbiotUartSend((u8*) c_AT_CCLK, strlen(c_AT_CCLK), cst_AT_No_AT_CCLK);
s_coap_connect_state = S_AT_COAP_CCLK_R;
set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间)
}
}
break;
case S_AT_COAP_CCLK_R://等待应答
{
if (NbiotCheckAtAck() == UART_OK)//正确应答
{
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_1ms()) || (NbiotCheckAtAck() == UART_ERROR))//应答超时
{
if (++s_at_error_count >= NUM_AT_CCLK_ERROR)
{
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_CCLK;
set_timer_1s(1);
}
}
}
break;
default:
{
s_coap_connect_state = S_COAP_CONNECT_START; //状态机回归初始状态
}
break;
}
}
void CoapConnectMachine(void)
{
CoapConnectMachine_E7025();
}
void StartNbiotSendData(void)
{
if(g_s_nbiot_send_type == SEND_TYPE_COAP)
{
/*if(Nbiot_Para.Telecom == SIM_CARD_MOBILE)//移动卡
{
StartOnenetSendData();
}
else//电信卡
{
StartCoapSendData(); //数据发送状态机
}*/
StartTcpSendData();
}
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_E7025(void)
{
static u8 s_at_error_count = 0; //AT指令累计发送失败次数
static const u8 temp_AT_Buffer[]= {"AT+CTM2MSEND="};
switch (s_coap_send_state)
{
case S_SEND_START:
{
s_coap_send_state = S_SEND_DATA; //收到数据立即进行数据发送模块会报ERROR因此延时1S消除此ERROR
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
break;
case S_SEND_DATA:
{
if (!check_timer_1ms())
{
u16 len = 13;//8; //整条AT指令的长度根据发送长度的位数来定
int i;
for(i=0; i<13; i++)
{
c_AT_NMGS[i]=temp_AT_Buffer[i];
}
//发送内容
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_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 >= 2)
{
s_at_error_count = 0;
*Nbiot_Send_Data.state = cst_AT_No_AT_NMGS;
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_E7025();
}
//启动连接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状态机
***************************************************************************/
void UdpConnectMachine_E7025(void)
{
static u8 s_at_error_count = 0;
static char c_AT_QIOPEN[100];
switch (s_udp_connect_state)
{
case S_UDP_CONNECT_START: //任务开始
{
s_at_error_count=0;
s_udp_connect_state = S_UDP_QIOPEN;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
break;
case S_UDP_QIOPEN:
{
if (!check_timer_1ms())
{
u16 len = 21; //整条AT指令的长度根据发送长度的位数来定
char strings_temp[50];
memset(c_AT_QIOPEN,0,sizeof(c_AT_QIOPEN));
memset(strings_temp,0,sizeof(strings_temp));
strcpy(c_AT_QIOPEN,"AT+ECSOCR=DGRAM,17,1234,1,AF_INET\r"); //UDP
len = strlen(c_AT_QIOPEN);
NbiotUartSend((u8*)c_AT_QIOPEN, len, cst_AT_No_AT_QIOPEN);
set_timer_1s(2);
s_udp_connect_state = S_UDP_QIOPEN_R;
}
}
break;
case S_UDP_QIOPEN_R:
{
if (NbiotCheckAtAck() == UART_OK)
{
s_at_error_count = 0;
s_udp_connect_state = S_UDP_Wait;
set_timer_1s(1);
}
else if (!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR)
{
s_at_error_count++;
if (s_at_error_count >= AT_ERROR)//
{
s_at_error_count = 0;
s_udp_connect_state = S_UDP_Wait;
set_timer_1s(1);
}
else
{
s_udp_connect_state = S_UDP_QIOPEN;
}
}
}
break;
case S_UDP_Wait:
{
if((!check_timer_1s()))
{
s_at_error_count = 0;
*Nbiot_Send_Data.state = NBIOT_ONLINE;
s_udp_connect_state = S_UDP_CONNECT_START; //状态机回归初始状态
g_s_nbiot_task_flag = TASK_SUCCESS; //到此为止任务成功
}
}
break;
default:
{
s_udp_connect_state = S_UDP_CONNECT_START; //状态机回归初始状态
}
break;
}
}
void UdpConnectMachine(void)
{
UdpConnectMachine_E7025();
}
//TdpConnectMachine
//模组AT指令编号
typedef enum{
S_TCP_CONNECT_START=0,
S_TCP_QIOPEN,
S_TCP_QIOPEN_R,
S_TCP_NCDP_CK,
S_TCP_NCDP_CK_R,
S_TCP_SUCCESS,
S_TCP_FAIL
}TYP_AT_CMDCODE;
const char tcp_socket_buf[6]={'0','1','2','3','4','5'};
u8 tcp_socket_index=0;
TYP_AT_CMDCODE s_tcp_connect_state=S_TCP_CONNECT_START;
static char stringbuffer_temp[256];
void TcpStartConnect(void)
{
s_tcp_connect_state = S_TCP_CONNECT_START;
}
void TcpConnectMachine(void)
{
unsigned char *nbiot_ip;
u16 nbiot_port;
static u8 s_at_error_count = 0;
//static const u8 temp_AT_Buffer[34]= {"AT+ECSOCR=DGRAM,17,1234,1,AF_INET\r"};
static const u8 temp_AT_Buffer[34]= {"AT+ECSOCR=STREAM,6,1234,1,AF_INET\r"};//TCP
static char c_AT_QIOPEN[50];
switch (s_tcp_connect_state)
{
case S_TCP_CONNECT_START: //任务开始
{
s_at_error_count=0;
s_tcp_connect_state = S_TCP_QIOPEN;
tcp_socket_index = 0;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
break;
case S_TCP_QIOPEN://创建套接字
{
if(TASK_IDLE == UartIfIdle(NB_UART_COM))
{
if (!check_timer_1ms())
{
u16 len = 0; //整条AT指令的长度根据发送长度的位数来定
int i;
for(i=0; i<34; i++)
{
c_AT_QIOPEN[i]=temp_AT_Buffer[i];
}
if(tcp_socket_index>4)
{
tcp_socket_index = 0;
}
c_AT_QIOPEN[22] = tcp_socket_buf[tcp_socket_index];//更新socket
len = 34;
NbiotUartSend((u8*)c_AT_QIOPEN, len, cst_AT_No_AT_QIOPEN);
set_timer_1s(5);
s_tcp_connect_state = S_TCP_QIOPEN_R;
}
}
}
break;
case S_TCP_QIOPEN_R:
{
if (NbiotCheckAtAck() == UART_OK)
{
s_at_error_count = 0;
s_tcp_connect_state = S_TCP_NCDP_CK;
set_timer_1s(1);
}
else if (!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR)
{
s_at_error_count++;
if (s_at_error_count >= 3)
{
s_at_error_count = 0;
s_tcp_connect_state = S_TCP_FAIL;
set_timer_1s(1);
}
else
{
s_tcp_connect_state = S_TCP_QIOPEN;
}
}
}
break;
case S_TCP_NCDP_CK://连接服务器
{
if(TASK_IDLE == UartIfIdle(NB_UART_COM))
{
if (!check_timer_1s())
{
int ip_len = 0;
nbiot_port = coap_port;
nbiot_ip = coap_ip;
memset(stringbuffer_temp,0,sizeof(stringbuffer_temp));
//"AT+ECSOCO=1,"183.230.174.137",6065"
//IP 的存储仍然使用水表原来格式,不保存“.”号,使用时加入
stringbuffer_temp[ip_len++]='A';
stringbuffer_temp[ip_len++]='T';
stringbuffer_temp[ip_len++]='+';
stringbuffer_temp[ip_len++]='E';
stringbuffer_temp[ip_len++]='C';
stringbuffer_temp[ip_len++]='S';
stringbuffer_temp[ip_len++]='O';
stringbuffer_temp[ip_len++]='C';
stringbuffer_temp[ip_len++]='O';
stringbuffer_temp[ip_len++]='=';
stringbuffer_temp[ip_len++]=NbiotGetE7025TcpSocket();
stringbuffer_temp[ip_len++]=',';
stringbuffer_temp[ip_len++]='"';
for (int i = 0; i < 4; i++)
{
if (nbiot_ip[i] < 10)
{
stringbuffer_temp[ip_len++] = nbiot_ip[i] + 0x30;
}
else if (nbiot_ip[i] < 100)
{
stringbuffer_temp[ip_len++] = (nbiot_ip[i] / 10) + 0x30;
stringbuffer_temp[ip_len++] = (nbiot_ip[i] % 10) + 0x30;
}
else
{
stringbuffer_temp[ip_len++] = (nbiot_ip[i] / 100) + 0x30;
stringbuffer_temp[ip_len++] = (nbiot_ip[i] / 10) % 10 + 0x30;
stringbuffer_temp[ip_len++] = (nbiot_ip[i] % 10) + 0x30;
}
stringbuffer_temp[ip_len++] = '.';
}
ip_len--; //消除多余的点号
stringbuffer_temp[ip_len++] = '\"';
stringbuffer_temp[ip_len++] = ',';
stringbuffer_temp[ip_len++] = ((nbiot_port) / 10000) + 0x30;
stringbuffer_temp[ip_len++] = (((nbiot_port) % 10000) / 1000) + 0x30;
stringbuffer_temp[ip_len++] = (((nbiot_port) % 1000) / 100) + 0x30;
stringbuffer_temp[ip_len++] = (((nbiot_port) % 100) / 10) + 0x30;
stringbuffer_temp[ip_len++] = ((nbiot_port) % 10) + 0x30;
stringbuffer_temp[ip_len++] = '\r';
NbiotUartSend((u8*)stringbuffer_temp, ip_len, cst_AT_No_AT);
set_timer_1s(10);
s_tcp_connect_state = S_TCP_NCDP_CK_R;
}
}
}
break;
case S_TCP_NCDP_CK_R:
{
if (NbiotCheckAtAck() == UART_OK)
{
s_at_error_count = 0;
s_tcp_connect_state = S_TCP_SUCCESS;
set_timer_1s(1);
}
else if (!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR)
{
s_at_error_count++;
if (s_at_error_count >= 5)//
{
s_at_error_count = 0;
s_tcp_connect_state = S_TCP_FAIL;
set_timer_1s(1);
}
else
{
s_tcp_connect_state = S_TCP_NCDP_CK;
}
}
}
break;
case S_TCP_SUCCESS:
{
if((!check_timer_1s()))
{
s_at_error_count = 0;
s_tcp_connect_state = S_TCP_CONNECT_START; //状态机回归初始状态
g_s_nbiot_task_flag = TASK_SUCCESS; //到此为止任务成功
}
}
break;
case S_TCP_FAIL:
{
if((!check_timer_1s()))
{
s_at_error_count = 0;
s_tcp_connect_state = S_TCP_CONNECT_START; //状态机回归初始状态
g_s_nbiot_task_flag = TASK_FAIL; //到此为止任务成功
}
}
break;
default:
{
s_tcp_connect_state = S_TCP_CONNECT_START; //状态机回归初始状态
}
break;
}
}
//
void StartUdpSendData(void)
{
s_udp_send_state = S_SEND_START;
}
//AT+ECSOST=1,"183.230.174.137",6065,2,"3334"
void UdpSendDataMachine_E7025(void)
{
unsigned char *nbiot_ip;
u16 nbiot_port;
static u8 s_at_error_count = 0; //AT指令累计发送失败次数
static const u8 temp_AT_Buffer[10]= {"AT+ECSOST="};
switch (s_udp_send_state)
{
case S_SEND_START:
{
s_udp_send_state = S_SEND_DATA; //收到数据立即进行数据发送模块会报ERROR因此延时1S消除此ERROR
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
break;
case S_SEND_DATA:
{
if (!check_timer_1ms())
{
u16 len = 0; //整条AT指令的长度根据发送长度的位数来定
nbiot_port = udp_port1;
nbiot_ip = udp_ip1;
int i;
for(i=0;i<10;i++)
{
c_AT_NMGS[len++] = temp_AT_Buffer[i];
}
//socekt
c_AT_NMGS[len++] = NbiotGetE7025UdpSocket();//socket范围为0~6
c_AT_NMGS[len++] = ',';
c_AT_NMGS[len++] = '\"';
//IP: NSOST Udp发送使用
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++] = ',';
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_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_udp_send_state = S_SEND_START;
}
else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1s()))
{
s_at_error_count++;
if (s_at_error_count >= 2)
{
s_at_error_count = 0;
*Nbiot_Send_Data.state = cst_AT_No_AT_NMGS;
g_s_nbiot_task_flag = TASK_SUCCESS;
s_udp_send_state = S_SEND_START;
}
else
{
set_timer_1s(4);
s_udp_send_state = S_SEND_DATA;
}
}
}
break;
default:
{
s_udp_send_state = S_SEND_START;
}
break;
}
}
void UdpSendDataMachine(void)
{
UdpSendDataMachine_E7025();
}
u8 s_tcp_send_state=S_SEND_START;
void StartTcpSendData(void)
{
s_tcp_send_state = S_SEND_START;
}
//AT+ECSOST=1,"183.230.174.137",6065,2,"3334"
//AT+ECSOSD=1,2,"3132"
void TcpSendDataMachine(void)
{
static u8 s_at_error_count = 0; //AT指令累计发送失败次数
static const u8 temp_AT_Buffer[10]= {"AT+ECSOSD="};
switch (s_tcp_send_state)
{
case S_SEND_START:
{
s_tcp_send_state = S_SEND_DATA; //收到数据立即进行数据发送模块会报ERROR因此延时1S消除此ERROR
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
}
break;
case S_SEND_DATA:
{
if (!check_timer_1ms())
{
u16 len = 0; //整条AT指令的长度根据发送长度的位数来定
for(int i=0;i<10;i++)
{
c_AT_NMGS[len++] = temp_AT_Buffer[i];
}
//socekt
c_AT_NMGS[len++] = NbiotGetE7025TcpSocket();//socket范围为0~6
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++] = ',';
c_AT_NMGS[len++] = '\"';
//内容
for (int 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++] = '\"';
c_AT_NMGS[len++] = '\r';
NbiotUartSend((u8*) c_AT_NMGS, len, cst_AT_No_AT_NMGS);
set_timer_1s(4);
s_tcp_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_tcp_send_state = S_SEND_START;
}
else if (NbiotCheckAtAck() == UART_ERROR || (!check_timer_1s()))
{
s_at_error_count++;
if (s_at_error_count >= 2)
{
s_at_error_count = 0;
*Nbiot_Send_Data.state = cst_AT_No_AT_NMGS;
g_s_nbiot_task_flag = TASK_SUCCESS;
s_tcp_send_state = S_SEND_START;
}
else
{
set_timer_1s(4);
s_tcp_send_state = S_SEND_DATA;
}
}
}
break;
default:
{
s_tcp_send_state = S_SEND_START;
}
break;
}
}
void UdpReadDataMachine_E7025(void)
{
static u8 s_error_count; //AT指令累计发送失败次数
static u8 s_read_upd_data_state = S_START;
static const u8 temp_AT_Buffer[16]= {"AT+ECSORF=2,512\r"};
switch (s_read_upd_data_state)
{
case S_START:
{
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
s_error_count = 0;
s_read_upd_data_state = S_AT_QIRD;
}
break;
case S_AT_QIRD:
{
if (!check_timer_1ms())
{
u16 len=0;
int i;
for(i=0;i<16;i++)
{
c_AT_NMGS[len++] = temp_AT_Buffer[i];
}
c_AT_NMGS[10] = NbiotGetE7025UdpSocket();//socket范围为0~6
NbiotUartSend((u8*) c_AT_NMGS, len, cst_AT_No_AT_UPD_READ);
set_timer_1ms(3*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);
s_read_upd_data_state = S_AT_QIRD;
}
}
}
break;
default:
{
s_read_upd_data_state = S_START;
}
break;
}
}
void UdpReadDataMachine(void)
{
UdpReadDataMachine_E7025();
}
//
//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_3 = "AT+MIPLCONFIG=3,0\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_CCLK = "AT+CCLK?\r"; //查询基站时间
static char c_AT_MIPLRSP_BUF[40];// 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 = coap_port;
nbiot_ip = coap_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(2);
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;//S_ONENET_MIPLCONFIG3;
set_timer_1s(2);
}
else if (!check_timer_1s() || NbiotCheckAtAck() == UART_ERROR)
{
s_at_error_count++;
if (s_at_error_count >= AT_ERROR)//
{
//一般不会发生,肯定能查到返回结果
s_at_error_count = 0;
s_onenet_connect_state = S_ONENET_MIPLCONFIG_CK;//S_ONENET_MIPLCONFIG3;
set_timer_1s(2);
}
else
{
s_onenet_connect_state = S_ONENET_MIPLCONFIG;
}
}
}
break;
case S_ONENET_MIPLCONFIG_CK:
{
if (!check_timer_1s())
{
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_1s(2);
}
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_1s(2);
}
else
{
s_onenet_connect_state = S_ONENET_MIPLCONFIG_CK;
}
}
}
break;
case S_ONENET_MIPLCREATE:
{
if(!check_timer_1s())
{
if(TASK_IDLE == UartIfIdle(NB_UART_COM))
{
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_1s(2);
}
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_1s(2);
}
else
{
s_onenet_connect_state = S_ONENET_MIPLCREATE;
set_timer_1s(2);
}
}
}
break;
case S_ONENET_MIPLADDOBJ:
{
if(!check_timer_1s())
{
if(TASK_IDLE == UartIfIdle(NB_UART_COM))
{
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_1s(2);
}
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_1s(2);
}
else
{
s_onenet_connect_state = S_ONENET_MIPLADDOBJ;
set_timer_1s(1);
}
}
}
break;
case S_ONENET_MIPLOPEN:
{
if (!check_timer_1s())
{
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();
NbiotSetRevMiplobserve();
set_timer_1s(10);
s_onenet_connect_state = S_ONENET_MIPLOBSERVE;
}
else if ((!check_timer_1s()))
{
s_at_error_count++;
if (s_at_error_count >= NUM_AT_MIPLOPEN_ERROR)
{
*Nbiot_Send_Data.state = NBIOT_ERROR;
g_s_nbiot_task_flag = TASK_FAIL; //到此为止任务成功
s_at_error_count = 0;
s_onenet_connect_state = S_ONENET_MIPLOBSERVE;
}
else
{
s_onenet_connect_state = S_ONENET_MIPLOPEN;
set_timer_1s(1);
}
}
}
break;
case S_ONENET_MIPLOBSERVE: //static char c_AT_MIPLDISCOVERRSP[30];// AT+MIPLDISCOVERRSP=0,48839,1,4,"5750"
{
if ((NbiotCheckAtAck() == UART_OK)||(!check_timer_1s()))
{
u8 len;
char observe_num[10];
memset(observe_num, 0, sizeof(observe_num));
memset(c_AT_MIPLRSP_BUF, 0, sizeof(c_AT_MIPLRSP_BUF));
strcpy(c_AT_MIPLRSP_BUF, "AT+MIPLOBSERVERSP=0,");
NbiotGetObserve_num(observe_num);
strcat(c_AT_MIPLRSP_BUF, observe_num);
strcat(c_AT_MIPLRSP_BUF, ",1\r");
len = strlen(c_AT_MIPLRSP_BUF);
NbiotUartSend((u8 *) c_AT_MIPLRSP_BUF, len, cst_AT_No_AT);
set_timer_1s(2);
s_onenet_connect_state = S_ONENET_MIPLOBSERVE_R;
}
}
break;
case S_ONENET_MIPLOBSERVE_R: //应答接收到数据--等待响应
{
if (NbiotCheckAtAck() == UART_OK)
{
s_at_error_count = 0;
NbiotClearAtAck();
NbiotSetRevMipldiscover();
set_timer_1s(5);
s_onenet_connect_state = S_ONENET_MIPLDISCOVER;
}
else if ((!check_timer_1s()))
{
s_at_error_count++;
if (s_at_error_count >= NUM_AT_MIPLOBSERVERSP_ERROR)
{
*Nbiot_Send_Data.state = NBIOT_ERROR;
g_s_nbiot_task_flag = TASK_FAIL; //到此为止任务成功
set_timer_1s(1);
s_at_error_count = 0;
s_onenet_connect_state = S_ONENET_CONNECT_IDLE;
}
else
{
set_timer_1s(5);
s_onenet_connect_state = S_ONENET_MIPLOBSERVE;
}
}
}
break;
case S_ONENET_MIPLDISCOVER:
{
if ((NbiotCheckAtAck() == UART_OK)||(!check_timer_1s()))
{
u8 len;
char discover_num[10];
memset(discover_num, 0, sizeof(discover_num));
memset(c_AT_MIPLRSP_BUF, 0, sizeof(c_AT_MIPLRSP_BUF));
strcpy(c_AT_MIPLRSP_BUF, "AT+MIPLDISCOVERRSP=0,");
NbiotGetDiscover_num(discover_num);
strcat(c_AT_MIPLRSP_BUF, discover_num);
strcat(c_AT_MIPLRSP_BUF, ",1,4,\"5750\"\r");
len = strlen(c_AT_MIPLRSP_BUF);
NbiotUartSend((u8 *) c_AT_MIPLRSP_BUF, len, cst_AT_No_AT);
set_timer_1s(5);
s_onenet_connect_state = S_ONENET_MIPLDISCOVER_R;
}
}
break;
case S_ONENET_MIPLDISCOVER_R: //应答接收到数据--等待响应
{
if (NbiotCheckAtAck() == UART_OK)
{
set_timer_1s(1);
s_at_error_count = 0;
s_onenet_connect_state = S_ONENET_CCLK;
}
else if ((!check_timer_1s()))
{
s_at_error_count++;
if (s_at_error_count >= NUM_AT_MIPLDISCOVERRSP_ERROR)
{
*Nbiot_Send_Data.state = NBIOT_ERROR;
g_s_nbiot_task_flag = TASK_FAIL; //到此为止任务成功
set_timer_1s(1);
s_at_error_count = 0;
s_onenet_connect_state = S_ONENET_CONNECT_IDLE;
}
else
{
NbiotSetRevMipldiscover();
s_onenet_connect_state = S_ONENET_MIPLDISCOVER;
set_timer_1s(5);
}
}
}
break;
case S_ONENET_CCLK://开始查询网络时间
{
if (!check_timer_1s())
{
NbiotUartSend((u8*) c_AT_CCLK, strlen(c_AT_CCLK), cst_AT_No_AT_CCLK);
s_onenet_connect_state = S_ONENET_CCLK_R;
set_timer_1ms(AT_COMMAND_RECEIVE_WAIT_TIME); //测试报告中AT指令返回的最长时间300ms(不包含发送和接收占用的时间)
}
}
break;
case S_ONENET_CCLK_R://等待应答
{
if (NbiotCheckAtAck() == UART_OK)//正确应答
{
s_at_error_count = 0;
s_onenet_connect_state = S_ONENET_Wait; //状态机回归初始状态
}
else if ((!check_timer_1ms()) || (NbiotCheckAtAck() == UART_ERROR))//应答超时
{
if (++s_at_error_count >= NUM_AT_CCLK_ERROR)
{
s_at_error_count = 0;
s_onenet_connect_state = S_ONENET_Wait; //状态机回归初始状态
}
else
{
s_onenet_connect_state = S_ONENET_CCLK;
set_timer_1s(1);
}
}
}
break;
case S_ONENET_Wait:
{
if ((!check_timer_1s()))
{
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;
}
}
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;
}
void OneNetSendDataMachine(void)
{
char observe_num[10];
static const char temp_AT_MIPLDISCOVERRSP1[] = "AT+MIPLNOTIFY=0,";
static const char temp_AT_MIPLDISCOVERRSP2[] = ",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_MIPLDISCOVERRSP1);
memset(observe_num, 0, sizeof(observe_num));
NbiotGetObserve_num(observe_num);
//NbiotGetDiscover_num(observe_num);
strcat(c_AT_NMGS, observe_num);
strcat(c_AT_NMGS, temp_AT_MIPLDISCOVERRSP2);
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 SEND_ACKID_ENABLE
char strtemp[8];
if(++Send_AckID == 0) Send_AckID = 1; //Send_AckID==0的时候模块会报错ERROR
sprintf(strtemp, ",%u", Send_AckID);
strcat(c_AT_MIPLNOTIFY, strtemp);
strcat(c_AT_MIPLNOTIFY, "\r");
NbiotClearMsg();
NbiotUartSend((u8*) c_AT_MIPLNOTIFY, strlen(c_AT_MIPLNOTIFY), 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);
#endif
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 = cst_AT_No_AT_MIPLNOTIFY;
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_NETCLOSE = "AT+CTM2MDEREG\r";
//static const char* c_AT_TCPCLOSE = "AT+ECSOCL=1\r";
//static const char* c_AT_CFUN0 = "AT+CFUN=0\r"; //设置最小功能模式
//static const char* c_AT_NCSEARFCN = "AT+QCSEARFCN=0\r"; //清除已保存频点
//static const char* c_AT_CFUN1 = "AT+CFUN=1\r"; //设置正常功能模式
//static const char* c_AT_QPOWD = "AT+QPOWD=1\r";
switch (s_power_off_state)
{
case S_POWER_OFF_START:
{
s_at_error_count = 0;
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;
// Nbiot_Para.tcp1_state = CONNECT_OFF_LINE;
set_timer_1ms(AT_COMMAND_SEND_INTERVAL_TIME);
s_power_off_state = S_AT_NETCLOSE;
}
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_MIPLNOTIFY_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_POWER_OFF;
}
else
{
int len=0; // "AT+ECSOCL=1\r";
memset(stringbuffer_temp,0,sizeof(stringbuffer_temp));
//"AT+ECSOCO=1,"183.230.174.137",6065"
//IP 的存储仍然使用水表原来格式,不保存“.”号,使用时加入
stringbuffer_temp[len++]='A';
stringbuffer_temp[len++]='T';
stringbuffer_temp[len++]='+';
stringbuffer_temp[len++]='E';
stringbuffer_temp[len++]='C';
stringbuffer_temp[len++]='S';
stringbuffer_temp[len++]='O';
stringbuffer_temp[len++]='C';
stringbuffer_temp[len++]='L';
stringbuffer_temp[len++]='=';
stringbuffer_temp[len++]=NbiotGetE7025TcpSocket();
stringbuffer_temp[len++]='\r';
NbiotUartSend((u8*) stringbuffer_temp,len, cst_AT_No_AT);
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_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_NETCLOSE;
}
}
}
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_POWER_OFF;
}
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_POWER_OFF;
}
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.udp1_state = CONNECT_OFF_LINE;
Nbiot_Para.udp2_state = CONNECT_OFF_LINE;
// Nbiot_Para.tcp1_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;
static const u8 c_AT_NUESTATS[] = "AT+QENG=0\r";
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 定时器资源
* @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.udp1_state = CONNECT_OFF_LINE;
Nbiot_Para.udp2_state = CONNECT_OFF_LINE;
// Nbiot_Para.tcp1_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.NB_module_IMEI_0016);
// NbiotGetIMSI(Sys_data_object.NB_module_IMSI);
// NbiotGetICCID(Sys_data_object.SIMCard_ICCID_200A);
}
u32 sys_get_net_state (void)
{
return 0;
}
#ifdef __cplusplus
}
#endif
#endif