您的位置:首页 > 理论基础 > 计算机网络

Zigbee+SIM900A 通过http协议实现上传数据到云服务器

2017-10-27 12:42 453 查看
本文主要讲述 Zigbee 与 SIM900A 通过HTTP协议将数据上传至云服务器上,如果需要了解Arduino和SIM900A的相关操作请看  http://blog.csdn.net/uyy203/article/details/54445725

GSM操作的操作都写在协调器上面,所以就只放出协调器的代码。这里会添加上一个专门做GSM操作的任务处理函数。

添加任务处理函数的具体步骤请看  http://blog.csdn.net/uyy203/article/details/50633465

zigbee 实现终端和协调器无线组网的主要开发步骤请看  http://blog.csdn.net/uyy203/article/details/51175759

测试的AT指令

AT+SAPBR=1,1 

AT+HTTPINIT 

AT+HTTPPARA="CID",1 

AT+HTTPPARA="URL","http://112.74.12.3:8080/?id=5&statu=1&time=10" 

AT+HTTPACTION=0 

 

服务器接受的数据

117.136.7.208:57560:连接成功

117.136.7.208:57560:GET /?id=666&statu=1&time=520 HTTP/1.1

Host: 112.74.12.3:8080

Accept: */*

Connection: Keep-Alive

User-Agent: SIMCOM_MODULE

主要使用AT命令

AT+CFUN=1选择模式为 全功能模式
AT+SAPBR=1,1打开承载,打开网络通道
AT+HTTPINIT初始化HTTP
AT+HTTPPARA="CID","1"设置承载上下文标识
AT+HTTPPARA="URL",http://120.9.9.129/xxx/update?tem=12"设置要访问的url
AT+HTTPACTION=0激活HTTP请求,0表示Get,1表示Post,2表示head
AT+HTTPREAD=0,60读取返回信息,从第0到第60个字节
GET 的请求:

[html] view
plain copy

AT+HTTPTERM  

AT+CSQ  

AT+CGATT?  

AT+SAPBR=3,1,"CONTYPE","GPRS"  

AT+SAPBR=1,1  

AT+HTTPINIT  

AT+HTTPPARA="URL","http://127.0.0.1:3000/v1/test"  

AT+HTTPACTION=0 //发送GET请求,注意返回的状态码  

AT+HTTPREAD   //read data  

POST请求:

[html] view
plain copy

AT+HTTPTERM  

AT+CSQ  

AT+CGATT?  

AT+SAPBR=3,1,"CONTYPE","GPRS"  

AT+SAPBR=1,1  

AT+HTTPINIT  

AT+HTTPPARA="URL","http://127.0.0.1:3000/v1/mbdevices?devsn=12345678&devtype=abc" 

AT+HTTPACTION=1 //发送POST数据,注意返回的状态码  

AT+HTTPREAD //read data  

1.在OSAL_GenericApp.c 中的osalInitTasks 函数中添加初始化函数名

[cpp] view
plain copy

void osalInitTasks( void )  

{  

  uint8 taskID = 0;  

  

  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);  

  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));  

  

  macTaskInit( taskID++ );  

  nwk_init( taskID++ );  

  Hal_Init( taskID++ );  

#if defined( MT_TASK )  

  MT_TaskInit( taskID++ );  

#endif  

  APS_Init( taskID++ );  

#if defined ( ZIGBEE_FRAGMENTATION )  

  APSF_Init( taskID++ );  

#endif  

  ZDApp_Init( taskID++ );  

#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )  

  ZDNwkMgr_Init( taskID++ );  

#endif  

    

#if !defined (ZDO_COORDINATOR)//判断是否协调器,不是则执行,是则跳过  

  GenericApp_Init( taskID );  

  

    

#else //协调器  

    GenericApp_Init( taskID++ );  

    GSM_Init(taskID);//GSM初始化函数  

    #endif  

}  

2.OSAL_GenericApp.c 中的tasksArr[] 的数组中添加任务处理函数名

[cpp] view
plain copy

const pTaskEventHandlerFn tasksArr[] = {  

  macEventLoop,  

  nwk_event_loop,  

  Hal_ProcessEvent,  

#if defined( MT_TASK )  

  MT_ProcessEvent,  

#endif  

  APS_event_loop,  

#if defined ( ZIGBEE_FRAGMENTATION )  

  APSF_ProcessEvent,  

#endif  

  ZDApp_event_loop,  

#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )  

  ZDNwkMgr_event_loop,  

#endif  

    

#if !defined (ZDO_COORDINATOR)//判断是否协调器,不是则执行,是则跳过  

  GenericApp_ProcessEvent  

      

#else //协调器  

  GenericApp_ProcessEvent,  

  GSM_ProcessEvent //GSM任务处理函数  

#endif      

};  

3.在Coordinator.c中加入GSM 初始化事件号、GSM处理语句执行事件号、GSM任务ID、GSM执行语句的编号定义

[cpp] view
plain copy

/******GSM******/  

#define  GSM_TIMER_OUT_EVT  (1<<0)  //GSM初始化事件  

#define  GSM1_TIMER_OUT_EVT  (1<<1) //GSM处理语句执行事件  

byte GSM_TaskID;  

unsigned char GSMTasknum;//自定义 GSM执行语句编号  

4.定义GSM初始化函数

[cpp] view
plain copy

void GSM_Init( byte task_id )//GSM初始化  

{  

  GSM_TaskID=task_id;//保存任务号以便后面的函数使用  

  osal_start_timerEx( GSM_TaskID,GSM_TIMER_OUT_EVT,10000);  

    

    unsigned char GSMString[150];  

  

       

      

    GSMTasknum=0;//准备执行第一句GSM命令  

      

    

    

}  

5.定义GSM任务处理函数

GSM_TIMER_OUT_EVT  的事件在系统启动后只会执行1次

GSM1_TIMER_OUT_EVT的时间在系统启动后会循环执行,在循环执行任务时,会根据GSM执行语句编号GSMTasknum 确定当前需要执行的命令语句以及需要的延时时间

[cpp] view
plain copy

UINT16 GSM_ProcessEvent( byte task_id, UINT16 events )//GSM 处理函数  

{  

  (void)task_id;  // Intentionally unreferenced parameter  

    

  unsigned char GSMString[150];  

    

  

  if ( events & SYS_EVENT_MSG )  

  {   

  

    //没有对SYS_EVENT_MSG作任何处理  

    return (events ^ SYS_EVENT_MSG);  

  }    

    

    

  

  //GSM初始化命令事件  

  if ( events & GSM_TIMER_OUT_EVT )  

  {  

      

    if(GSMTasknum==0){  

     

    sprintf(GSMString,"AT+CFUN=1\r\n");//选择模式为 全功能模式  

    HalUARTWrite(0,GSMString,osal_strlen(GSMString));   

      

    GSMTasknum=1;//执行下一GSM语句  

   

    osal_start_timerEx( GSM_TaskID,  

                        GSM_TIMER_OUT_EVT,  

                      15000);  

      

     return (events ^ GSM_TIMER_OUT_EVT);  

    }  

      

      

      

      

    if(GSMTasknum==1){  

    

    sprintf(GSMString,"AT+SAPBR=1,1\r\n");//打开承载,打开网络通道  

    HalUARTWrite(0,GSMString,osal_strlen(GSMString));   

      

    GSMTasknum=2;//执行下一GSM语句  

      

      

    osal_start_timerEx( GSM_TaskID,  

                        GSM_TIMER_OUT_EVT,  

                      5000);  

      

     return (events ^ GSM_TIMER_OUT_EVT);  

      

    }  

      

      

      

      

    if(GSMTasknum==2){  

      

    //初始化HTTP       

    sprintf(GSMString,"AT+HTTPINIT\r\n");  

    HalUARTWrite(0,GSMString,osal_strlen(GSMString));   

    

      

    GSMTasknum=3;//执行下一GSM语句  

       

      

    osal_start_timerEx( GSM_TaskID,  

                        GSM1_TIMER_OUT_EVT,  

                      500);  

          

     return (events ^ GSM_TIMER_OUT_EVT);  

      

    }  

      

  

      

      

    // return unprocessed events/  

    return (events ^ GSM_TIMER_OUT_EVT);  

  }  

    

    

    

    

    

  //GSM处理命令事件  

  if(events & GSM1_TIMER_OUT_EVT){  

      

      

          

      

    if(GSMTasknum==3){  

  

  

//设置承载上下文标识,每次登陆网页前都需要进行一次,不然网页缓存会造车频繁更新的数据无法通过url传值到web后台  

    sprintf(GSMString,"AT+HTTPPARA=\"CID\",\"1\"\r\n");   

    HalUARTWrite(0,GSMString,osal_strlen(GSMString));   

      

     GSMTasknum=4;//执行下一GSM语句  

      

      

    osal_start_timerEx( GSM_TaskID,  

                        GSM1_TIMER_OUT_EVT,  

                      500);  

      

     return (events ^ GSM1_TIMER_OUT_EVT);  

      

    }  

      

      

          

    if(GSMTasknum==4){  

      

    //设置要访问的url,假设需要传tem字段,通过如下URL传值可以实现,当然web端要与之对应  

    sprintf(GSMString,"AT+HTTPPARA=\"URL\",\"http://120.9.9.129/xxx/update?tem=%d\"\r\n",(int)tem); //打开网页 使用HTTP协议 get方式请求 IP 是我的服务器地址  

    HalUARTWrite(0,GSMString,osal_strlen(GSMString));   

    

      

    GSMTasknum=5;//执行下一GSM语句  

       

      

    osal_start_timerEx( GSM_TaskID,  

                        GSM1_TIMER_OUT_EVT,  

                      750);  

          

     return (events ^ GSM1_TIMER_OUT_EVT);  

      

    }  

      

     

      

      

    if(GSMTasknum==5){  

      

    //激活HTTP请求,后面参数表示Http请求方式,参数0表示Get方式,1表示Post方式,2表示head方式。  

    sprintf(GSMString,"AT+HTTPACTION=0\r\n");  

    HalUARTWrite(0,GSMString,osal_strlen(GSMString));   

    

      

    GSMTasknum=6;//执行下一GSM语句  

       

      

    osal_start_timerEx( GSM_TaskID,  

                        GSM1_TIMER_OUT_EVT,  

                      2000);  

          

     return (events ^ GSM1_TIMER_OUT_EVT);  

      

    }  

      

      

      

    if(GSMTasknum==6){  

      

    // 读取返回信息读取数据,从第0个字节到第60个字节  

    sprintf(GSMString,"AT+HTTPREAD=0,60\r\n");  

    HalUARTWrite(0,GSMString,osal_strlen(GSMString));   

    

      

    GSMTasknum=4;//执行第四GSM语句  

       

      

    osal_start_timerEx( GSM_TaskID,  

                        GSM1_TIMER_OUT_EVT,  

                      100);  

          

     return (events ^ GSM1_TIMER_OUT_EVT);  

      

    }  

      

      

      

      

      

      

      

     return (events ^ GSM1_TIMER_OUT_EVT);  

  }  

    

    

    

  

  // Discard unknown events  

  return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息