#include "general_type.h" #include "bc25.h" #include "delay.h" #include "bsp.h" char IOT_Theme_TYPE = 0; BC25 BC25_Status; void BC25CTR_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOC, &GPIO_InitStructure); PWRKEY_L; } //模块开机 void BC25_PWRKEY_ON(void) { PWRKEY_H; delay_ms(200); delay_ms(1000); PWRKEY_L; } void BC25_POWERON(void) { PWR_CTRLBC25_H; } void BC25_POWEROFF(void) { PWR_CTRLBC25_L; } u8 BC25_Init(void) { u8 i=0; char *strx; BC25_Status.netstatus=0; BC25_Status.CSQ=0; BC25_Status.cpin=0; BC25CTR_Init(); BC25_POWERON(); delay_ms(1000); BC25_PWRKEY_ON(); delay_ms(2000); USART2_ReceiveBuff_Clear(); strx=NULL; while((i<10)&(!strx)) { USART2_ReceiveBuff_Clear(); printf("AT+CPIN?\r\n");//是否装卡 delay_ms(5000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CPIN: READY");//返1 i++; if(i>3) { return 1; } } BC25_Status.cpin=1; printf("AT+CPSMS=0\r\n");//禁用PSM delay_ms(1000); printf("AT+QSCLK=0\r\n");//禁用PSM delay_ms(500); // printf("AT^TRACECTRL=1\r\n");//LOG上报 // delay_ms(1000); delay_ms(5000); //exf_getfree("0", &tf_totals, &tf_frees); strx=NULL; while((!strx)&(i<10)) { USART2_ReceiveBuff_Clear(); printf("AT\r\n"); delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,"OK");//返回OK if(!strx) { BC25_POWERON(); delay_ms(500); BC25_PWRKEY_ON(); } i++; } USART2_ReceiveBuff_Clear(); printf("AT+QSELFREGISTER=1\r\n"); //自动注册 delay_ms(300); printf("ATE0\r\n"); //关闭回显 delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//返回OK printf("AT+QLEDMODE=1\r\n"); //开启LED delay_ms(500); printf("AT+CPSMS=0\r\n");//禁用PSM delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//返回OK printf("AT+QLEDMODE=1\r\n");//led on delay_ms(500); USART2_ReceiveBuff_Clear(); printf("AT+QCCID\r\n");//检测SIM卡 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//返回OK i=0; // // // // USART2_ReceiveBuff_Clear(); // printf("AT+CPIN?\r\n");//检测SIM卡 // delay_ms(500); // strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//返回OK // i=0; while((i<15)&(!strx)) { i++; printf("AT+QCCID\r\n");//检测SIM卡 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QCCID");//返回OK if(i>10) return 1; } BC25_Status.cpin=1; // printf("AT+CGATT=1\r\n");//查询激活状态 // delay_ms(1000); USART2_ReceiveBuff_Clear(); printf("AT+CGATT?\r\n");//查询激活状态 delay_ms(1000); //u5_printf("CGATT:%s\r\n",(const char*)USART2_RX_BUF); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CGATT: 1");//返1 i=0; while((i<15)&(!strx)) { USART2_ReceiveBuff_Clear(); printf("AT+CGATT?\r\n");//查询激活状态--附网 delay_ms(2000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CGATT: 1");//返1 i++; if(i>10) return 1; } BC25_Status.netstatus=1; USART2_ReceiveBuff_Clear(); printf("AT+CESQ\r\n");//查看获取CSQ值 delay_ms(300); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CESQ");//返回CSQ if(strx) { BC25_Status.CSQ=(strx[7]-0x30)*10+(strx[8]-0x30);//获取CSQ __nop(); // if((BC25_Status.CSQ==99)||((strx[7]-0x30)==0))//说明扫网失败 // { // BC25_Status.netstatus=0; // return 7; // } // else // { // BC25_Status.netstatus=1; // } } USART2_ReceiveBuff_Clear(); // printf("AT+CSQ\r\n");// // delay_ms(500); //u5_printf("AT+CSQ:%s\r\n",(const char*)USART2_RX_BUF); return 0; //初始化成功 } void BC25_CloseSocket(void) { char *strx; u8 i=0; USART2_ReceiveBuff_Clear(); //printf("AT+QICLOSE=0\r\n");//关闭socekt连接---TCP printf("AT+QMTCLOSE=0\r\n");//关闭socekt连接---MQQT delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QMTCLOSE: 0,0");//检查是否 while((!strx)&(i<3)) { USART2_ReceiveBuff_Clear(); printf("AT+QMTCLOSE=0\r\n");//关闭socekt连接---MQQT delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QMTCLOSE: 0,0");//检查是否 //u5_printf("BC25_CloseSocket %d\r\n",i); //u5_printf("USART2_RX_BUF:%s\r\n",(const char*)USART2_RX_BUF); i++; } if(strx) { //u5_printf("BC25_CloseSocket OK\r\n"); return; } if(!strx) { USART2_ReceiveBuff_Clear(); printf("AT+QMTCLOSE=0\r\n");//关闭socekt连接---MQQT delay_ms(500); //u5_printf("BC25_CloseSocket 2\r\n"); } } void BC25_CreateSokcet(char *ip,char *port)//创建sokcet { char *strx; u8 i=0; char ID_TEMP[20] = {'\0'}; delay_ms(1000); USART2_ReceiveBuff_Clear(); // printf("AT+QMTCFG=?\r\n");//测试查看MQTT配置 // delay_ms(1000); sprintf(ID_TEMP,"\"%s\"",Init_Data_Equipment.Equipment_ID); // printf("AT+QIOPEN=1,0,\"TCP\",\"219.238.240.58\",9022,0,1\r\n");//创建连接TCP,输入IP以及服务器端口号码 ,采用直接吐出的方式 printf("AT+QMTOPEN=0,%s,%s\r\n",Init_Data_Equipment.Bc25_Ip,Init_Data_Equipment.Bc25_Port); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QMTOPEN: 0,0");//检查是否登陆成功 while((!strx)&(i<5)) { BC25_CloseSocket(); delay_ms(500); USART2_ReceiveBuff_Clear(); printf("AT+QMTOPEN=0,%s,%s\r\n",Init_Data_Equipment.Bc25_Ip,Init_Data_Equipment.Bc25_Port);//219.238.240.58 9022 delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QMTOPEN: 0,0");//检查是否登陆成功 i++; } //连接到 MQTT 服务器 USART2_ReceiveBuff_Clear(); printf("AT+QMTCONN=0,\"%s\",%s,%s\r\n",Init_Data_Equipment.Equipment_ID,Init_Data_Equipment.IOT_Username,Init_Data_Equipment.IOT_Password); //printf("AT+QMTCONN=0,\"lica\",\"lichao\",\"910517@lc\"\r\n"); // printf("AT+QMTCONN=?"); delay_ms(2000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QMTCONN: 0,0,0");//检查是否连接成功 while((!strx)&(i<5)) { BC25_CloseSocket(); delay_ms(500); USART2_ReceiveBuff_Clear(); printf("AT+QMTCONN=0,\"%s\",%s,%s\r\n",Init_Data_Equipment.Equipment_ID,Init_Data_Equipment.IOT_Username,Init_Data_Equipment.IOT_Password); //printf("AT+QMTCONN=0,\"lica\",\"lichao\",\"910517@lc\"\r\n"); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QMTCONN: 0,0,0");//检查是否连接成功 i++; } //订阅配置主题 USART2_ReceiveBuff_Clear(); printf("AT+QMTSUB=0,1,\"%s/config\",2\r\n",Init_Data_Equipment.IOT_Theme_name); //printf("AT+QMTSUB=0,1,\"bc25test\",2\r\n"); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否连接成功 while((!strx)&(i<5)) { BC25_CloseSocket(); delay_ms(500); USART2_ReceiveBuff_Clear(); printf("AT+QMTSUB=0,1,\"%s/config\",2\r\n",Init_Data_Equipment.IOT_Theme_name); //printf("AT+QMTSUB=0,1,\"bc25test\",2\r\n"); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否连接成功 i++; } // //订阅表头主题 // USART2_ReceiveBuff_Clear(); // printf("AT+QMTSUB=0,1,\"%s/tablehead\",2\r\n",Init_Data_Equipment.IOT_Theme_name); // //printf("AT+QMTSUB=0,1,\"bc25test\",2\r\n"); // delay_ms(1000); // strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否连接成功 // // while((!strx)&(i<5)) // { // BC25_CloseSocket(); // delay_ms(500); // USART2_ReceiveBuff_Clear(); // printf("AT+QMTSUB=0,1,\"%s/tablehead\",2\r\n",Init_Data_Equipment.IOT_Theme_name); // //printf("AT+QMTSUB=0,1,\"bc25test\",2\r\n"); // delay_ms(1000); // strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否连接成功 // i++; // } //订阅数据主题 USART2_ReceiveBuff_Clear(); printf("AT+QMTSUB=0,1,\"%s/data\",2\r\n",Init_Data_Equipment.IOT_Theme_name); //printf("AT+QMTSUB=0,1,\"bc25test\",2\r\n"); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否连接成功 while((!strx)&(i<5)) { BC25_CloseSocket(); delay_ms(500); USART2_ReceiveBuff_Clear(); printf("AT+QMTSUB=0,1,\"%s/data\",2\r\n",Init_Data_Equipment.IOT_Theme_name); //printf("AT+QMTSUB=0,1,\"bc25test\",2\r\n"); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否连接成功 i++; } if(strx) { BC25_Status.socket=1; //u5_printf("BC25_CreateSokcet sucess\r\n"); } if(!strx) { BC25_Status.socket=0; //u5_printf("BC25_CreateSokcet fail\r\n"); } } /* 功能:非数据模式发送指定长度的数据 int len 数据长度 char *data 数据 */ void BC25_Senddata(int len,char *data) { char *strx; char lens[5]={'\0'}; u8 times=0; USART2_ReceiveBuff_Clear(); sprintf(lens,"%d",len); //u5_printf("BC25_Senddata_lens:%s\r\n",lens); printf("AT+QISEND=0,%s,\"%s\"\r\n",lens,data);//AT+QISEND delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"SEND OK");//检查是否发送成功 while((!strx)&&(times<10)) { delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"SEND OK");//检查是否发送成功 times++; } } /* 功能:数据模式发送指定长度的数据 int len 数据长度 char *data 数据 */ u8 BC25_Senddata_mode(int len,char *data) { char *strx; // char lens[5]={'\0'}; u8 times=0; u8 i=0; USART2_ReceiveBuff_Clear(); // sprintf(lens,"%d",len); // printf("AT+QISEND=0,%s\r\n",lens); if(IOT_Theme_TYPE == IOT_Theme_config) { printf("AT+QMTPUB=0,0,0,0,\"%s/config\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } else if(IOT_Theme_TYPE == IOT_Theme_tablehead) { printf("AT+QMTPUB=0,0,0,0,\"%s/tablehead\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } else { printf("AT+QMTPUB=0,0,0,0,\"%s/data\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } //printf("AT+QMTPUB=0,0,0,0,\"bc25test\",%d\r\n",len); //u5_printf("AT+QISEND=0,%d\r\n",len); delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)">");//检查是否收到> while((!strx)&×<20) { times++; if(IOT_Theme_TYPE == IOT_Theme_config) { printf("AT+QMTPUB=0,0,0,0,\"%s/config\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } else if(IOT_Theme_TYPE == IOT_Theme_tablehead) { printf("AT+QMTPUB=0,0,0,0,\"%s/tablehead\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } else { printf("AT+QMTPUB=0,0,0,0,\"%s/data\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } //printf("AT+QMTPUB=0,0,0,0,\"bc25test\",%d\r\n",len); delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)">");//检查是否收到> if(!strx) { USART2_ReceiveBuff_Clear(); if(IOT_Theme_TYPE == IOT_Theme_config) { printf("AT+QMTPUB=0,0,0,0,\"%s/config\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } else if(IOT_Theme_TYPE == IOT_Theme_tablehead) { printf("AT+QMTPUB=0,0,0,0,\"%s/tablehead\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } else { printf("AT+QMTPUB=0,0,0,0,\"%s/data\",%d\r\n",Init_Data_Equipment.IOT_Theme_name,len); } //printf("AT+QMTPUB=0,0,0,0,\"bc25test\",%d\r\n",len); //u5_printf("AT+QISEND=0,%d\r\n",len); } //u5_printf("time1:%d,rx1:%s\r\n",times,(const char*)USART2_RX_BUF); } if(!strx)return 1; delay_ms(500); printf("%s",data); //u5_printf("%s",data); delay_ms(1000); times=0; strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否发送成功 while((!strx)&×<20) { times++; printf("%s",data); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//检查是否发送成功 if(!strx) { USART2_ReceiveBuff_Clear(); printf("%s",data); //u5_printf("%s",data); } //u5_printf("time2:%d,rx2:%s\r\n",times,(const char*)USART2_RX_BUF); } if(strx)return 0; else return 1; } void BC25_RECData(void) { char *strx; strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QIURC");//返回+QIURC if(strx) { USART2_ReceiveBuff_Clear(); //待写内容 } } int set_years, set_mons, set_days, set_hours, set_mins , set_secs; void BC25_time_RTC(void) { u8 i=0; char *strx; BC25CTR_Init(); BC25_POWERON(); delay_ms(1000); BC25_PWRKEY_ON(); delay_ms(500); printf("AT+CPSMS=0\r\n");//禁用PSM delay_ms(1000); printf("AT+QSCLK=0\r\n");//禁用PSM delay_ms(8000); //USART2_ReceiveBuff_Clear(); printf("AT+CPIN?\r\n");//禁用PSM delay_ms(500); //USART2_ReceiveBuff_Clear(); printf("AT+CEREG?\r\n");//禁用PSM delay_ms(500); // USART2_ReceiveBuff_Clear(); printf("AT+CFUN?\r\n");//禁用PSM delay_ms(500); //USART2_ReceiveBuff_Clear(); printf("AT+QBAND?\r\n");//禁用PSM delay_ms(500); //printf("AT+QSELFREGISTER=1\r\n"); //自动注册 strx=NULL; while((i<60)&(!strx)) { i++; USART2_ReceiveBuff_Clear(); printf("AT+CGATT?\r\n");//查询激活状态 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CGATT: 1");//返1 } if(!strx)return; strx=NULL; while((i<60)&(!strx)) { USART2_ReceiveBuff_Clear(); printf("AT+CCLK?\r\n");//查询网络时间 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CCLK:");//返1 } if(!strx)return; strx=strstr((const char*)USART2_RX_BUF,(const char*)"\"");// strx++; set_years=(strx[0]-'0')*10+(strx[1]-'0');//年 set_mons=(strx[3]-'0')*10+(strx[4]-'0');//月 set_days=(strx[6]-'0')*10+(strx[7]-'0');//日 set_hours=(strx[9]-'0')*10+(strx[10]-'0');//时 set_mins=(strx[12]-'0')*10+(strx[13]-'0');//分 set_secs=(strx[15]-'0')*10+(strx[16]-'0');//秒 if(set_years>20) SetRTC(set_years,set_mons,set_days,set_hours,set_mins,set_secs); // printf("AT+QENG=0\r\n");// // delay_ms(500); // u5_printf("AT+QENG=0:%s\r\n",(const char*)USART2_RX_BUF); // USART2_ReceiveBuff_Clear(); // printf("AT+CSQ\r\n");// // delay_ms(500); // u5_printf("AT+CSQ:%s\r\n",(const char*)USART2_RX_BUF); // USART2_ReceiveBuff_Clear(); // printf("ATI\r\n");// // delay_ms(500); // u5_printf("ATI:%s\r\n",(const char*)USART2_RX_BUF); } //void BC25_Process(void) //{ // char SEND_DATA[500] = {'\0'}; // BC25_Init(); //初始化 // BC25_CloseSocket();//关闭上一次连接 // BC25_CreateSokcet(Init_Data_Equipment.Bc25_Ip,Init_Data_Equipment.Bc25_Port);//创建连接 // sprintf(SEND_DATA, "Pub-%s\r\n",data_common1.Pack_data); // //BC25_Senddata_mode(4,"Pub-"); // BC25_Senddata_mode(strlen(SEND_DATA),(SEND_DATA)); // //BC25_Senddata_mode(2,"\r\n"); //}