//成功发送返回0,错误返回1 unsigned char SendMessage_TextMode (const unsigned char *Context, const unsigned char *PhoneNumber) { unsigned char retval; unsigned char tempbuff[30]; retval = SendAtCommand_UntillSuccess ("AT+CMGF=1\r"); if (retval == SendAtCommand_ERROR) return 1; strcpy ( (char *) tempbuff, "AT+CMGS=\""); //AT+CMGS="15112475662"\r strcat ( (char *) tempbuff, (const char *) PhoneNumber); strcat ( (char *) tempbuff, "\"\r"); retval = send_at_cmd_and_receive (tempbuff, sizeof (tempbuff) - 1, 2000, ">"); printf ("SendAtCmdre=%s\r\n", tempbuff); if (retval != TCP_OK) return 1; send_at_cmd (Context); send_at_cmd ("\x1a"); retval = ReadDatasFromSIM300_OKstr (tempbuff, sizeof (tempbuff) - 1, 10, "OK"); printf ("SendAtCmdre=%s\r\n", tempbuff); return retval; }
static char PhoneHandleCall(char *msg) { u8 phonebuff[20]; u8 atcmd[50]; EFILE efile; struct phoneleixing *ph; ph=(struct phoneleixing *)msg; clear_lcd(); phonebuff[0]=EepromFile_Open(file_phonebook,&efile); memset(phonebuff,0,sizeof(phonebuff)); if(ph->leixin==0)EepromFile_Seek(&efile,10+ph->numPhone*98+12,EepromFile_SEEK_SET); else EepromFile_Seek(&efile,10+ph->numPhone*98+12+18,EepromFile_SEEK_SET); EepromFile_read(phonebuff,18,&efile); DrawTitle_to_row_Language2(2,"正在拨号...","Dialing..."); strcpy((char *)atcmd,"ATD"); strcat((char *)atcmd,(const char *)phonebuff); strcat((char *)atcmd,";\r"); send_at_cmd(atcmd); //text_out_to_row_x_Language2(1,25,phonebuff,phonebuff); phonebuff[0]=Waitkey_TillKeyPress(); send_at_cmd("ATH\r"); return phonebuff[0]; }
/** * send AT*COMWDG command * 发送唤醒连接线程函数 * * @解释:根据开发文档说明,前后两个指令间时间间隔低于2s,因此需要发送AT*COMWDG来维持基站与无人机的连接 * @author: blyde * @update: 2015.7.11 **/ int Ardrone::send_wakeup_cmd() { char cmd[100]; int delay = 0; int ret = 0; if( !isInit_) return C_ERROR; std::cout<<"__wakeupThread start "<<std::endl; while ( true) { // keep Ardrone wake up Sleep(40); send_at_cmd(last_at_cmd_); delay++; if (delay >= 4) { delay = 0; sprintf_s( cmd, "AT*COMWDG=%d\r", nextSeq()); ret = send_at_cmd( cmd); if ( ret == C_ERROR) { std::cout<<"__send_at_cmd error"<<std::endl; return C_ERROR; } } } }
static char PhoneHandleSendcolormassage(char *msg) { #if 1 return(abeyant(NULL)); #else char tempbuff[1024]; char PhoneNumber[30],time[30],context[512]; char atcmd[20]={"AT+CMGR="}; static char k=1; char j; #ifdef DEBUG_PRINTF ReceiveMessageDecode("+CMGR: 1,,154\r0891683108705505F04405A10180F60008016002907294238A0500030002015C0A656C76845BA26237FF1A60A85F53524D5E1062374F59989D003100330034002E003700355143FF0C51764E2D57FA672C5E1062374F59989D003100320039002E003400385143FF0C8D6090015E1062374F59989D0035002E003200375143FF0C4E0B6B2167087ED365E54E3A0031003665E5FF0C67096548671F81F3003200300031\rOK",PhoneNumber,time,context,"+CMGL:"); #endif my_itoa(&atcmd[8],k);k++; strcat(atcmd,"\r"); memset(tempbuff,0,sizeof(tempbuff)); memset(PhoneNumber,0,PhoneNumberSize); memset(time,0,sizeof(time)); memset(context,0,sizeof(context)); #ifdef DEBUG_PRINTF printf("atcmd=%s\n",atcmd); #endif send_at_cmd(atcmd); if(SendATReadDatasFromSIM300(fd_ttyS1,tempbuff,3,0)==OK){ ReceiveMessageDecode(tempbuff,PhoneNumber,time,context,"+CMGR:"); } #endif }
/** * receive navigation data * 接收导航数据线程函数 * * @解释:根据开发手册P41,需要完成类似于三次握手协议,先发一个激活数据报, * 然后配置无人机,才能让无人机向基站发送数据报 * 可以使用WireShark2 检测数据报是否发到本机上 * @author: blyde * @update: 2015.7.11 **/ int Ardrone::receiveNavData() { if( !isInit_) return C_ERROR; SOCKET socketNav = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sockaddr_in navSin; navSin.sin_family = AF_INET; navSin.sin_port = htons(NAVDATA_PORT); navSin.sin_addr.s_addr = inet_addr(ARDRONE_IP); int lenNavSin = sizeof(navSin); // 激活指令发往NAVDATA_PORT 端口 const char trigger[4] = { 0x01, 0x00, 0x00, 0x00 }; int ret = sendto(socketNav, trigger, strlen(trigger), 0, (sockaddr *)&navSin, lenNavSin); if (ret == SOCKET_ERROR) { std::cout<<"__send trigger flag error"<<std::endl; return C_ERROR; } printf_s("Sent trigger flag to UDP port : %d \n", NAVDATA_PORT); // 配置指令发往AT_PORT 端口 char initCmd[100]; sprintf_s(initCmd, "AT*CONFIG=%d,\"general:navdata_demo\",\"TRUE\"\r", nextSeq()); ret = send_at_cmd(initCmd); if ( ret == C_ERROR) { std::cout<<"__send initCmd error"<<std::endl; return C_ERROR; } // 接收数据包 MemoryLibrary::Buffer navDataBuffer; // 二进制数据缓冲区 char recv[1024] = { 0 }; // 数据包接收数组 int lenRecv = 0; int delay = 0; std::cout<<"__receiveNavData start "<<std::endl; while ( true) { // 获取导航数据包 lenRecv = recvfrom(socketNav, recv, 1024, 0, (struct sockaddr*)&navSin, &lenNavSin); delay++; if (delay >= 5) { delay = 0; printf("received %d bytes\n", lenRecv); // 分析数据包,得到导航数据 navDataBuffer.Set(recv, lenRecv); ret = parseNavData(navDataBuffer); if ( ret == C_ERROR) { std::cout<<"__parseNavData() error"<<std::endl; return C_ERROR; } } } }
unsigned char send_at_cmd_and_return_NotResposeKey(const unsigned char * cmd,int ms,const unsigned char *okstr,const unsigned char *errstr) { unsigned char tempbuff[1024]; int i,ret,size,pos; unsigned char retval; retval=TCP_SendAtTimeout; printf("SEND_AT:%s\n",cmd); //设置加CIP 头,执行了这个指令sim900B 把接收的数据以打包的方式从串口输出。+IPD,1460:数据 SetAutoExitTime(0); ms/=20; send_at_cmd(cmd); for(pos=i=0,size=sizeof(tempbuff);i<ms;i++) { ret= ReadDatasFromtty(fd_ttyS1,tempbuff+pos,size,0,20000); if(ret) { pos+=ret; size-=ret; } else { if(strstr((char const*)tempbuff,(char const*)okstr)){retval=TCP_OK;break;} if(strstr((char const*)tempbuff,(char const*)errstr)){retval=TCP_ERROR;break;} } } printf("SEND_AT_Re:%s\n",tempbuff); return retval; }
/** * send AT*REF command * 发送AT*REF控制指令 * * @param: cmdFormat % 指令格式 * @author: blyde * @update: 2015.7.11 **/ int Ardrone::send_cmd( const char* cmdFormat) { char cmd[100]; sprintf_s( cmd, cmdFormat, nextSeq()); int ret = send_at_cmd( cmd); return ret; }
unsigned char send_at_cmd_and_return(const unsigned char * cmd,int ms,const unsigned char *okstr,const unsigned char *errstr) { unsigned char tempbuff[1024]; int i,ret,size,pos; unsigned char retval; retval=TCP_SendAtTimeout; kmy_USART2ReceiveReset(); SetAutoExitTime(0); ms/=20; send_at_cmd(cmd); for(pos=i=0,size=sizeof(tempbuff);i<ms;i++) { ret= ReadDatasFromtty(fd_ttyS1,tempbuff+pos,size,0,20000); if(ret) { pos+=ret; size-=ret; } else { if(strstr((char const*)tempbuff,(char const*)okstr)){retval=TCP_OK;break;} if(errstr!=NULL){if(strstr((char const*)tempbuff,(char const*)errstr)){retval=TCP_ERROR;break;}} } } printf("SEND_AT_Re:%s\n",tempbuff); return retval; }
unsigned char SendAtCommand_UntillSuccess(unsigned char *cmd) { char tempbuff[100]; int i,ret,size,pos,ms=2000; char cnt=0; AgainExecute: send_at_cmd(cmd); ms/=10; for(pos=i=0,size=sizeof(tempbuff);i<ms;i++) { ret= ReadDatasFromtty(fd_ttyS1,(u8*)(tempbuff+pos),size,0,10000); if(ret) { pos+=ret; size-=ret; } else { if(strstr(tempbuff,"OK"))return SendAtCommand_OK; if(strstr(tempbuff,"ERROR"))return SendAtCommand_ERROR; } } if(cnt++<5)goto AgainExecute; return SendAtCommand_ERROR; }
/** * send AT*PCMD command * 发送飞行控制指令,指令规则请翻阅开发手册 * * @param: enable % 能否控制 * @param: roll % 我忘了,帮我补上吧,嘻嘻 * @param: pitch % * @param: gaz % * @param: yaw % * * @author: blyde * @update: 2015.7.11 **/ int Ardrone::send_pcmd(int enable, float roll, float pitch, float gaz, float yaw) { char cmd[100]; sprintf_s(cmd, "AT*PCMD=%d,%d,%d,%d,%d,%d\r", nextSeq(), enable, float2Int(roll), float2Int(pitch), float2Int(gaz), float2Int(yaw)); int ret = send_at_cmd( cmd); return ret; }
/************************************光标在手机处菜单**********************************************/ static char PhoneHandleCall(char *msg) { u8 phonebuff[20]; u8 atcmd[50]; EFILE efile; struct phoneleixing *ph; ph=(struct phoneleixing *)msg; clear_lcd(); /*fp=fopen("PhoneBook","rb"); if(fp!=NULL){ //如果有记录,则先把记录读到phonebuff 。 #ifdef DEBUG_PRINTF printf("open PhoneBook success!!\n"); #endif }else{ #ifdef DEBUG_PRINTF printf("open PhoneBook failure!!\n"); #endif return KEY_ReturnPrevious; }*/ phonebuff[0]=EepromFile_Open(file_phonebook,&efile); memset(phonebuff,0,sizeof(phonebuff)); /*if(ph->leixin==0)fseek(fp,10+ph->numPhone*98+12,SEEK_SET); else fseek(fp,10+ph->numPhone*98+12+18,SEEK_SET); fread(phonebuff,18,1,fp);*/ if(ph->leixin==0)EepromFile_Seek(&efile,10+ph->numPhone*98+12,EepromFile_SEEK_SET); else EepromFile_Seek(&efile,10+ph->numPhone*98+12+18,EepromFile_SEEK_SET); EepromFile_read(phonebuff,18,&efile); DrawTitle_to_row_Language2(2,"正在拨号...","Dialing..."); strcpy((char *)atcmd,"ATD"); strcat((char *)atcmd,(const char *)phonebuff); strcat((char *)atcmd,";\r"); send_at_cmd(atcmd); //text_out_to_row_x_Language2(1,25,phonebuff,phonebuff); phonebuff[0]=Waitkey_TillKeyPress(); send_at_cmd("ATH\r"); return phonebuff[0]; }
/** * initialize Ardrone(not use) * 设置最大飞行高度,设置超声波频率等无人机参数预设 * * @author: blyde * @update: 2015.7.11 */ int Ardrone::initArdrone() { char cmd[1024]; // 设置最大高度 sprintf_s( cmd, "AT*CONFIG=%d,\"control:altitude_max\",\"2000\"\r", nextSeq()); assert( send_at_cmd(cmd)); Sleep( INTERVAL); // 设置超声波频率 sprintf_s( cmd, "AT*CONFIG=%d,\"pic:ultrasound_freq\",\"8\"\r", nextSeq()); assert( send_at_cmd( cmd)); Sleep( INTERVAL); //flat trim sprintf_s( cmd, "AT*FTRIM=%d\r", nextSeq()); assert( send_at_cmd(cmd)); Sleep( INTERVAL); return C_OK; }
unsigned char send_at_cmd_and_receive(unsigned char * CmdBuff,int CmdBuffSize,int Ms,const unsigned char *OkStr) { int i,ret,size,pos; unsigned char retval=TCP_SendAtTimeout; kmy_USART2ReceiveReset(); SetAutoExitTime(0); Ms/=20; send_at_cmd(CmdBuff); *CmdBuff=0; for(pos=i=0,size=CmdBuffSize;i<Ms;i++) { ret= ReadDatasFromtty(fd_ttyS1,CmdBuff+pos,size,0,20000); if(ret) { pos+=ret; size-=ret; } else { if(strstr((char const*)CmdBuff,(char const*)OkStr))break; retval=GetKeyValue(); if(retval!=KEY_NONE) { if(retval==KEY_ReturnInitInterface||retval==KEY_ReturnPrevious){retval=TCP_UserSelfReturn;break;} } } } if(i<Ms)retval=TCP_OK; printf("SendAtCmd receive-->%d %s\r\n",pos,CmdBuff); return retval; }
char GetIMEI(unsigned char *buff) { char rcv_buf[50]; char *p; int i; char retval; send_at_cmd("AT+GSN\r"); retval=ReadDatasFromSIM300_OKstr((u8*)rcv_buf,sizeof(rcv_buf),2,"OK"); printf("rcv_buf=%s\n",rcv_buf); p=rcv_buf;i=0; while((*p<'0'||*p>'9')&&i<sizeof(rcv_buf)){p++;i++;} for(i=0;i<24;i++){rcv_buf[i]=*p;p++;if(*p<'0'||*p>'9')break;} i++; rcv_buf[i]=0; strcpy((char *)buff,rcv_buf); return retval; }
static unsigned char send_at_cmd_and_return_3errs(const unsigned char * cmd,int ms,const unsigned char *okstr,const unsigned char *errstr,const unsigned char *errstr2,const unsigned char *errstr3) { unsigned char tempbuff[200]; int i,ret,size,pos; unsigned char retval; unsigned char keyval; kmy_USART2ReceiveReset(); retval=TCP_SendAtTimeout; SetAutoExitTime(0); ms/=20; send_at_cmd(cmd); for(pos=i=0,size=sizeof(tempbuff);i<ms;i++) { ret= ReadDatasFromtty(fd_ttyS1,tempbuff+pos,size,0,20000); if(ret) { pos+=ret; size-=ret; } else { if(strstr((char const*)tempbuff,(char const*)okstr)){retval=TCP_OK;break;} if(strstr((char const*)tempbuff,(char const*)errstr)){retval=TCP_ERROR;break;} if(strstr((char const*)tempbuff,(char const*)errstr2)){retval=TCP_ERROR2;break;} if(strstr((char const*)tempbuff,(char const*)errstr3)){retval=TCP_ERROR3;break;} keyval=GetKeyValue(); if(keyval==KEY_ReturnInitInterface||keyval==KEY_ReturnPrevious){retval=TCP_UserSelfReturn;break;} } } printf("SEND_AT_Re:%s\n",tempbuff); return retval; }
//发送短信 char SendMessage (char *Msg, const char *Phone) { char sendbuff[1024]; char tempbuff[1024]; char temp[200]; char *pt, *ps; char len; char PDUsendMode; PDUsendMode = CheckBuffWhetherAllisAsccii (Msg); memset (sendbuff, 0, sizeof (sendbuff) ); ps = sendbuff; memset (tempbuff, 0, sizeof (tempbuff) ); //设置PDU mode send_at_cmd ("AT+CMGF=0\r"); if (ReadDatasFromSIM300_OKstr ( (unsigned char *) tempbuff, sizeof (tempbuff), 3, "OK\r") != 0) { goto tuichu; } memset (tempbuff, 0, sizeof (tempbuff) ); //取短信中心号码 send_at_cmd ("AT+CSCA?\r"); if (ReadDatasFromSIM300_OKstr ( (unsigned char *) tempbuff, sizeof (tempbuff), 3, "OK\r") != 0) { goto tuichu; } pt = strstr (tempbuff, "+CSCA: \"+"); if (pt != NULL) pt += sizeof ("+CSCA: \"+") - 1; else goto tuichu; HaomaToMassageCode (temp, pt); OneHexToTwoAsccii (&ps, strlen (temp) / 2 + 1); //A:短信息中心地址长度,2位十六进制数(1字节)。 OneHexToTwoAsccii (&ps, 0x91); //B:短信息中心号码类型,2位十六进制数。 My_strcpy_PointInc (&ps, temp); //C:短信息中心号码,B+C的长度将由A中的数据决定。 len = strlen (sendbuff); OneHexToTwoAsccii (&ps, 0x11); //D:文件头字节,2位十六进制数。 OneHexToTwoAsccii (&ps, 0x00); //E:信息类型,2位十六进制数。 OneHexToTwoAsccii (&ps, strlen (Phone) + 2); //F:被叫号码长度,2位十六进制数。 OneHexToTwoAsccii (&ps, 0x91); //G:被叫号码类型,2位十六进制数,取值同B。 #ifdef MyChinaSelfTest OneHexToTwoAsccii (&ps, 0x68); #else OneHexToTwoAsccii (&ps, 0x34); //+4369910797801奥地利国际区号 #endif HaomaToMassageCode (temp, Phone); My_strcpy_PointInc (&ps, temp); //H:被叫号码,长度由F中的数据决定。 OneHexToTwoAsccii (&ps, 0x00); //I:协议标识,2位十六进制数。 if (PDUsendMode == PDUsendMode7bit) //J:数据编码方案,2位十六进制数。08 用户信息编码方式(TP-DCS) UCS2编码 { OneHexToTwoAsccii (&ps, 0x00); } else if (PDUsendMode == PDUsendMode8bit) { OneHexToTwoAsccii (&ps, 0x04); } else if (PDUsendMode == PDUsendModeUCS2) { OneHexToTwoAsccii (&ps, 0x08); } OneHexToTwoAsccii (&ps, 0x00); //K:有效期,2位十六进制数。 if (PDUsendMode == PDUsendMode7bit) { strcpy (tempbuff, Msg); OneHexToTwoAsccii (&ps, strlen (tempbuff) ); //L:用户数据长度,2位十六进制数。 PDU7bitEncode (tempbuff); //M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的Unicode字符。 My_strcpy_PointInc (&ps, tempbuff); } else if (PDUsendMode == PDUsendMode8bit) { } else if (PDUsendMode == PDUsendModeUCS2) { AsciiGB2312ToUCS2 (tempbuff, Msg); OneHexToTwoAsccii (&ps, strlen (tempbuff) / 2); //L:用户数据长度,2位十六进制数。 My_strcpy_PointInc (&ps, tempbuff); //M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的Unicode字符。 } My_strcpy_PointInc (&ps, "\x1a"); //加上0x1A ps = temp; len = (strlen (sendbuff) - len - 1) / 2; My_strcpy_PointInc (&ps, "AT+CMGS="); //以PDU 模式开始发送短信 sprintf (ps, "%d", len); strcat (temp, "\r"); send_at_cmd ( (const unsigned char*) temp); memset (tempbuff, 0, sizeof (tempbuff) ); ReadDatasFromSIM300_OKstr ( (unsigned char *) tempbuff, sizeof (tempbuff) - 1024, 2, ">"); if (strstr (tempbuff, ">") ) { send_at_cmd ( (const unsigned char *) sendbuff); if (ReadDatasFromSIM300_OKstr ( (unsigned char *) tempbuff, sizeof (tempbuff) - 1024, 8, "OK\r") != 0) { goto tuichu; } } else goto tuichu; return Sim900B_ProccessOK; tuichu: return Sim900B_ProccessERROR; }