CAT1是一款网口转串口的模组,支持socket连接。
真正在使用的过程中,需要对其进行配置。【通过AT指令】
因此便在程序中写了一套配置流程,仅供参考。【因为我懒得整理了,拿来记录一下大致思路就可以了】
基本顺序很简单:发送查询->判断接收->配置->查询 如此往复
config.h
#ifndef __CONFIGCAT_H
#define __CONFIGCAT_H
#include "gd32f30x.h"
#include <stdbool.h>
typedef struct {
bool configdefault;
//config OK flag
bool ConfigInitFlag;
//status flag
bool ConfigMode;
//timer count
uint32_t ConfigDefaultTime;
//config step control
uint8_t ConfigDefaultCount;
//recieve process
bool configrecieveflag;
uint32_t RecieveBufferLength;
uint8_t RecieveBuffer[128];
}Cat1_Config_struct;
typedef struct {
char *readbuf;
char *recievebuf;
char *configbuf;
}Cat1_Config_Data_struct;
bool bconfigcatInit(void);
bool vconfigcatDefaultConfigInit(void);
#endif //__CONFIGCAT_H
configcat.c
#include "main.h"
#include "../User/BSP/ASHINING/ashining.h"
#include "../User/FUN/config/configcat.h"
#include "../User/FUN/inforeport/inforeport.h"
#include "../User/FUN/config/configfunction.h"
//main.c
extern Authority_union Authority;
//buzzer.c
extern Buzzer_Struct Buzzer;
//DataStorage
extern ControllerFun_union ControllerFun;
//timer.c
extern Timer_struct FlechazoTimer;
extern uint8_t heartpackagebuffer[28];
//config cat1
Cat1_Config_struct Cat1_Config;
//----------------------------------//
const char configCat_1[] = "+++";
const char configCat_2[] = "AT\r\n";
const char configCat_1_r[] = "\r\n+OK\r\n";
const char configCat_exit[] = "AT+EXAT\r\n\r\n";
const char configCat_rebt[] = "AT+REBT\r\n\r\n";
//----------------------------------//
//----------------------------------//
#define CAT1_CONFIG_DATA_STRUCT_GROUP 12
uint8_t configcount;
bool sendorrecieveflag;
Cat1_Config_Data_struct Cat1_Config_Data[CAT1_CONFIG_DATA_STRUCT_GROUP];
#if (USE_BIT_4_CONTROLLER_ID==1)
char socketheartbeat[8][128]={"\r\n+OK=0,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n",\
"\r\n+OK=1,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n",\
"\r\n+OK=2,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n",\
"\r\n+OK=3,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n",\
"AT+SOCK=0,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n",\
"AT+SOCK=1,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n",\
"AT+SOCK=2,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n",\
"AT+SOCK=3,\"regist\",1,3,1,FB006000010000CCCC0000000000042307EBA1FE,0\r\n"};
#else //(USE_BIT_4_CONTROLLER_ID==1)
char socketheartbeat[8][128]={"\r\n+OK=0,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n",\
"\r\n+OK=1,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n",\
"\r\n+OK=2,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n",\
"\r\n+OK=3,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n",\
"AT+SOCK=0,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n",\
"AT+SOCK=1,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n",\
"AT+SOCK=2,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n",\
"AT+SOCK=3,\"regist\",1,3,1,FB006000010000CCCCCCCCCCCC000000000000000000000000EBA1FE,0\r\n"};
#endif //(USE_BIT_4_CONTROLLER_ID==1)
char socketheartbeat_f[64];
/***********************************************************
*@fuction :bconfigcatInit
*@brief :
*@param :--
*@return :void
*@author :flechazo
*@date :2023-07-13
***********************************************************/
bool bconfigcatInit(void){
Cat1_Config_Data[0].readbuf = "AT+SOCK=0,\"base\"?\r\n";
Cat1_Config_Data[0].recievebuf = "\r\n+OK=0,\"base\",1,0,1,0,118.89.116.58,8090\r\n";
Cat1_Config_Data[0].configbuf = "AT+SOCK=0,\"base\",1,0,1,0,118.89.116.58,8090\r\n";
Cat1_Config_Data[1].readbuf = "AT+SOCK=1,\"base\"?\r\n";
Cat1_Config_Data[1].recievebuf = "\r\n+OK=1,\"base\",1,0,1,0,139.196.207.98,3866\r\n";
Cat1_Config_Data[1].configbuf = "AT+SOCK=1,\"base\",1,0,1,0,139.196.207.98,3866\r\n";
Cat1_Config_Data[2].readbuf = "AT+SOCK=2,\"base\"?\r\n";
Cat1_Config_Data[2].recievebuf = "\r\n+OK=2,\"base\",1,0,1,0,47.103.195.0,6683\r\n";
Cat1_Config_Data[2].configbuf = "AT+SOCK=2,\"base\",1,0,1,0,47.103.195.0,6683\r\n";
Cat1_Config_Data[3].readbuf = "AT+SOCK=3,\"base\"?\r\n";
Cat1_Config_Data[3].recievebuf = "\r\n+OK=3,\"base\",1,0,1,0,1w511862l9.goho.co,31697\r\n";
Cat1_Config_Data[3].configbuf = "AT+SOCK=3,\"base\",1,0,1,0,1w511862l9.goho.co,31697\r\n";
//flush heart package
//uint2char(heartpackagebuffer,socketheartbeat_f,26);
uint32_t socketheart_len=2*(5+2*DEVID_LEN+7);
hex_to_ascii(heartpackagebuffer,socketheartbeat_f,socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[0]+23),socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[1]+23),socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[2]+23),socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[3]+23),socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[4]+25),socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[5]+25),socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[6]+25),socketheart_len);
vdatastorageCopyArray((uint8_t *)socketheartbeat_f,((uint8_t *)socketheartbeat[7]+25),socketheart_len);
Cat1_Config_Data[4].readbuf = "AT+SOCK=0,\"regist\"?\r\n";
Cat1_Config_Data[4].recievebuf = socketheartbeat[0];
Cat1_Config_Data[4].configbuf = socketheartbeat[4];
Cat1_Config_Data[5].readbuf = "AT+SOCK=1,\"regist\"?\r\n";
Cat1_Config_Data[5].recievebuf = socketheartbeat[1];
Cat1_Config_Data[5].configbuf = socketheartbeat[5];
Cat1_Config_Data[6].readbuf = "AT+SOCK=2,\"regist\"?\r\n";
Cat1_Config_Data[6].recievebuf = socketheartbeat[2];
Cat1_Config_Data[6].configbuf = socketheartbeat[6];
Cat1_Config_Data[7].readbuf = "AT+SOCK=3,\"regist\"?\r\n";
Cat1_Config_Data[7].recievebuf = socketheartbeat[3];
Cat1_Config_Data[7].configbuf = socketheartbeat[7];
Cat1_Config_Data[8].readbuf = "AT+SOCK=0,\"keep/alive\"?\r\n";
Cat1_Config_Data[8].recievebuf = "\r\n+OK=0,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
Cat1_Config_Data[8].configbuf = "AT+SOCK=0,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
Cat1_Config_Data[9].readbuf = "AT+SOCK=1,\"keep/alive\"?\r\n";
Cat1_Config_Data[9].recievebuf = "\r\n+OK=1,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
Cat1_Config_Data[9].configbuf = "AT+SOCK=1,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
Cat1_Config_Data[10].readbuf = "AT+SOCK=2,\"keep/alive\"?\r\n";
Cat1_Config_Data[10].recievebuf = "\r\n+OK=2,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
Cat1_Config_Data[10].configbuf = "AT+SOCK=2,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
Cat1_Config_Data[11].readbuf = "AT+SOCK=3,\"keep/alive\"?\r\n";
Cat1_Config_Data[11].recievebuf = "\r\n+OK=3,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
Cat1_Config_Data[11].configbuf = "AT+SOCK=3,\"keep/alive\",0,0,0,KeepAlive,60\r\n";
return true;
}
/***********************************************************
*@fuction :uiconfigcatGetCharPlength
*@brief :
*@param :--
*@return :void
*@author :flechazo
*@date :2023-07-13
***********************************************************/
uint32_t uiconfigcatGetCharPlength(char *data){
static uint32_t len=0;
for(len=0;len<128;len++){
if((data[len]==0x0D)&&(data[len+1]==0x0A)&&(data[len+2]==0x00)){
len+=3;
return len;
}
}
return 0;
}
/***********************************************************
*@fuction :varray_move_forward
*@brief :
*@param :--
*@return :void
*@author :flechazo
*@date :2023-07-12
***********************************************************/
void varray_move_forward(uint8_t *arr, int length, int movlen)
{
for(int i = 0; i < (length - movlen); i++)
{
arr[i] = arr[i + movlen];
}
}
/***********************************************************
*@fuction :uconfigcatfind_recieve_head
*@brief :
*@param :--
*@return :void
*@author :flechazo
*@date :2023-07-12
***********************************************************/
uint8_t *uconfigcatfind_recieve_head(uint8_t *data)
{
for(int i = 0; i < 128; i++)
{
if(data[i] == 0x0D)
{
//find head
if(i > 0)
{
varray_move_forward(data, 128, i);
}
break;
}
}
return data;
}
/***********************************************************
*@fuction :vconfigcatDefaultConfigInit
*@brief :
*@param :--
*@return :void
*@author :flechazo
*@date :2023-07-12
***********************************************************/
bool vconfigcatDefaultConfigInit(void)
{
//funenable
if(!ControllerFun.Info.configdefaultcat)
{
return false;
}
//init flag
if(Cat1_Config.ConfigInitFlag)
{
return true;
}
if(FlechazoTimer.Control.IsTimeOut_s(&Cat1_Config.ConfigDefaultTime, 2))
{
switch(Cat1_Config.ConfigDefaultCount)
{
//start config
//1、+++
case 0:
{
Cat1_Config.ConfigMode = true;
vrs485Send((uint8_t *)configCat_1, sizeof(configCat_1)-1);
vusart0Send((uint8_t *)configCat_1, sizeof(configCat_1)-1);
configcount=0;
sendorrecieveflag=false;
Cat1_Config.ConfigDefaultCount++;
}
break;
//recieve +OK
case 1:
{
if(Cat1_Config.configrecieveflag)
{
//check data
if(vdatastorageCheckArraySame((uint8_t *)configCat_1_r, uconfigcatfind_recieve_head(Cat1_Config.RecieveBuffer), sizeof(configCat_1_r)-1))
{
//same
Cat1_Config.ConfigDefaultCount++;
}
else
{
//dif
//return false;
//Cat1_Config.ConfigDefaultCount--;
//config
}
vrs485Send(Cat1_Config.RecieveBuffer, sizeof(configCat_1_r));
Cat1_Config.configrecieveflag = false;
}
else
{
//no recieve
Cat1_Config.ConfigDefaultCount++;
}
}
break;
//2、AT\r\n
case 2:
{
vrs485Send((uint8_t *)configCat_2, sizeof(configCat_2)-1);
vusart0Send((uint8_t *)configCat_2, sizeof(configCat_2)-1);
Cat1_Config.ConfigDefaultCount++;
}
break;
//recieve +OK
case 3:
{
if(Cat1_Config.configrecieveflag)
{
//check data
if(vdatastorageCheckArraySame((uint8_t *)configCat_1_r, uconfigcatfind_recieve_head(Cat1_Config.RecieveBuffer), sizeof(configCat_1_r)-1))
{
//same init config
bconfigcatInit();
//limit other send
ControllerFun.Info.heartbeat = false;
//goto next step
Cat1_Config.ConfigDefaultCount++;
}
else
{
//dif
//return false;
//Cat1_Config.ConfigDefaultCount--;
//config
}
vrs485Send(Cat1_Config.RecieveBuffer, sizeof(configCat_1_r));
Cat1_Config.configrecieveflag = false;
}
else
{
//no recieve
Cat1_Config.ConfigDefaultCount--;
}
}
break;
//3、config 12 group
case 4:
{
if(sendorrecieveflag){
//to check data
if(Cat1_Config.configrecieveflag){
//recieve
if(vdatastorageCheckArraySame((uint8_t *)Cat1_Config_Data[configcount].recievebuf, uconfigcatfind_recieve_head(Cat1_Config.RecieveBuffer), uiconfigcatGetCharPlength(Cat1_Config_Data[configcount].recievebuf)-1)){
//to next config option
configcount++;
if(configcount>=CAT1_CONFIG_DATA_STRUCT_GROUP){
printf("\r\n----------complete cat1 config----------\r\n");
//complete config
configcount=0;
Cat1_Config.ConfigDefaultCount++;
}
}else{
printf("\r\n----------start config cat1 default %d----------\r\n",configcount);
//to config
vrs485Send((uint8_t *)Cat1_Config_Data[configcount].configbuf, uiconfigcatGetCharPlength(Cat1_Config_Data[configcount].configbuf)-1);
vusart0Send((uint8_t *)Cat1_Config_Data[configcount].configbuf, uiconfigcatGetCharPlength(Cat1_Config_Data[configcount].configbuf)-1);
//to read again
sendorrecieveflag = false;
}
printf("\r\n----------read cat1 config flow %d----------\r\n",configcount);
vrs485Send(uconfigcatfind_recieve_head(Cat1_Config.RecieveBuffer), uiconfigcatGetCharPlength(((char *)Cat1_Config.RecieveBuffer)));
Cat1_Config.configrecieveflag = false;
}else{
//no recieve
printf("\r\n----------can't read cat1 config %d----------\r\n",configcount);
sendorrecieveflag=false;
}
}else{
//to send cmd
printf("\r\n----------start read cat1 config %d----------\r\n",configcount);
vrs485Send((uint8_t *)Cat1_Config_Data[configcount].readbuf, uiconfigcatGetCharPlength(Cat1_Config_Data[configcount].readbuf)-1);
vusart0Send((uint8_t *)Cat1_Config_Data[configcount].readbuf, uiconfigcatGetCharPlength(Cat1_Config_Data[configcount].readbuf)-1);
sendorrecieveflag=true;
}
}
break;
case 5:
{
vrs485Send((uint8_t *)configCat_exit, sizeof(configCat_exit)-1);
vusart0Send((uint8_t *)configCat_exit, sizeof(configCat_exit)-1);
Cat1_Config.ConfigDefaultCount++;
}
break;
//exit
case 6:
{
if(Cat1_Config.configrecieveflag)
{
//check data
if(vdatastorageCheckArraySame((uint8_t *)configCat_1_r, uconfigcatfind_recieve_head(Cat1_Config.RecieveBuffer), sizeof(configCat_1_r)-1))
{
//same
Cat1_Config.ConfigDefaultCount++;
}
else
{
//dif
//return false;
Cat1_Config.ConfigDefaultCount--;
//config
}
vrs485Send(Cat1_Config.RecieveBuffer, sizeof(configCat_1_r));
Cat1_Config.configrecieveflag = false;
}
else
{
//no recieve
Cat1_Config.ConfigDefaultCount--;
}
}
break;
case 7:
{
//config complete
Cat1_Config.ConfigInitFlag = true;
ControllerFun.Info.heartbeat = true;
}
break;
}
Cat1_Config.ConfigDefaultTime = FlechazoTimer.Control.GetCurrentTime_s();
}
return true;
}