| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720 |
- #include "air780e.h"
- FIFO_T g_4Grxfifo; // 4G的接收缓冲区
- FIFO_T g_4Gtxfifo; // 4G的发送缓冲区
- _4GMsgInfo g_4gMsg;
- MqttMsg g_mqttMsg;
- MqttCHmsg g_mqttCHmsg;
- extern volatile uint32_t g_tick;
- static uint8_t _tempbuff[256] = {'\0'};
- static uint8_t _temp4Gbuff[640];
- static uint8_t buff[256];
- uint8_t AT_GET_Data_2Param(char * buff1,uint8_t get_data[],char*head,char*tail)
- {
- uint16_t i;
- uint16_t len1,len2;
- char *t = NULL;
- char *h=strstr(buff1,head);
- if(strstr(buff1,head)&&strstr(buff1,tail)) {
- len1=strlen(h); /*剩余长度*/
- len2=strlen(head); /*头子串长度*/
- t=strstr(h+len2,tail);
- if(len1>len2){
- for(i=0;h+i+len2!=t;i++){
- get_data[i]=h[i+len2];
- }
- get_data[i]='\0';//加上结束符
- }
- else{
- printf("\r\n字串长度错误\r\n");
- return 0;
- }
- }
- else {
- if(!strstr(buff1,head))printf("\r\n未能检索到头字串\r\n");
- if(!strstr(buff1,tail))printf("\r\n未能检索到尾字串\r\n");
- printf("\r\n请检查你的数据原文:\r\n");
- printf("%s", buff1);
- return 0;
- }
- return 1;
- }
- void send_cmd_to_mqtt(char *str,uint8_t cmd)
- {
- if(g_uart1Info.bSdFinish == 1){
- //printf("发送:%d, %s",g_uart1Info.bSdFinish, str);
- g_uart1Info.cmd = cmd;
- memset(g_uart1Info.txfifo,0,USART1_TX_SIZE);
- strcpy((char*)g_uart1Info.txfifo,str);
- usart_tx_dma_send(USART1,g_uart1Info.txfifo,strlen((char*)g_uart1Info.txfifo));
- }
- else printf("上次发送未完成\r\n");
- }
- uint8_t send_data_to_mqtt(uint8_t type, uint8_t *data, uint8_t len)
- {
- uint16_t i,ret;
- uint16_t send_len = 0;
- memset(g_uart1Info.txfifo,0,USART1_TX_SIZE);
- memset(_temp4Gbuff,0,640);
- for(i=0;i<len;i++){
- send_len += snprintf((char*)_temp4Gbuff+send_len,sizeof(_temp4Gbuff),"%02x",data[i]);
- }
- sprintf((char*)g_uart1Info.txfifo,"AT+MPUB=\"%s\",0,0,\"%s\"\r\n",g_4gMsg.upTopic,_temp4Gbuff);
- usart_tx_dma_send(USART1,g_uart1Info.txfifo,strlen((char*)g_uart1Info.txfifo));
- ret = waiting_uart_return(300,"OK",NULL);
- if(ret == 1){
- g_4gMsg.noreturnNum = 0;
- }
- else {
- g_4gMsg.noreturnNum++;
- }
- if(g_4gMsg.noreturnNum >5){
- g_4gMsg.bconnect = 0;
- g_4gMsg.noreturnNum = 0;
- }
- return ret;
- }
- void close_mqtt(void)
- {
- //uint8_t val;
- send_cmd_to_mqtt("AT+MDISCONNECT\r\n",AT_MDISCONNECT);
- waiting_uart_return(500,"OK",NULL);
- //if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("AT+MIPCLOSE\r\n",AT_MIPCLOSE);
- waiting_uart_return(500,"OK",NULL);
- //if(ret==0) goto MQTT_ERROR;
- }
- void read_mqtt_power_up_msg(void)
- {
- while(U1CB.URxDataOUT != U1CB.URxDataIN){
- //memset(buff,0,256);
- memcpy(buff,U1CB.URxDataOUT->start,U1CB.URxDataOUT->end-U1CB.URxDataOUT->start+1);
- printf("%s",buff);
- U1CB.URxDataOUT++;
- if(U1CB.URxDataOUT == U1CB.URxDataEND){
- U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
- }
- }
- }
- unsigned char HexToChar(unsigned char bChar)
- {
- if((bChar>=0x30)&&(bChar<=0x39))
- {
- bChar -= 0x30;
- }
- else if((bChar>=0x41)&&(bChar<=0x46)) // Capital
- {
- bChar -= 0x37;
- }
- else if((bChar>=0x61)&&(bChar<=0x66)) //littlecase
- {
- bChar -= 0x57;
- }
- else
- {
- bChar = 0xff;
- }
- return bChar;
- }
- int net_rcvdata_ch(char *data, uint8_t *out_data, int len)
- {
- int i,slen=0;
- uint8_t temp1,temp2;
- for(i = 0; i < len; i+=2)
- {
- temp1 = HexToChar(data[i]);
- temp2 = HexToChar(data[i+1]);
- out_data[slen] = (temp1<<4) | temp2;
- slen++;
- }
- return slen;
- }
- void read_mqtt_work_msg(void)
- {
- uint8_t srclen;
- uint16_t len;
- char *str = NULL;
- if(U1CB.URxDataOUT == U1CB.URxDataIN) return; // fifo为空
- do{
- memset(buff,0,256);
- if((U1CB.URxDataOUT == U1CB.URxDataIN)) break;
- len = U1CB.URxDataOUT->end - U1CB.URxDataOUT->start +1;
- str = strstr((char*)U1CB.URxDataOUT->start,(char*)"byte");
- if(str != NULL){
- AT_GET_Data_2Param((char*)U1CB.URxDataOUT->start,buff,",","byte");
- srclen = atoi((char*)buff);
- memset(buff,0,256);
- srclen = net_rcvdata_ch(str+5,buff,srclen*2);
- data_dump("NET_RCB",buff,srclen);
- fifo_write(&g_4Grxfifo,buff,srclen); // 将数据写入到4G 接收fifo中
- memset(U1CB.URxDataOUT->start,0, len);
- }
- else if(strstr((char*)U1CB.URxDataOUT->start,"+CSQ")){
- printf("+++++CSQ\r\n");
- }
- else if(strstr((char*)U1CB.URxDataOUT->start,"+CESQ")){
- printf("+++++CESQ\r\n");
- }
- else if(strstr((char*)U1CB.URxDataOUT->start,"+CREG:") \
- || strstr((char*)U1CB.URxDataOUT->start,"+NO Service")){
- printf("+++++CREG\r\n");
- str = strstr((char*)U1CB.URxDataOUT->start,"+CREG:");
- g_4gMsg.cregStatus = atoi((char*)(str+6)); // 是否已经注册网络 1:已经注册,非1:没有注册成功
- g_4gMsg.bconnect = (g_4gMsg.cregStatus==1? 1: 0);
- printf("网络连接状态 cregStatus = :%d\r\n",g_4gMsg.cregStatus);
- }
- U1CB.URxDataOUT++;
- if(U1CB.URxDataOUT == U1CB.URxDataEND){
- U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
- }
- }while(1);
- }
- static uint8_t waiting_uart_return(uint32_t timeout,char*str,uint32_t *value)
- {
- uint8_t ret;//, buff[256];
- char *str1=NULL;
- int dBm,dbvl;
- uint8_t srclen;
- memset(g_uart1Info.waitMsg,0,16);
- strcpy((char*)g_uart1Info.waitMsg,str);
- start_delay_ms(timeout);
- memset(buff,0,256);
- do{
- if(U1CB.URxDataOUT != U1CB.URxDataIN){
- strncat((char*)buff,(char*)U1CB.URxDataOUT->start,U1CB.URxDataOUT->end - U1CB.URxDataOUT->start +1);
- U1CB.URxDataOUT++;
- if(U1CB.URxDataOUT == U1CB.URxDataEND){
- U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
- }
- if(strstr((char*)buff,(char*)g_uart1Info.waitMsg)){
- ret = 1;
- break;
- }
- }
- }while(!g_iDelayfinish);
- stop_delay_ms();
- if(ret == 1)
- {
- memset((char*)_tempbuff,0,32);
- switch(g_uart1Info.cmd){
- case AT_MQTTSTATUS:
- printf("收到:%s\r\n",buff);
- str1 = strstr((char*)buff,"+MQTTSTATU :");
- *value = atoi(str1+12);
- break;
- case AT_CPIN:
- printf("收到:%s\r\n",buff);
- AT_GET_Data_2Param((char*)buff,_tempbuff,"+CPIN: ","\r\nOK");
- printf("---CPIN:%s\r\n",_tempbuff);
- //if(strstr(_tempbuff,"READY")) ret = 1;
- //else ret = 2;
- break;
- case AT_CGATT: // 查询是否附着上数据网络
- printf("收到:%s\r\n",buff);
- AT_GET_Data_2Param((char*)buff,_tempbuff,"+CGATT: ","\r\nOK");
- printf("---CGATT:%s\r\n",_tempbuff);
- *value = atoi(_tempbuff);
- break;
- case AT_SAPRB_GPRS: //
- printf("收到:%s\r\n",buff);
- break;
- case AT_SAPRB_APN: //
- printf("收到:%s\r\n",buff);
- break;
- case AT_SAPRB_11: //
- printf("收到:%s\r\n",buff);
- break;
- case AT_SAPRB_21: //
- printf("收到:%s\r\n",buff);
- break;
- case AT_CREG:
- printf("收到:%s\r\n",buff);
- AT_GET_Data_2Param((char*)buff,_tempbuff,",","\r\nOK");
- g_4gMsg.cregStatus = atoi((char*)_tempbuff);
- printf("网络连接状态 cregStatus = :%d\r\n",g_4gMsg.cregStatus);
- break;
- case AT_ICCID:
- printf("收到:%s\r\n",buff);
- AT_GET_Data_2Param((char*)buff,_tempbuff,"+ICCID: ","\r\n");
- //printf("ICCID: %s\r\n",_tempbuff);
- memcpy(g_4gMsg.iccid,_tempbuff,20);
- //printf("ICCID: %s\r\n",g_4gMsg.iccid);
- break;
- case AT_CGSN:
- printf("收到:%s\r\n",buff);
- AT_GET_Data_2Param((char*)buff,_tempbuff,"AT+CGSN\r\n","\r\nOK");
- //printf("IMEI: %s\r\n",_tempbuff);
- memcpy(g_4gMsg.imei,_tempbuff+2,15);
- break;
- case AT_ATI:
- printf("收到:%s\r\n",buff);
- break;
- case AT_CSQ:
- AT_GET_Data_2Param((char*)buff,_tempbuff,"+CSQ: ",",");
- dbvl = (uint32_t)atoi((char*)_tempbuff);
- if(dbvl==99) {dBm = 0; printf("signal intensity:there is no signal\r\n");}
- else if(dbvl>=31&&dbvl<=99) {dBm = dbvl*2-113; printf("signal intensity:-51dBm or higher\r\n");}
- else if(dbvl>=2&&dbvl<31) {dBm = dbvl*2-113; printf("signal intensity:-109dBm ~ -53dBm\r\n");}
- else if(dbvl==1) {dBm = -111; printf("signal intensity:-111dBm\r\n");}
- else {dBm = dbvl*2-113; printf("signal intensity:-111dBm or less\r\n");}
- g_4gMsg.dBm = dBm;
- printf("~~~~~~~~~~4g-rssi-dbm: %d\r\n",g_4gMsg.dBm);
- case AT_MCONNECT:
- printf("MQTT CONNECT SUCCESS\r\n");
- g_4gMsg.bconnect = 1;
- g_devMsg.baskIdentity = 1;
- break;
- case AT_HTTPACTION:
- str = strstr((char*)buff, "," );
- if(str) {
- printf("%s\r\n", str);
- str += 1;
- str = strstr(str, "," );
- if(str) {
- printf("%s\r\n", str);
- str += 1;
- *value = atoi(str);//获取接收长度
- }
- }
- break;
- default:
- str = strstr((char*)buff,(char*)"byte");
- if(str != NULL){
- AT_GET_Data_2Param((char*)buff,_tempbuff,",","byte");
- srclen = atoi((char*)_tempbuff);
- memset(_tempbuff,0,256);
- srclen = net_rcvdata_ch(str+5,_tempbuff,srclen*2);
- data_dump("NET_RCB",_tempbuff,srclen);
- fifo_write(&g_4Grxfifo,_tempbuff,srclen); // 将数据写入到4G 接收fifo中
- //memset(U1CB.URxDataOUT->start,0,srclen);
- }
- break;
- }
- }
- else {
- printf("超时,4G模块没有返回\r\n");
- ret = 0;
- }
- return ret;
- }
- void AIR_HTTP_GET(const char *url, uint32_t *pLen)
- {
- char buff[128]={0};
- send_cmd_to_mqtt("AT+CIPCLOSE\r\n",AT_NULL); //关闭UDP或TCP
- waiting_uart_return(200,"CLOSE OK", NULL);
- send_cmd_to_mqtt("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",AT_NULL); //设置HTTP功能的承载类型
- waiting_uart_return(200,"OK", NULL);
- send_cmd_to_mqtt("AT+SAPBR=3,1,\"APN\",\"\"\r\n",AT_NULL);//设置pdp承载参数之APN
- waiting_uart_return(200,"OK", NULL);
- send_cmd_to_mqtt("AT+SAPBR=1,1\r\n",AT_NULL);//激活该承载的GPRS PDP上下文
- waiting_uart_return(200,"OK", NULL);
- send_cmd_to_mqtt("AT+SAPBR=2,1\r\n",AT_NULL);//查询下承载的状态
- waiting_uart_return(200,"OK", NULL);
- send_cmd_to_mqtt("AT+HTTPINIT\r\n",AT_NULL);//HTTP协议栈初始化
- waiting_uart_return(200,"OK", NULL);
- memset(buff,0,128);
- sprintf(buff,"AT+HTTPPARA=\"URL\",\"%s\"\r\n", url);
- send_cmd_to_mqtt(buff,AT_NULL);//建立http链接
- waiting_uart_return(300,"OK", NULL);
- send_cmd_to_mqtt("AT+HTTPACTION=0\r\n",AT_HTTPACTION); // 得到文件的大小
- waiting_uart_return(6000,"+HTTPACTION:", pLen);
- return;
- }
- uint8_t rxfifo[1024];
- uint8_t * AIR_HTTP_READ(uint32_t start_addr, uint32_t data_len)
- {
- uint8_t *p_buf = NULL;
- char *str=NULL;
- uint32_t read_len;
- uint8_t temp[32];
- uint16_t rxlen = 0,len=0;
- memset(temp,0,32);
- sprintf((char*)temp,"AT+HTTPREAD=%d,%d\r\n", start_addr, data_len);
- send_cmd_to_mqtt((char*)temp,AT_NULL);//AT+HTTPREAD=<start_address>,<byte_size>
- strcpy((char*)g_uart1Info.waitMsg,"+HTTPREAD: ");
- memset(rxfifo,0,1024);
- rxlen = 0;
- start_delay_ms(300);
- // while(!g_iDelayfinish);
- // stop_delay_ms();
- do{
- if(U1CB.URxDataOUT != U1CB.URxDataIN){
- len = U1CB.URxDataOUT->end - U1CB.URxDataOUT->start + 1;
- memcpy(rxfifo+rxlen,U1CB.URxDataOUT->start,len);
- rxlen = rxlen + len;
- U1CB.URxDataOUT++;
- if(U1CB.URxDataOUT == U1CB.URxDataEND){
- U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
- }
- str = strstr((char*)rxfifo,"+HTTPREAD: ");
- if(str && ((rxlen-(str-(char*)rxfifo))>=17)){
- memset(temp,0,32);
- if(AT_GET_Data_2Param((char*)rxfifo,(uint8_t*)temp, "+HTTPREAD: ", "\r\n")){
- read_len = atoi((char*)temp);
- }
- if(((char*)rxfifo+rxlen-str)>= (read_len+10))
- break;
- }
- }
- }while(!g_iDelayfinish);
- stop_delay_ms();
- //if(1 == ret){
- memset(temp,0,32);
- if(AT_GET_Data_2Param((char*)rxfifo,(uint8_t*)temp, "+HTTPREAD: ", "\r\n")) { /*头尾提取方法*/
- read_len = atoi((char*)temp);
- if(data_len == read_len) {
- p_buf = (uint8_t *)strstr((char*)rxfifo, "+HTTPREAD: ");
- p_buf = (uint8_t *)strstr((char *)p_buf, "\r\n");
- p_buf += 2;/* data position. */
- }
- // if(data_len <512){
- // printf("data_len = %d, read_len= %d\r\n",data_len,read_len);
- // data_dump("Update Data", p_buf,read_len);
- // }
- }
- // }
- return p_buf;
- }
- /*----------------------------------------------------------------
- * 激活pdp
- * ---------------------------------------------------------------*/
- uint8_t activation_pdp(void)
- {
- uint8_t ret;
- uint8_t count = 0,repeat = 0;
- uint32_t val;
- REPEAT_PDP:
- send_cmd_to_mqtt("AT+CPIN?\r\n",AT_CPIN); // 查询SIM卡是否正常
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0){
- count++;
- printf("cpin repeat %d\r\n",count);
- if(count <4) goto REPEAT_PDP;
- else goto END_PDP;
- }
- count = 0;
- AT_CGATT:
- send_cmd_to_mqtt("AT+CGATT?\r\n",AT_CGATT); // 查询是否附着上数据网络
- ret = waiting_uart_return(500,"OK",&val);
- if((ret==0) || (val==0)){
- count++;
- if(count <4) goto AT_CGATT;
- else goto END_PDP;
- }
- count = 0;
- send_cmd_to_mqtt("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",AT_SAPRB_GPRS); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) {
- send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- delay_ms(2000);
- if(ret == 0){
- if(repeat++ < 3)goto REPEAT_PDP;
- else goto END_PDP;
- }
- else repeat = 0;
- }
- send_cmd_to_mqtt("AT+SAPBR=3,1,\"APN\",\"\"\r\n",AT_SAPRB_APN); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) {
- send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- delay_ms(2000);
- if(ret == 0){
- if(repeat++ < 3)goto REPEAT_PDP;
- else goto END_PDP;
- }
- else repeat = 0;
- }
- send_cmd_to_mqtt("AT+SAPBR=1,1\r\n",AT_SAPRB_11); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) {
- send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- delay_ms(2000);
- if(ret == 0){
- if(repeat++ < 3)goto REPEAT_PDP;
- else goto END_PDP;
- }
- else repeat = 0;
- }
- send_cmd_to_mqtt("AT+SAPBR=2,1\r\n",AT_SAPRB_21); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) {
- send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
- ret = waiting_uart_return(500,"OK",NULL);
- delay_ms(2000);
- if(ret == 0){
- if(repeat++ < 3)goto REPEAT_PDP;
- else goto END_PDP;
- }
- else repeat = 0;
- }
- return 1;
- END_PDP:
- return 0;
- }
- uint8_t init_mqtt_power_up(void)
- {
- uint8_t ret,count = 0;
- uint32_t val;
- char topic[64],sub_topic[64];
- if(B4G_NOHAVE == g_devMsg.bHave4G) return 0;
- if(g_4gMsg.delay == 0) g_4gMsg.delay = 1;
- timeout_setValue(&g_4gMsg.timer,g_4gMsg.delay*TIMER_4G);
- printf("timer \r\n");
- start_delay_ms(6000);
- while(!g_iDelayfinish);
- stop_delay_ms();
- read_mqtt_power_up_msg();
- start_delay_ms(6000);
- while(!g_iDelayfinish);
- stop_delay_ms();
- start_delay_ms(2000);
- while(!g_iDelayfinish);
- stop_delay_ms();
- printf("timer1111 \r\n");
- read_mqtt_power_up_msg();
- memset(g_4gMsg.upTopic,0,64);
- sprintf(g_4gMsg.upTopic,"cpyypt/up/%04x/%010u",g_devMsg.devType, g_devMsg.devSn);
- eeprom_read_mqtt_msg();
- if(1 == g_mqttMsg.flag){ // 产测时配置了mqtt
- if(1 == g_mqttCHmsg.bChangeMqtt){ //切换mqtt服务器地址
- memset(topic,0,64);
- sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,g_mqttCHmsg.mqttMsg.admin,g_mqttCHmsg.mqttMsg.password);
- memset(sub_topic,0,64);
- sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n",g_mqttCHmsg.mqttMsg.ip,g_mqttCHmsg.mqttMsg.port);
- }
- else { // 不切换mqtt服务器地址
- memset(topic,0,64);
- sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,g_mqttMsg.admin,g_mqttMsg.password);
- memset(sub_topic,0,64);
- sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n",g_mqttMsg.ip,g_mqttMsg.port);
- }
- }
- else {// 未配置mqtt服务器地址
- sprintf(g_mqttMsg.admin,"%s","admin");
- sprintf(g_mqttMsg.port,"%s","9000");
- sprintf(g_mqttMsg.ip,"%s","test-mqtt.cpyypt.cn");
- sprintf(g_mqttMsg.password,"%s","houjianwei");
- eeprom_write_mqtt_msg((uint8_t*)&g_mqttMsg,sizeof(MqttMsg));
- memset(topic,0,64);
- sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,"admin","houjianwei");
- memset(sub_topic,0,64);
- sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n","test-mqtt.cpyypt.cn","9000");
- }
- send_cmd_to_mqtt("AT+MQTTSTATU\r\n",AT_MQTTSTATUS);
- ret = waiting_uart_return(500,"OK",&val);
- if(ret==0) goto MQTT_ERROR;
- if(val != 0){
- send_cmd_to_mqtt("AT+MIPCLOSE\r\n",AT_MIPCLOSE);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- }
- send_cmd_to_mqtt("AT\r\n",AT_AT);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("AT\r\n",AT_AT);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- ret = activation_pdp();
- if(ret == 0) goto MQTT_ERROR;
- send_cmd_to_mqtt("AT+CREG=1\r\n",AT_CREGSET);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("AT+CREG?\r\n",AT_CREG);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("ATI\r\n",AT_ATI); // 回显示模式关闭
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("AT+ICCID\r\n",AT_ICCID);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("AT+CGSN\r\n",AT_CGSN);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("AT+CSQ\r\n",AT_CSQ);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- REPEAT_MCONFIG:
- send_cmd_to_mqtt(topic,AT_MCONFIG);//"AT+MCONFIG=123,admin,houjianwei\r\n"
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0){
- count++;
- if(count <4) goto REPEAT_MCONFIG;
- else goto MQTT_ERROR;
- }
- count = 0;
- REPEAT_MIPSTART:
- send_cmd_to_mqtt(sub_topic,AT_MIPSTART);//"AT+MIPSTART=\"test-mqtt.cpyypt.cn\",\"9000\"\r\n"
- ret = waiting_uart_return(500,"CONNECT OK",NULL);
- if(ret==0){
- count++;
- if(count <4) goto REPEAT_MIPSTART;
- else goto MQTT_ERROR;
- }
- count = 0;
- REPEAT_MCONNECT:
- send_cmd_to_mqtt("AT+MCONNECT=1,60\r\n",AT_MCONNECT);
- ret = waiting_uart_return(500,"CONNACK OK",NULL);
- if(ret==0){
- count++;
- if(count <4) goto REPEAT_MCONNECT;
- else goto MQTT_ERROR;
- }
- count = 0;
- send_cmd_to_mqtt("AT+MQTTMODE=1\r\n",AT_MQTTMODE);
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- send_cmd_to_mqtt("ATE0\r\n",AT_ATE); // 回显示模式关闭
- ret = waiting_uart_return(500,"OK",NULL);
- if(ret==0) goto MQTT_ERROR;
- REPEAT_MSUB_01:
- memset(topic,0,sizeof(topic));
- sprintf((char*)topic,"%s%04x/%s",(char*)MQTT_DNLINK_TOPIC_CASE,g_devMsg.devType, (char*)"broadcast");
- memset(sub_topic,0,sizeof(sub_topic));
- sprintf((char*)sub_topic,"AT+MSUB=\"%s\", 0\r\n",(char*)topic);
- send_cmd_to_mqtt((char*)sub_topic,AT_SUB); // 订阅主题
- ret = waiting_uart_return(500,"SUBACK",NULL);
- if(ret==0){
- count++;
- if(count <4) goto REPEAT_MSUB_01;
- else goto MQTT_ERROR;
- }
- else printf("MQTT SUB01 SUCCESS\r\n");
- count = 0;
- REPEAT_MSUB_02:
- memset(topic,0,sizeof(topic));
- sprintf((char*)topic,"%s%04x/%010u",(char*)MQTT_DNLINK_TOPIC,g_devMsg.devType, g_devMsg.devSn);
- memset(sub_topic,0,sizeof(sub_topic));
- sprintf((char*)sub_topic,"AT+MSUB=\"%s\", 0\r\n",(char*)topic);
- send_cmd_to_mqtt((char*)sub_topic,AT_SUB); // 订阅主题
- ret = waiting_uart_return(500,"SUBACK",NULL);
- if(ret==0){
- count++;
- if(count <4) goto REPEAT_MSUB_02;
- else goto MQTT_ERROR;
- }
- else printf("MQTT SUB02 SUCCESS\r\n");
- count = 0;
- strcpy((char*)g_uart1Info.waitMsg,"+MSUB");
- timeout_stop(&g_4gMsg.timer);
- g_4gMsg.delay = 1;
- if(1 == g_mqttCHmsg.bChangeMqtt){
- eeprom_write_mqtt_msg((uint8_t*)&g_mqttCHmsg.mqttMsg,sizeof(MqttMsg));
- g_mqttCHmsg.bChangeMqtt = 0;
- }
- //dma_config_mode_work();
- return ret;
- MQTT_ERROR:
- g_4gMsg.bconnect = 0;
- g_devMsg.baskIdentity = 0x00;
- if(g_4gMsg.delay == 61){ // 一个小时没有连接上网络,则重新启动
- NVIC_SystemReset();
- }
- timeout_start(&g_4gMsg.timer);
- if(1 == g_4gMsg.delay) g_4gMsg.delay = 3;
- else if(3 == g_4gMsg.delay) g_4gMsg.delay = 5;
- else if(5 == g_4gMsg.delay) g_4gMsg.delay = 10;
- else if(10 == g_4gMsg.delay) g_4gMsg.delay = 60;
- else g_4gMsg.delay = 61;
- printf("--------------mqtt error,delay = %d\r\n",g_4gMsg.delay);
- if(g_4gMsg.delay == 10){
- if(1 == g_mqttCHmsg.bChangeMqtt){ // 切换到原来的服务器上
- g_mqttCHmsg.bChangeMqtt = 0;
- g_4gMsg.delay = 1;
- timeout_stop(&g_4gMsg.timer);
- timeout_setValue(&g_4gMsg.timer,g_4gMsg.delay*TIMER_4G);
- printf("切换服务器失败,切换到原来的服务器\r\n");
- }
- }
- return ret;
- }
- /*----------------------------------------------------------------------------------
- * 将需要发送的数据放到4G的发送fifo中
- * 1: 操作成功 0:操作失败
- * ---------------------------------------------------------------------------------*/
- uint8_t add_data_to_4G_txfifo(uint8_t *txdata,uint8_t len,uint8_t msgType1,uint16_t msgType2)
- {
- //uint8_t buff[256]= {0};
- static uint32_t seq_num = 0;
- uint16_t crc;
- netMsgFormat *p_msg = (netMsgFormat*)buff;
- if(len > 256-12) return 0;
- memset(buff,0,256);
- p_msg->start = 0xfefe;
- p_msg->proVer = 0x02;
- p_msg->msgId = (seq_num++)%0xFFFFFFFF;
- p_msg->msgType1 = msgType1;
- p_msg->msgType2 = msgType2;
- p_msg->palen = len + 2;
- memcpy(p_msg->info, txdata, len);
- crc = _crc16_get((uint8_t *)p_msg,len+12);
- p_msg->info[len] = crc&0xff;
- p_msg->info[len+1] = (crc>>8)&0xff;
- return (fifo_write(&g_4Gtxfifo,buff,len+NET_HEAD_LEN+2));
- }
|