231 lines
7.9 KiB
C
231 lines
7.9 KiB
C
#include "main.h"
|
||
|
||
uint32_t current_tick = 0; //当前运行时间 用于LED闪烁 硬件看门狗等
|
||
|
||
|
||
_Bool Networking = 0; //联网标志位 1联网 0离线
|
||
|
||
|
||
|
||
char databuff[256]; //构建数据用的临时缓冲区
|
||
uint8_t online_counter = 1; //查询子设备上线的计数变量
|
||
uint8_t data_counter = 1; //查询子设备数据的计数变量
|
||
|
||
void catInit(void) {
|
||
GPIO_InitTypeDef GPIO_Initure = {0};
|
||
|
||
// GPIOA_RCC_ENABLE;
|
||
GPIOC_RCC_ENABLE;
|
||
|
||
GPIO_Initure.Pin= CAT_POW_Pin; //设置电源脚
|
||
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //开漏输出
|
||
GPIO_Initure.Pull = GPIO_NOPULL; //不上下拉
|
||
GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW; //低速 (必需设置!)
|
||
HAL_GPIO_Init(CAT_POW_GPIO_Port,&GPIO_Initure); //设置
|
||
|
||
// GPIO_Initure.Pin= CAT_RST_Pin; //设置复位脚(预留)
|
||
// GPIO_Initure.Pull = GPIO_NOPULL; //不上下拉
|
||
// GPIO_Initure.Mode = GPIO_MODE_OUTPUT_OD; //开漏输出
|
||
// GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW; //低速
|
||
// HAL_GPIO_Init(CAT_RST_GPIO_Port,&GPIO_Initure); //设置
|
||
|
||
GPIO_Initure.Pin = CAT_RUN_Pin ; //设置运行读取脚
|
||
GPIO_Initure.Mode = GPIO_MODE_INPUT; //输入模式
|
||
GPIO_Initure.Pull = GPIO_PULLUP; //使能上拉
|
||
GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW; //低速
|
||
HAL_GPIO_Init(CAT_RUN_GPIO_Port,&GPIO_Initure); //设置
|
||
|
||
// GPIO_Initure.Pin = CAT_NET_Pin ; //设置网络读取脚
|
||
// GPIO_Initure.Mode = GPIO_MODE_INPUT; //输入模式
|
||
// GPIO_Initure.Pull = GPIO_PULLUP; //使能上拉
|
||
// GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW; //低速
|
||
// HAL_GPIO_Init(CAT_NET_GPIO_Port,&GPIO_Initure); //设置
|
||
}
|
||
|
||
|
||
//模块开机后会收到 +NITZ: 24/04/13,12:11:59+32,0 实际时间 2024/4/13 20:11:59秒
|
||
void catConnectServer(void) {
|
||
uint8_t Multiple = 100; //短暂延时 默认100ms
|
||
uint8_t netstep = 0;
|
||
char serverbuff[100] = {0}; //例子:AT+MCONFIG="8c91c2a533b3c573","965669176415378622","ad592e4c3e7117c6",0,0,0,0
|
||
char portbuff[50] = {0}; //例子:AT+MIPSTART="58.17.14.95",1880
|
||
char topicbuff[50]= {0}; //订阅主题 才能收到云平台下发的控制指令
|
||
sprintf(serverbuff,"AT+MCONFIG=\"%s\",\"%s\",\"%s\",0,0,0,0",MqttInfoStr.ClientID,MqttInfoStr.Username,MqttInfoStr.Passward);
|
||
sprintf(portbuff, "AT+MIPSTART=\"%s\",%d",MqttInfoStr.ServerIP,MqttInfoStr.ServerPort);
|
||
sprintf(topicbuff, "AT+MSUB=\"%s%s\",0",MqttInfoStr.Topic,MqttInfoStr.ClientID);
|
||
|
||
#if 0
|
||
if(POWER_STA==1) { //如果PB1是高电平,表示目前处于关机状态
|
||
log_info("目前4G模块处于关机状态,准备开机"); //串口输出信息
|
||
POWER_KEY(1); //先拉高
|
||
HAL_Delay(1500); //延时
|
||
POWER_KEY(0); //再拉低,开机
|
||
} else { //反之PA0是低电平,表示目前处于开机状态
|
||
log_info("目前4G模块处于开机状态,准备重启"); //串口输出信息
|
||
POWER_KEY(1); //先拉高
|
||
HAL_Delay(1500); //延时
|
||
POWER_KEY(0); //再拉低,关机
|
||
HAL_Delay(3000); //间隔
|
||
POWER_KEY(1); //先拉高
|
||
HAL_Delay(1500); //延时
|
||
POWER_KEY(0); //再拉低,开机,完成重启
|
||
}
|
||
#endif
|
||
log_info("准备复位");
|
||
POWER_KEY(1); //先拉高 复位
|
||
HAL_Delay(1000); //延时
|
||
POWER_KEY(0); //再拉低
|
||
HAL_Delay(4000); //间隔
|
||
|
||
|
||
HAL_Delay(Multiple);
|
||
if(catSendCmd("AT","OK", 8,30)) {
|
||
log_info("开机失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("开机成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("关闭回显"); // 串口提示数据
|
||
if(catSendCmd("ATE0","OK", 5, 30)) {
|
||
log_info("关闭回显失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("关闭回显成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备查询卡状态"); // 串口提示数据
|
||
if(catSendCmd("AT+CPIN?","READY", 5, 30)) {
|
||
log_info("查询卡状态失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("查询卡状态成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备设置单连接\r\n"); // 串口提示数据
|
||
if(catSendCmd("AT+CIPMUX=0","OK", 5, 30)) {
|
||
log_info("设置单连接失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("设置单连接成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备配置网络"); // 串口提示数据
|
||
if(catSendCmd("AT+CSTT","OK", 5, 30)) {
|
||
log_info("配置网络失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("配置网络成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备激活网络"); // 串口提示数据
|
||
if(catSendCmd("AT+CIICR","OK", 5, 30)) {
|
||
log_info("激活网络失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("激活网络成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备连接服务器"); // 串口提示数据
|
||
if(catSendCmd(serverbuff,"OK", 5, 30)) {
|
||
log_info("连接服务器失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("连接服务器成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备连接TCP端口");
|
||
if(catSendCmd(portbuff,"OK", 5, 30)) {
|
||
log_info("连接TCP端口失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("连接TCP端口成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备配置保活时间");
|
||
if(catSendCmd("AT+MCONNECT=1,60","OK", 5, 30)) {
|
||
log_info("配置保活时间失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("配置保活时间成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
log_info("准备订阅主题");
|
||
if(catSendCmd(topicbuff,"SUBACK", 5, 30)) {
|
||
log_info("订阅主题失败,准备重启"); //串口输出信息
|
||
NVIC_SystemReset(); //重启!
|
||
} else {
|
||
netstep += 1; //步进增加
|
||
log_info("订阅主题成功"); //串口输出信息
|
||
}
|
||
HAL_Delay(Multiple);
|
||
|
||
log_info("当前来到步:%d",netstep);
|
||
if(netstep >= 10) {
|
||
Networking = 1;
|
||
log_info("联网过程一切OK!");
|
||
} else {
|
||
Networking = 0;
|
||
log_info("联网失败,重启");
|
||
HAL_Delay(Multiple);
|
||
NVIC_SystemReset(); //重启!
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------*/
|
||
/*函数名:卡模块发送指令 */
|
||
/*参 数:cmd:指令 */
|
||
/*参 数:ret:对比数据 */
|
||
/*参 数:cnt:发送次数 */
|
||
/*参 数:timeout:超时时间(50ms的倍数) */
|
||
/*返回值:0:正确 其他:错误 */
|
||
/*-------------------------------------------------*/
|
||
uint8_t catSendCmd(char *cmd, char *ret, uint8_t cnt, uint8_t timeout) {
|
||
uint8_t result = 1; // 默认结果设为错误(非0值)
|
||
while(cnt > 0 && result != 0) {
|
||
CAT1_printf("%s\r\n", cmd); // 发送指令 结尾加上换行回车
|
||
uint8_t current_timeout = timeout;
|
||
while(--current_timeout) {
|
||
HAL_Delay(50);
|
||
usart2RxHandle();//串口2数据处理
|
||
if (strstr((char *)U2_CopyBuff, ret)) {//查找匹配字符串
|
||
result = 0; // 找到期望的回复,结果设为正确(0值)
|
||
break;
|
||
}
|
||
}
|
||
if (current_timeout == 0) // 如果timeout<=0,说明超时,但此时未收到期望回复
|
||
log_info("第%d次超时",cnt);
|
||
cnt--; // 发送次数减1
|
||
}
|
||
return result;
|
||
}
|
||
|
||
|
||
|
||
//主动事件 LED闪烁
|
||
void activeEvents(void) {
|
||
Networking = 1;
|
||
|
||
if (HAL_GetTick() - current_tick >= 1000) {
|
||
if(Networking){ //连接成功
|
||
LED1_TOGGLE; //LED闪烁:联网 熄灭:离线
|
||
}
|
||
else{
|
||
LED1_OFF;//熄灭网络指示灯
|
||
}
|
||
current_tick = HAL_GetTick(); //更新时间
|
||
}
|
||
}
|
||
|