| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 |
- /********************************************************************************
- * File Name: NetTask.c
- * Function Describe:The NetTask for the system
- * Relate Module:
- * Explain: Hardware version is HS110C
- * Writer: ShiLiangWen
- * Date: 2015.4.12
- *******************************************************************************/
- #include "includes.h"
- typedef enum {INVALID=0,OPEN=1,CLOSE=2} STATUE;
- SUT_NET_PARA sutNetPara;
- OS_EVENT *ModemQ;
- void *ModemMsg[MODEM_Q_NUM];
- char ModemMsgBuf[MODEM_Q_NUM][MODEM_MSG_BUF_LEN];
- int ModemMsgBufIndex=0;
- OS_EVENT *GpsQ;
- void *GpsMsg[GPS_Q_NUM];
- unsigned char GpsMsgBuf[GPS_Q_NUM][GPS_MSG_BUF_LEN];
- int GpsMsgBufIndex=0;
- #define MODEM_SEND_BUF_LEN 100
- char ModemSendBuf[MODEM_SEND_BUF_LEN];
- //======================================
- #define APP_TASK_NET_STK_SIZE 500
- static OS_STK AppNetTaskStk[APP_TASK_NET_STK_SIZE];
- int g_iCSQ=-1;
- unsigned char g_ucNetTaskDisable=0;
- int g_iModemVer=0;
- static STATUE GpsServerStatus=CLOSE;
- unsigned char g_ucSecFlag=0; //秒标志 为1标示1秒到,需要对其清零,以便下个1秒准确到达
- /*******************************************************************************
- 校验
- *******************************************************************************/
- unsigned char GetCheck(unsigned char *data, unsigned short datalen)
- {
- unsigned char ck=0;
- int i;
- for(i=0;i<datalen;i++){
- ck^=data[i];
- }
- return ck;
- }
- int GetModemVer(void)
- {
- int timerout=300;
- int i,ver=0;
- char *msg;
- INT8U err;
- int ct=100;
- while(timerout){
- timerout--;
- if(++ct>100){
- ct=0;
- ModemSendAT("AT+ZINVER\r\n");
- OSQFlush(ModemQ);
- }
- msg = (char *)OSQPend(ModemQ, 1, &err);
- if(err==OS_ERR_NONE){
- if(ModemCheckRecv(msg,"+ZINVER :")){ //+ZINVER : MC8332_MM8A1107_R01 1 [May 04 2015 22:30:38]
- ver=(msg[23]-0x30)*100+(msg[24]-0x30)*10+(msg[25]-0x30);
- }
- }
- }
- return ver;
- }
- /*****************************************************************************
- *发送数据封包
- format: 0x29 0x29 CMD Len PSN[4] Data Check 0x0D
- Len=DataLen+6
- ******************************************************************************/
- void SendBufPack(unsigned char cmd,unsigned short DataLen,unsigned char *data)
- {
- SUTDS ds;
- SUTDL dl;
- int i,j;
- if(DataLen>MODEM_SEND_BUF_LEN)return;
- //包头
- ModemSendBuf[0]=0x29;//Head
- ModemSendBuf[1]=0x29;//Head
- ModemSendBuf[2]=cmd;//CMD
- //DataLen
- ds.Data.usData=DataLen+6;
- TxBuffer3[3]=ds.Data.ucData.b2;
- TxBuffer3[4]=ds.Data.ucData.b1;
- //PSN
- dl.Data.ulData=sutNetPara.PSN;
- TxBuffer3[5]=dl.Data.ucData.b4;
- TxBuffer3[6]=dl.Data.ucData.b3;
- TxBuffer3[7]=dl.Data.ucData.b2;
- TxBuffer3[8]=dl.Data.ucData.b1;
- //Data
- j=9;
- for(i=0;i<DataLen;i++){
- TxBuffer3[j++]=data[i];
- }
- //check
- TxBuffer3[j++]= GetCheck(TxBuffer3,(DataLen+6));
- TxBuffer3[j++]=0x0D;
- g_ucUart3Sending=j;
- }
- /********************************************************************************************************
- *SendTick 发送心跳包
- *********************************************************************************************************/
- void SendTick(void)
- {
- char AT[100];
- SendBufPack(0,0,NULL);
- sprintf(AT,"AT+ZIPSEND=1,%d\r",g_ucUart3Sending);
- ModemSendAT(AT);
- ModemSendData(TxBuffer3,g_ucUart3Sending);
- }
- /*******************************************************************
- *GetCSQ
- ********************************************************************/
- int GetCSQ(char* msg)
- {
- int CSQ;
- if( msg[1]!='C' || msg[2]!='S' || msg[3]!='Q' || msg[4]!=':')return -1;
- CSQ=CSQ2Num(&msg[5]);
- return CSQ;
- }
- /*******************************************************************
- *GetPPPStatus
- ********************************************************************/
- STATUE GetPPPStatus(char *msg)
- {
- if(ModemCheckRecv(msg,"+ZPPPSTATUS:")){ //+ZPPPSTATUS: OPENED
- if(msg[13]=='O' && msg[15]=='E' && msg[18]=='D'){ //OPENED
- return OPEN;
- }else{
- return CLOSE;
- }
- } else return INVALID;
- }
- STATUE GetGpsServerStatus(char *msg){
- if(ModemCheckRecv(msg,"+RECV:")){
- if(msg[13]=='O' && msg[15]=='E' && msg[18]=='D'){ //OPENED
- return OPEN;
- }else{
- return CLOSE;
- }
- } else return INVALID;
- }
- /*******************************************************************
- *NetRecvMsgHandle
- ********************************************************************/
- int NetRecvMsgHandle(char *msg)
- {
- if(!ModemCheckRecv(msg,"+ZIPRECV:0,"))//+ZIPRECV:0,10,XXXX
- return 0;
-
- }
- /*******************************************************************
- *GetIPStatus
- ********************************************************************/
- STATUE GetIPStatus(char *msg)
- {
- if(ModemCheckRecv(msg,"+ZIPSTATUS:")){ //+ZIPSTATUS: ESTABLISHED
- if(msg[12]=='E' && msg[14]=='T' && msg[22]=='D'){
- return OPEN;
- }else{
- return CLOSE;
- }
- }else return INVALID;
- }
- /*******************************************************************
- *GetIPStatus
- ********************************************************************/
- STATUE GetIPStatusu(char *msg)
- {
- if(ModemCheckRecv(msg,"+ZIPSTATUSU:")){ //+ZIPSTATUSU: ESTABLISHED
- if(msg[13]=='E' && msg[15]=='T' && msg[23]=='D'){
- return OPEN;
- }else{
- return CLOSE;
- }
- }else return INVALID;
- }
- /*******************************************************************
- *GetIPStatus
- 返回:0--未获取 1--获取成功
- ********************************************************************/
- int GetMEID(void)
- {
- int timerout=500;
- int i,len;
- char *msg;
- INT8U err;
- int ct=100;
- while(timerout){
- timerout--;
-
- if(++ct>100){
- ct=0;
- ModemSendAT("AT+ZMEID\r\n");
- OSQFlush(ModemQ);
- }
- msg = (char *)OSQPend(ModemQ, 1, &err);
- if(err==OS_ERR_NONE){
- if(ModemCheckRecv(msg,"+ZMEID")){ //+ZMEID: 0xA000004E15F1CE0
- len=strlen(&msg[10]);
- if(16==len){
- for(i=0;i<14;i++)sutNetPara.MEID[i]=msg[10+i];
- sutNetPara.MEID[14]=0;
- return 1;
- }else if(17==len){
- for(i=0;i<15;i++)sutNetPara.MEID[i]=msg[10+i];
- sutNetPara.MEID[15]=0;
- return 1;
- }
- }
- }
- }
- return 0;
- }
- /*******************************************************************
- *GetIPStatus
- 返回:0--未获取 1--获取成功
- ********************************************************************/
- int GetCNUM(void)
- {
- int timerout=300;
- int i,len;
- char *msg;
- INT8U err;
- int ct=100;
- while(timerout){
- timerout--;
- if(++ct>100){
- ct=0;
- ModemSendAT("AT+CNUM?\r\n");
- OSQFlush(ModemQ);
- }
-
- msg = (char *)OSQPend(ModemQ, 1, &err);
- if(err==OS_ERR_NONE){
- if(ModemCheckRecv(msg,"+CNUM:")){ //+CNUM:1064910139657
- len=strlen(&msg[6]);
- if(15==len){
- for(i=0;i<13;i++)sutNetPara.CNUM[i]=msg[6+i];
- sutNetPara.CNUM[13]=0;
- return 1;
- }
- }
- }
- }
- return 0;
- }
- /*******************************************************************
- *GetIPStatus
- 返回:0--未获取 1--获取成功
- ********************************************************************/
- int GetUIMID(void)
- {
- int timerout=300;
- int i,len;
- char *msg;
- INT8U err;
- int ct=100;
- while(timerout){
- timerout--;
- if(++ct>100){
- ct=0;
- ModemSendAT("AT+CIMI\r\n");
- OSQFlush(ModemQ);
- }
- msg = (char *)OSQPend(ModemQ, 1, &err);
- if(err==OS_ERR_NONE){
- if(ModemCheckRecv(msg,"+CIMI:")){ //+CIMI: 460037590079119
- len=strlen(&msg[7]);
- if(17==len){
- for(i=0;i<15;i++)sutNetPara.UIMID[i]=msg[7+i];
- sutNetPara.UIMID[15]=0;
- return 1;
- }
- }
- }
- }
- return 0;
- }
- /*************************************************************
- *
- *************************************************************/
- void RecvModemData(unsigned char *msg)
- {
- int i;
- unsigned char *pData;
- unsigned short DataLen;
- unsigned char cmd;
- char tmp[5];
- char buf[100];
- if(!ModemCheckRecv(msg,"+ZIPRECV:"))return;
- SlwTrace(INF,"\r\nRECV");
-
- DataLen=String2Number(&msg[11]);
- //printf("\r\nl=%d\r\n",DataLen);
- if(DataLen<10){ //+ZIPRECV:1,8,xxx
- pData=msg+13;
- }else if(DataLen<100){
- pData=msg+14;
- }else if(DataLen<(MODEM_MSG_BUF_LEN-17)){
- pData=msg+15;
- }else{//非法
- return;
- }
- buf[0]=0;
- sprintf(buf,"[%d]",DataLen);
- for(i=0;i<DataLen;i++){
- sprintf(tmp,"%02x,",pData[i]);
- strcat(buf,tmp);
- }
- strcat(buf,"\r\n");
- SlwTrace(INF,buf);
- //处理
- GpsServerProcess(pData,DataLen);
- }
- //void TestTick(void)
- //{
- // char buf[30];
- // static unsigned long sulTick=0;
- // if(sulTick!=g_ulTickCt){
- // sulTick = g_ulTickCt;
- // }else return;
- // if(0 ==(g_ulTickCt%100)){
- // sprintf(buf,"T=%u\r\n",g_ulTickCt);
- // SlwTrace(INF,buf);
- // }
- //}
- /*******************************************************************
- *MainTask
- *主任务
- ********************************************************************/
- static void NetTask(void *pdata)
- {
-
- static STATUE PPPStatus=CLOSE;
- static STATUE IPStatus=CLOSE;
- static unsigned char sucNetStatusCt=0;
- static unsigned short susGpsTimingSendCt=0;
- STATUE status;
- int csq;
- char *msg;
- INT8U err;
- char buf[20];
-
- GpsDataInit();
- //创建消息队列,用于与UART3与Modem通讯
- ModemQ=OSQCreate(&ModemMsg[0], MODEM_Q_NUM);
- OSQFlush(ModemQ);
- //创建消息队列,用于与UART2与GPS通讯
- GpsQ=OSQCreate(&GpsMsg[0], GPS_Q_NUM);
- OSQFlush(GpsQ);
- //Get MEID
- SlwTrace(INF,"Net task running...\r\n");
- if(GetMEID()){
- SlwTrace(INF,"MEID:0x");
- SlwTrace(INF,sutNetPara.MEID);
- SlwTrace(INF,"\r\n");
- }else SlwTrace(INF,"Get MEID fail!\r\n");
- //Get NUM
- if(GetCNUM()){
- SlwTrace(INF,"CNUM:");
- SlwTrace(INF,sutNetPara.CNUM);
- SlwTrace(INF,"\r\n");
- }else SlwTrace(INF,"Get CNUM fail!\r\n");
- //Get UIMID (CIMI)
- if(GetUIMID()){
- SlwTrace(INF,"UIMID:");
- SlwTrace(INF,sutNetPara.UIMID);
- SlwTrace(INF,"\r\n");
- }else SlwTrace(INF,"Get UIMID fail!\r\n");
- //Get Ver
- g_iModemVer=GetModemVer();
- sprintf(buf,"MVer=%d\r\n",g_iModemVer);
- SlwTrace(INF,buf);
- PPPStatus=INVALID;
- IPStatus=INVALID;
- GpsServerStatus=INVALID;
- //
- OSTimeDlyHMSM(0, 0, 1, 0);
- GPSInit();
- while(1)
- {
- //喂狗
- IWDG_ReloadCounter();
- //进程关闭
- if(g_ucNetTaskDisable){
- OSTaskDel( OS_PRIO_SELF );
- OSTimeDly(10000);
- continue;
- }
- //Modem Uart消息处理 每次大约等待10ms
- msg = (char *)OSQPend(ModemQ, 1, &err);
- if(err==OS_ERR_NONE){//收到Modem发过来的消息,处理之
- // SlwTrace(INF,msg);
- csq=GetCSQ(msg);
- if(csq!=-1)g_iCSQ=csq;
- status=GetPPPStatus(msg);
- if(status!=INVALID){
- PPPStatus=status;
- }
- status=GetIPStatus(msg);
- if(status!=INVALID)IPStatus=status;
- RecvModemData(msg);
- }
- //GPS Uart消息处理 每次大约等待10ms
- msg=(char *)OSQPend(GpsQ, 1, &err);
- if(err==OS_ERR_NONE){//收到GPS发过来的消息,处理之
- // SlwTrace(INF,msg);
- process_nema(msg);
- }
- //=======控制大概每1秒往下执行=========
- if(g_ucSecFlag)g_ucSecFlag=0; //g_ucSecFlag在SysTick_Handler中置1
- else continue;
- //---控制定时发送GPS数据 ---
- if(IPStatus==OPEN && sutGpsInfo.isServerLogin){
- if(++susGpsTimingSendCt>sutGpsInfo.SendTime){
- susGpsTimingSendCt=0;
- GpsTimingSendPos();
- }
- }else{
- susGpsTimingSendCt=0;
- }
- //--------------------
- if(++sucNetStatusCt>4)sucNetStatusCt=0;
- switch(sucNetStatusCt)
- {
- case 0:
- ModemSendAT("AT+CSQ?\r");
- break;
- case 1:
- ModemSendAT("AT+ZPPPSTATUS\r");
- break;
- case 2:
- if(PPPStatus==OPEN){
- SlwTrace(INF,"AT+ZIPSTATUS=0\r\n");
- ModemSendAT("AT+ZIPSTATUS=0\r");
- }else{
- SlwTrace(INF,"AT+ZPPPOPEN\r\n");
- ModemSendAT("AT+ZPPPOPEN\r");
- }
- break;
- case 3:
- if(IPStatus!=OPEN && PPPStatus==OPEN){
- sutGpsInfo.isServerLogin=0;
- SlwTrace(INF,"AT+ZIPSETUP=0,183.131.13.6,1391\r\n");
- ModemSendAT("AT+ZIPSETUP=0,183.131.13.6,1391\r");
- }
- break;
- case 4:
- if(IPStatus==OPEN && 0==sutGpsInfo.isServerLogin){
- if(sutGpsInfo.isGpsWork)GpsServerConect();
- }
- break;
- }
- }
- }
- /*********************************************************************
- *NetTaskCreate
- **********************************************************************/
- void NetTaskCreate(void)
- {
- CPU_INT08U os_err;
- os_err = os_err; /* prevent warning... */
- os_err = OSTaskCreate((void (*)(void *)) NetTask,
- (void * ) 0,
- (OS_STK * )&AppNetTaskStk[APP_TASK_NET_STK_SIZE - 1],
- (INT8U ) APP_TASK_NET_PRIO );
- #if OS_TASK_NAME_EN > 0
- OSTaskNameSet(APP_TASK_NET_PRIO, "NetTask", &os_err);
- #endif
- }
|