#include "delay.h"
#include "usart.h"
#include "app_config.h"
#include "sys_app.h"
#include "iic.h"
#include "24cxx.h"
#include "debug.h"
#include "KEY.h"
#include "timer.h"
#include "hc05.h"
#include "nb.h"
#include "onenet.h"
#include "mqttkit.h"
#include "RF.h"
#include "GMS.h"
#include "Motor.h"
#include "usart2.h"
#include "usart3.h"
#include "adc.h"
#include "string.h"
#include "RF.h"
#include "LED.h"
#include "RFTimer.h"
#include "UltrasonicWave.h"
#include "math.h"
#include "stdio.h"
#include "stm32f10x_flash.h"
#include "stdlib.h"
#include "stm32f10x_tim.h"
u8 MSG=KEY_FREE;
extern u8 UartDmaBuf3[USART_DMA_REC_LEN3];
extern u8 UartDmaBuf2[USART_DMA_REC_LEN2];
extern u8 UartDmaBuf[USART_DMA_REC_LEN];
extern char *strx;
u8 MCUStatus=0;
u8 NBMode=0;
u8 BTMode=0;
u8 RFMode=0;
extern float Result_Valtage;
extern u16 Get_Voltage_Time;
extern u8 Get_Voltage_Flag;
u8 CheckTime=200;
u16 CheckTime1=400;
u8 UsartCheckStatus=0;
uint8_t rf_data[4];
extern uint8_t decode_ok;
extern uint8_t RF;
extern u8 BTStart;
u8 i=0;
extern u16 CheckCarTime;
u8 MotorStatus=3;
u8 GMSStatus=3;
u8 IICReaddate=0;
u8 ErrCode=0X00;
u8 Valtage[4];
u8 ISHaveCar=0;
u8 SendDataBuffer[6];
u8 Readfloat2Byte[4];
u8 BTACK=0;
u8 tongxinzhuangtai[1];
extern u8 CarLeave;
void Get_Send_Data(void);
void NB_BT_ActionIn(void);
void NB_Process(void);
void BT_Process(void);
void Get_Send_Data(void);
u8 Check_Car(void);
void CheckCarErrCode(u8 Status);
void Send_Data(void);
extern u8 KEYUPStatus;
extern u8 KEYDownStatus;
u32 count=0;
u8 KEY_UP_DOWN;
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SCB->VTOR = FLASH_BASE | 0x02000;
PortInit();
uart_init(9600);
uart_init3(9600);
APP_DBG("HC05准备初始化\r\n");
Adc_Init();
GMS_Init();
RF_Init();
Motor_Init();
HC05_Init();
NB_init(MODE, ONENET_SERVER, ONENET_PORT);
UltrasonicWave_Configuration();
LED_ON_OFF(0);
delay_ms(100);
LED_ON_OFF(1);
delay_ms(100);
LED_ON_OFF(0);
delay_ms(100);
LED_ON_OFF(1);
delay_ms(100);
HC05_ON_OFF(HC05_ON);
while(1)
{
while(nb.mqtt_state != MQTT_REQUEST_IDLE)
{
OneNet_DevLink();
delay_ms(1000);
NB_GetData();
delay_ms(1000);
NB_GetData();
}
while(nb.mqtt_state == MQTT_REQUEST_IDLE)
{
if(0==(count%20000))
{
onenet_mqtt_send_heart();
}
if((count%2000)==0)
{
NB_CycleCheck();
const signed char *g_mqtt_topics[] = {"mqtt_topic", "topic_test"};
if(0 == onenet_mqtt_subscribe_topic(g_mqtt_topics, 2));
}
if(0==(count%5000))
{
OneNet_SendData(UltrasonicWave_Distance, 0, 1, 2, 3);
}
count++;
NB_GetData();
delay_ms(10);
}
}
}
void Send_Data(void)
{
if(UartDmaBuf[1]==0X03)
{
Clear_Buffer1();
tongxinzhuangtai[0]=0X03;
Get_Send_Data();
}
}
void Get_Send_Data(void)
{
ADC_ON_OFF(ADC_ON);
Result_Valtage=Get_Adc_Average(1,30);
APP_DBG("电压值 %.3f \r\n",Result_Valtage);
if(Result_Valtage<1)
{
if( (ErrCode==0X01) || (ErrCode==0X04) )
{
ErrCode=0X04;
}
else
{
ErrCode=0X02;
}
}
else
{
ErrCode&=0X0D;
}
AT24CXX_Write( ADD_BYTE+EEPROM_ERRCODE, &ErrCode , 1 );
Float2Byte(Result_Valtage,Valtage);
AT24CXX_Write( ADD_FLOAT+4*EEPROM_VALTAGE, &Valtage[0] , 4 );
SendDataBuffer[0]=ISHaveCar;
for(i=0;i<4;i++)
{
SendDataBuffer[i+1]=Valtage[i];
}
SendDataBuffer[5]=ErrCode;
if(ErrCode==0X00)
{
}
else
{
}
Get_Voltage_Time=0;
CheckCarTime=0;
}
void NB_Process(void)
{
if( (UartDmaBuf[1]==0X01) && (BTMode==0) && (RFMode==0) && (ErrCode==0) )
{
Clear_Buffer1();
MCUStatus=1;
NBMode=1;
BTMode=0;
tongxinzhuangtai[0]=0X01;
Uart1Print("进入NB模式",1);
NB_BT_ActionIn();
}
}
void BT_Process(void)
{
if( (UartDmaBuf3[1]==0X01) && (NBMode==0) && (RFMode==0) && (ErrCode==0) )
{
Clear_Buffer3();
MCUStatus=1;
NBMode=0;
BTMode=1;
tongxinzhuangtai[0]=0X02;
Uart1Print("进入BT模式",1);
NB_BT_ActionIn();
}
}
void NB_BT_ActionIn(void)
{
if( ((NBMode==1) || ( BTMode==1 )) && (RFMode==0))
{
Uart1Print("超声波模式已开启",1);
APP_DBG("超声波模式已开启");
UltrasonicWave_StartMeasure();
DelayMs(2000);
while((int)UltrasonicWave_Distance==0);
if((int)UltrasonicWave_Distance>30) GMSStatus=0;
else GMSStatus=1;
if(GMSStatus ==1 )
{
Uart1Print("该车位有车,禁止使用",1);
APP_DBG("该车位有车,禁止使用");
ISHaveCar=1;
}
else if(GMSStatus==0)
{
Uart1Print("该车位无车,可以使用",1);
APP_DBG("该车位无车,可以使用");
ISHaveCar=0;
Motor_Move(MOTOR_DOWN,3);
CheckTime1=100;
while( (CheckTime--) && (GMSStatus==0) )
{
while(CheckTime1>10);
UltrasonicWave_StartMeasure();
DelayMs(2000);
while((int)UltrasonicWave_Distance==0);
if((int)UltrasonicWave_Distance>30)
GMSStatus=0;
else
GMSStatus=1;
if(GMSStatus==1)
{
Uart1Print("有车进入,开始计费",1);
APP_DBG("有车进入,开始计费");
ISHaveCar=1;
break;
}
else if(GMSStatus==0)
{
Uart1Print("无车进入",1);
APP_DBG("无车进入");
MotorStatus=Motor_Move(MOTOR_UP,100);
CheckCarErrCode(MotorStatus);
ISHaveCar=0;
}
}
}
NBMode=0;
BTMode=0;
Clear_Buffer1();
Get_Send_Data();
GMS_ON_OFF(GMS_OFF);
MCUStatus=0;
CheckTime=200;
}
}
u8 Check_Car(void)
{
GMS_ON_OFF(GMS_ON);
DelayMs(100);
Clear_Buffer2();
MCUSend2GMS(0XAA,0X00,0X04);
DelayMs(100);
GMS_ON_OFF(GMS_OFF);
return GMSProcess(UartDmaBuf2);
}
void CheckCarErrCode(u8 Status)
{
if(MotorStatus==1)
{
Uart1Print("暂时没车,可以使用",1);
ISHaveCar=0;
ErrCode&=0X0E;
}
else if(MotorStatus==0)
{
Uart1Print("有车进入,开始计费",1);
ISHaveCar=1;
ErrCode&=0X0E;
}
else if(MotorStatus==2)
{
if(ErrCode==0X02)
{
ErrCode=0X04;
}
else
{
ErrCode=0X01;
}
}
}
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "nb.h"
#include "led.h"
#include "debug.h"
char gAtParseBuff[MAX_AT_PARSE_LEN]={0};
NB_DATA nb;
void NB_CloseSocket(void);
void NB_Printf(const char * pFormat, ...)
{
#if 1
int len=0;
char info[512] = {0};
va_list args;
va_start(args, pFormat);
vsprintf(&info[0], (const char*)pFormat, args);
va_end(args);
len=strlen((const char *)info);
APP_DBG((u8*)info, len);
#endif
}
void NB_ms(u16 ms)
{
delay_ms(ms);
}
void changeLine(void)
{
u8 index=0;
nb.parseAt.insertCurCount=0;
nb.parseAt.insertIdx++;
if(nb.parseAt.insertIdx>=MAX_AT_PARSE_LINE)
{
nb.parseAt.insertIdx=0;
}
index=nb.parseAt.insertIdx;
memset(nb.parseAt.line[index], 0, MAX_AT_PARSE_LEN);
nb.parseAt.count[index]=0;
}
void AddUartChar(unsigned char c)
{
u8 index=nb.parseAt.insertIdx;
u16 count=nb.parseAt.count[index];
static u8 lastCH=0;
if(0)
{
if(count>0)
{
changeLine();
}
}
else
{
if(count>=MAX_AT_PARSE_LEN)
{
changeLine();
}
else
{
nb.parseAt.line[index][count]=c;
nb.parseAt.insertCurCount++;
nb.parseAt.count[index]+=1;
if(count==0&&c=='>')
{
changeLine();
}
else if(lastCH=='\r'&& c=='\n')
{
changeLine();
}
}
}
lastCH=c;
}
u16 NB_GetLine(char* buff)
{
static u8 line=0;
static u16 insertCount=0;
static u8 checkCount=0;
memset(buff, 0, MAX_AT_PARSE_LEN);
if(nb.parseAt.parseIdx==nb.parseAt.insertIdx)
{
if(line==nb.parseAt.parseIdx
&& nb.parseAt.count[line]>0
&& insertCount==nb.parseAt.count[line])
{
checkCount++;
}
else
{
line=nb.parseAt.parseIdx;
insertCount=nb.parseAt.count[line];
checkCount=0;
}
if(checkCount>3)
{
changeLine();
NB_Printf("*******changeLine*******\r\n");
}
return 0;
}
else
{
u16 len=0;
u8 index=nb.parseAt.parseIdx;
len=nb.parseAt.count[index];
memcpy(buff, nb.parseAt.line[index], len);
NB_Printf("[%d],[%d],%s",nb.parseAt.parseIdx,len,nb.parseAt.line[index]);
memset(nb.parseAt.line[index], 0, MAX_AT_PARSE_LEN);
nb.parseAt.count[index]=0;
nb.parseAt.parseIdx++;
if(nb.parseAt.parseIdx>=MAX_AT_PARSE_LINE)
{
nb.parseAt.parseIdx=0;
}
line=0;
insertCount=0;
checkCount=0;
return len;
}
return 0;
}
void NB_InsertSocketAndLen(u8 socket, u16 len)
{
u8 index=nb.rx.insertIdx;
nb.rx.socket[index]=socket;
nb.rx.len[index]=len;
nb.rx.insertIdx++;
if(nb.rx.insertIdx>=MAX_RX_DATA_LEN)
{
nb.rx.insertIdx=0;
}
}
u8 NB_GetRxSocketAndLen(u8* socket, u16* len)
{
if(socket==NULL) return 0;
if(len==NULL) return 0;
if(nb.rx.parseIdx==nb.rx.insertIdx)
{
return 0;
}
else
{
u8 index=nb.rx.parseIdx;
NB_Printf("GetRX, [%d],%d,%d.\r\n",index, nb.rx.socket[index],nb.rx.len[index]);
*socket=nb.rx.socket[index];
*len=nb.rx.len[index];
nb.rx.socket[index]=0;
nb.rx.len[index]=0;
nb.rx.parseIdx++;
if(nb.rx.parseIdx>=MAX_RX_DATA_LEN)
{
nb.rx.parseIdx=0;
}
}
return 1;
}
void NB_powerOn(u8 on)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
if(on>0)
{
NB_ms(500);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
NB_Printf("\r\npower\r\n");
}
void writeAtPrintf(const char * pFormat, ...)
{
#if 1
int len=0;
char info[512] = {0};
va_list args;
va_start(args, pFormat);
vsprintf(&info[0], (const char*)pFormat, args);
va_end(args);
len=strlen((const char *)info);
USART1_send_buff((u8*)info,len);
#endif
}
void writeAtCmd(u8* cmd)
{
u16 len=0;
if(cmd==NULL) return;
len=strlen((const char*)cmd);
USART1_send_buff(cmd,len);
NB_Printf("AT>>>:%s\r\n", cmd);
}
u8 NB_SendAT(char* cmd, u8 wait)
{
u32 len;
u8 ok_error=0;
u8 timeout=0;
if(cmd==NULL) return 0;
writeAtCmd((u8*)cmd);
if(0==wait)
{
return 0;
}
ok_error=0;
timeout=0;
while(1)
{
NB_ms(50);
len=NB_GetLine(gAtParseBuff);
if(len>0)
{
if((char*)strstr((const char*)gAtParseBuff,(const char*)"OK")!=NULL)
{
ok_error=1;
}
else if((char*)strstr((const char*)gAtParseBuff,(const char*)"ERROR")!=NULL
||(char*)strstr((const char*)gAtParseBuff,(const char*)"FAIL")!=NULL)
{
ok_error=3;
}
else
{
NB_parseDefaultMsg(gAtParseBuff,len);
}
}
timeout++;
if(ok_error>0) break;
if(timeout>200)
{
ok_error=2;
break;
}
}
NB_Printf((u8*)"END AT:%s",cmd);
return ok_error;
}
u8 NB_parseOperator(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+COPS:");
if(ptr!=NULL)
{
ptr+=6;
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr==NULL) return 0;
ptr++;
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr==NULL) return 0;
ptr++;
if(ptr!=NULL)
{
int index=0;
while(ptr!=NULL && *ptr!='\"') ptr++;
ptr++;
memset(nb.gOperator, 0, 30);
while(index<20 && ptr!=NULL && *ptr!='\"')
{
nb.gOperator[index]=*ptr;
ptr++;
index++;
}
}
return 1;
}
return 0;
}
u8 NB_parseCsq(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+CSQ:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=5;
while(ptr!=NULL && *ptr==' ') ptr++;
nb.csq=atoi(ptr);
return 1;
}
return 0;
}
u8 NB_parseSn(u8* cmd, u32 len)
{
char *ptr = cmd;
if(cmd==NULL) return 0;
if(*ptr>='0'&&*ptr<='Z')
{
u8 index=0;
while(index<20 && ptr!=NULL && (*ptr>='0'&&*ptr<='Z'))
{
nb.sn[index]=*ptr;
ptr++;
index++;
}
return 1;
}
return 0;
}
u8 NB_parseImei(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+CGSN:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=6;
while(ptr!=NULL && *ptr==' ') ptr++;
while(index<20 && ptr!=NULL && (*ptr>='0'&&*ptr<='9'))
{
nb.imei[index]=*ptr;
ptr++;
index++;
}
return 1;
}
return 0;
}
u8 NB_parseImsi(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+CIMI:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=6;
while(ptr!=NULL && *ptr==' ') ptr++;
while(index<20 && ptr!=NULL && (*ptr>='0'&&*ptr<='9'))
{
nb.imsi[index]=*ptr;
ptr++;
index++;
}
return 1;
}
return 0;
}
u8 NB_parseRegistrationStatus(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+CEREG:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=7;
while(ptr!=NULL && *ptr==' ') ptr++;
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr==NULL) return 0;
ptr++;
nb.RegStatus=atoi(ptr);
return 1;
}
return 0;
}
u8 NB_parseSignallingConnectionStatus(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+CSCON:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=7;
while(ptr!=NULL && *ptr==' ') ptr++;
nb.ConnectionStatus=atoi(ptr);
return 1;
}
return 0;
}
u8 NB_parseNBand(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+NBAND:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=7;
while(ptr!=NULL && *ptr==' ') ptr++;
nb.nband=atoi(ptr);
return 1;
}
return 0;
}
u8 NB_parseCheckAttach(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+CGATT:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=7;
while(ptr!=NULL && *ptr==' ') ptr++;
nb.attach=atoi(ptr);
return 1;
}
return 0;
}
u8 NB_parseGetLocalIp(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+CGPADDR:");
if(ptr!=NULL)
{
u8 index=0;
ptr+=9;
while(ptr!=NULL && *ptr==' ') ptr++;
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr==NULL) return 0;
ptr++;
memset(nb.localIp, 0, sizeof(nb.localIp));
while(index<20 && ptr!=NULL && ((*ptr>='0'&&*ptr<='9')||*ptr=='.'))
{
nb.localIp[index]=*ptr;
ptr++;
index++;
}
return 1;
}
return 0;
}
u8 NB_parseReceiveCommand(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+NSONMI:");
if(ptr!=NULL)
{
u8 socket=0;
u16 dataLen=0;
u8 buff[20]={0};
ptr+=8;
socket=atoi(ptr);
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr==NULL) return 0;
ptr++;
dataLen=atoi(ptr);
printf("socket:%d, dataLen=%d.\r\n", socket, dataLen);
NB_InsertSocketAndLen(socket, dataLen);
return 1;
}
return 0;
}
u8 NB_parseSocketClose(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
ptr = (char*)strstr((const char*)cmd,(const char*)"+NSOCLI:");
if(ptr!=NULL)
{
u8 type=0;
u16 dataLen=0;
u8 buff[20]={0};
ptr+=8;
while(ptr!=NULL && *ptr==' ') ptr++;
type=atoi(ptr);
printf("type=%d.\r\n", type);
NB_CloseSocket();
return 1;
}
return 0;
}
u8 NB_parseDefaultMsg(u8* cmd, u32 len)
{
char *ptr = NULL;
if(cmd==NULL) return 0;
if(NB_parseOperator( cmd, len)) return 1;
if(NB_parseCsq( cmd, len)) return 1;
if(NB_parseImei( cmd, len)) return 1;
if(NB_parseImsi( cmd, len)) return 1;
if(NB_parseRegistrationStatus( cmd, len)) return 1;
if(NB_parseSignallingConnectionStatus( cmd, len)) return 1;
if(NB_parseNBand( cmd, len)) return 1;
if(NB_parseGetLocalIp( cmd, len)) return 1;
if(NB_parseCheckAttach( cmd, len)) return 1;
if(NB_parseReceiveCommand( cmd, len)) return 1;
if(NB_parseSocketClose( cmd, len)) return 1;
return 0;
}
void NB_CheckCops(void)
{
u8 timeout=10;
while(timeout-->0)
{
NB_SendAT("AT+COPS?\r\n",1);
if(strlen(nb.gOperator)>0) break;
NB_ms(3000);
}
}
void NB_SetNetWork(void)
{
u8 cmd[30]={0};
u8 nband=N_BAND_MOBILE;
if(strlen(nb.imsi)>0)
{
if((char*)strstr((const char*)nb.imsi,(const char*)"46011")!=NULL)
{
nband=N_BAND_TELECOM;
}
}
NB_SendAT("AT+NBAND?\r\n",1);
if(nband!=nb.nband)
{
sprintf(cmd, "AT+NBAND=%d\r\n", nband);
if(1==NB_SendAT(cmd,1))
{
nb.nband=nband;
}
}
}
void NB_CheckCSQ(void)
{
NB_SendAT("AT+CSQ\r\n",1);
}
void NB_GetSn(void)
{
u16 len=0;
u8 tryCount=20;
u8 timeout=0;
do
{
NB_SendAT("AT+CGSN\r\n",0);
while(1)
{
NB_ms(50);
len=NB_GetLine(gAtParseBuff);
if(len>0)
{
if((char*)strstr((const char*)gAtParseBuff,(const char*)"OK")!=NULL)
{
break;
}
else if((char*)strstr((const char*)gAtParseBuff,(const char*)"ERROR")!=NULL
||(char*)strstr((const char*)gAtParseBuff,(const char*)"FAIL")!=NULL)
{
break;
}
else if(len==2 && (char*)strstr((const char*)gAtParseBuff,(const char*)"\r\n")!=NULL)
{
continue;
}
else if(len==17)
{
NB_parseSn(gAtParseBuff,len);
}
}
timeout++;
if(timeout>100)
{
break;
}
}
if(strlen(nb.sn)>0) break;
NB_ms(1000);
}while(tryCount-->0);
}
void NB_GetImei(void)
{
u8 timeout=20;
while(timeout-->0)
{
NB_SendAT("AT+CGSN=1\r\n",1);
if(strlen(nb.imei)>0) break;
NB_ms(1000);
}
}
void NB_GetImsi(void)
{
u8 timeout=20;
while(timeout-->0)
{
NB_SendAT("AT+CIMI\r\n",1);
if(strlen(nb.imsi)>0) break;
NB_ms(1000);
}
}
void NB_GetNetworkRegistrationStatus(void)
{
NB_SendAT("AT+CEREG?\r\n",1);
}
u8 NB_CheckAttach(void)
{
NB_SendAT("AT+CGATT?\r\n",1);
if(nb.attach==1)
{
NB_SendAT("AT+CGPADDR\r\n",1);
return 1;
}
memset(nb.localIp, 0, sizeof(nb.localIp));
return 0;
}
u8 NB_Attach(void)
{
int tryTime=10;
if(NB_CheckAttach()==1) return 1;
NB_SendAT("AT+CGDCONT=1,\"IP\",\"HUAWEI.COM\"\r\n",1);
NB_SendAT("AT+CGATT=1\r\n",1);
while(tryTime>0)
{
if(NB_CheckAttach()==0) return 1;
NB_ms(500);
tryTime--;
}
return 0;
}
void NB_CreateSocket(u8* cmd)
{
u16 len=0;
u8 timeout=0;
if(cmd==NULL) return;
NB_SendAT(cmd,0);
while(1)
{
NB_ms(50);
len=NB_GetLine(gAtParseBuff);
if(len>0)
{
if((char*)strstr((const char*)gAtParseBuff,(const char*)"OK")!=NULL)
{
break;
}
else if((char*)strstr((const char*)gAtParseBuff,(const char*)"ERROR")!=NULL
||(char*)strstr((const char*)gAtParseBuff,(const char*)"FAIL")!=NULL)
{
break;
}
else if(len==3 && gAtParseBuff[0]>='0' && gAtParseBuff[0]<='9')
{
nb.net.socket=gAtParseBuff[0]-0x30;
}
}
timeout++;
if(timeout>100)
{
break;
}
}
NB_Printf("nb.net.socket=%d.\r\n", nb.net.socket);
}
void NB_CloseSocket(void)
{
u8 cmd[50]={0};
printf("NB_CloseSocket.\r\n");
sprintf(cmd, "AT+NSOCL=%d\r\n",nb.net.socket);
if(1==NB_SendAT(cmd,1))
{
}
nb.net.socket=-1;
nb.isConnect=0;
nb.mqtt_state=MQTT_REQUEST_INIT;
}
void NB_CreateConnect(u8 mode, u8* s_ip, u16 s_port)
{
u8 cmd[50]={0};
if(mode==NB_TCP)
{
if(nb.net.socket==-1)
{
NB_CreateSocket("AT+NSOCR=STREAM,6,10000,1\r\n");
}
if(nb.net.socket>=0)
{
sprintf(cmd, "AT+NSOCO=%d,%s,%d\r\n",nb.net.socket,s_ip,s_port);
if(1==NB_SendAT(cmd,1))
{
nb.isConnect=1;
}
else
{
NB_CloseSocket();
}
}
}
else if(mode==NB_UDP)
{
nb.net.socket=-1;
nb.isConnect=0;
NB_CreateSocket("AT+NSOCR=DGRAM,17,10000,1\r\n");
if(nb.net.socket>=0)
{
nb.isConnect=1;
}
}else return;
}
void Reboot(void)
{
NB_SendAT("AT+NRB\r\n" , 0);
}
void NB_CycleCheck(void)
{
NB_GetNetworkRegistrationStatus();
NB_CheckCSQ();
NB_Attach();
}
char NumberToLetter(u8 number)
{
char buff[]="0123456789ABCDEF";
if(number>15) return 0;
return buff[number];
}
u16 AscllToHex(u8* ascll, u16 ascll_len, u8* hex, u16 hex_len)
{
u8 temp=0;
int i=0;
u16 len=0;
if(ascll==NULL) return 0;
if(hex==NULL) return 0;
for(i=0; i<ascll_len && i<(hex_len/2); i++)
{
temp= ascll[i];
hex[i*2]=NumberToLetter((temp>>4)&0x0f);
hex[i*2+1]=NumberToLetter(temp&0x0f);
len+=2;
}
return len;
}
u8 LetterToNumber(u8 c)
{
int i=0;
u8 buff[]="0123456789ABCDEF";
for(i=0; i<16; i++)
{
if(buff[i]==c) return i;
}
return 0;
}
u16 HexToAscll(u8* ascll, u16 ascll_len, u8* hex, u16 hex_len)
{
int i=0;
u16 len=0;
u8 h=0,l=0;
if(ascll==NULL) return 0;
if(hex==NULL) return 0;
for(i=0; i<hex_len;)
{
h= hex[i];
l= hex[i+1];
ascll[len]=(LetterToNumber(h)<<4) + (LetterToNumber(l));
i+=2;
len++;
}
return len;
}
unsigned char NB_SendData(u8* data, u16 len)
{
char cmd[100]={0};
u16 L=0;
NB_Printf((u8*)"NB_SendData:%s.\r\n",data);
if(nb.isConnect==0)
{
NB_CreateConnect(nb.net.mode, nb.net.remote_ip, nb.net.remote_port);
}
NB_Printf((u8*)"Connect:%d,socket:%d.\r\n",nb.isConnect, nb.net.socket);
if(nb.isConnect>0)
{
nb.net.len=0;
memset(nb.net.data, 0, MAX_NB_TX_RX_LEN);
nb.net.len=AscllToHex(data, len, nb.net.data, MAX_NB_TX_RX_LEN);
if(nb.net.mode==NB_TCP)
{
sprintf(cmd, "AT+NSOSD=%d,%d,",nb.net.socket, len);
}
else if(nb.net.mode==NB_UDP)
{
sprintf(cmd, "AT+NSOST=%d,%s,%d,%d,",nb.net.socket,nb.net.remote_ip,nb.net.remote_port, len);
}else return 0;
NB_SendAT(cmd,0);
NB_SendAT(nb.net.data,0);
if(1==NB_SendAT("\r\n",1)) return 1;
}
return 0;
}
void NB_GetData(void)
{
u16 timeout=0;
char cmd[100]={0};
u8 s=0;
u16 len=0, l=0;
while (1)
{
len=NB_GetLine(gAtParseBuff);
if(len>0)
{
NB_parseDefaultMsg(gAtParseBuff, len);
}
else break;
}
if(NB_GetRxSocketAndLen(&s, &l)>0)
{
sprintf(cmd, "AT+NSORF=%d,%d\r\n", s, l);
NB_SendAT(cmd,0);
while(1)
{
NB_ms(50);
len=NB_GetLine(gAtParseBuff);
if(len>0)
{
if((char*)strstr((const char*)gAtParseBuff,(const char*)"OK")!=NULL)
{
break;
}
else if((char*)strstr((const char*)gAtParseBuff,(const char*)"ERROR")!=NULL
||(char*)strstr((const char*)gAtParseBuff,(const char*)"FAIL")!=NULL)
{
break;
}
else if(len==2 && (char*)strstr((const char*)gAtParseBuff,(const char*)"\r\n")!=NULL)
{
continue;
}
else
{
u8 s1=0;
u16 len1=0;
u8* ptr = gAtParseBuff;
u8* ptr1 = NULL;
s1=atoi(ptr);
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr!=NULL)
{
ptr++;
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr!=NULL)
{
ptr++;
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr!=NULL)
{
ptr++;
len1=atoi(ptr);
if(s1==s && len1==l)
{
ptr = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr!=NULL)
{
ptr++;
ptr1 = (char*)strstr((const char*)ptr,(const char*)",");
if(ptr1!=NULL)
{
len=ptr1-ptr;
if(len>0)
{
nb.net.len=0;
memset(nb.net.data, 0, MAX_NB_TX_RX_LEN);
nb.net.len=HexToAscll(nb.net.data, MAX_NB_TX_RX_LEN, ptr, len);
printf("RX:%d,%s.\r\n", nb.net.len,nb.net.data);
NB_RxData(nb.net.data, nb.net.len);
continue;
}
}
}
}
}
}
}
NB_parseDefaultMsg(gAtParseBuff, len);
}
}
timeout++;
if(timeout>100)
{
break;
}
}
}
}
void NB_close(void)
{
}
void NB_init(u8 mode, u8* s_ip, u16 s_port)
{
memset(&nb, 0, sizeof(NB_DATA));
nb.isConnect=0;
nb.net.socket=-1;
nb.mqtt_state=MQTT_REQUEST_INIT;
nb.net.mode=mode;
sprintf(nb.net.remote_ip, s_ip);
nb.net.remote_port=s_port;
NB_SendAT("ATE0\r\n",1);
NB_SendAT("AT+CMEE=1\r\n",1);
NB_SendAT("AT+CEREG=1\r\n",1);
NB_SendAT("AT+COPS=0\r\n",1);
NB_SendAT("AT+CSCON=1\r\n",1);
NB_SendAT("AT+CGATT=1\r\n",1);
NB_GetImsi();
NB_SetNetWork();
NB_CheckCops();
NB_CheckCSQ();
NB_GetImei();
NB_GetNetworkRegistrationStatus();
}
#include "sys.h"
#include "usart.h"
#include "stm32f10x_usart.h"
#include "app_config.h"
#include "Sys_app.h"
#include "delay.h"
#include "Debug.h"
#include "LED.h"
#include "Motor.h"
#include "usart2.h"
#include "delay.h"
#include "nb.h"
#include "usart3.h"
extern u8 UartDmaBuf2[USART_DMA_REC_LEN2];
extern u8 UartDmaSendBuf2[200];
extern u8 UartDmaBuf3[USART_DMA_REC_LEN3];
extern u8 UartDmaSendBuf3[200];
extern u8 QgLocation;
extern u8 MSG;
u8 UartDmaSendBuf[200];
u8 UartDmaBuf[USART_DMA_REC_LEN];
u8 UartDmaSendBuf00[1];
unsigned char uart1_getok;
u16 UartDataCount1;
extern u8 NBMode;
extern u8 BTMode;
extern u8 RFMode;
char RxCounter,RxBuffer[100];
char RxCounter1,RxBuffer1[100];
unsigned char uart1_getok;
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART3->SR&0X40)==0);
USART3->DR = (u8) ch;
return ch;
}
#endif
char RxCounter,RxBuffer[100];
char RxCounter1,RxBuffer1[100];
u16 USART_RX_STA=0;
extern u8 Timeout;
void Usart1Send(u16 Data)
{
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
USART_SendData(USART1,Data);
}
void SendChar(uint8 t)
{
while((USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET));
USART_SendData(USART1,t);
}
void Usart1SendArray(u8 *buf,u8 len)
{
u8 t;
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1,buf[t]);
}
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
void Uart1Print(char *p,u8 AutoChange)
{
u8 i=0;
while(p[i]!='\0')
{
Usart1Send(p[i]);
i++;
}
if(AutoChange!=0)
{
Usart1Send(0x0d);
Usart1Send(0x0a);
}
}
void uart_init(u32 bound){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
USART_DeInit(USART1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
void Uart1_SendStr(char*SendBuf)
{
while(*SendBuf)
{
while((USART1->SR&0X40)==0);
USART1->DR = (u8) *SendBuf;
SendBuf++;
}
}
void Uart1_SendDATA(char*SendBuf,char len)
{
u8 i;
for(i=0;i<len;i++)
{
while((USART2->SR&0X40)==0);
USART2->DR = SendBuf[i];
}
}
void USART1_IRQHandler(void)
{
char Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res=USART_ReceiveData(USART1);
AddUartChar((unsigned char) Res);
}
}
void Clear_Buffer1(void)
{
u8 i;
for(i=0;i<UartDataCount1;i++)
UartDmaBuf[i]=0;
}
void USART1_send_buff(u8* buf,u32 len)
{
u32 i;
for(i=0;i<len;i++)
USART1_send_char(buf[i]);
}
void USART1_send_char(u8 temp)
{
USART_SendData(USART1,(u8)temp);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}