物联网应用开发

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

2019-07-25  本文已影响0人  Cedric_h

原文:https://blog.csdn.net/uyy203/article/details/55017571

本文主要讲述 Zigbee 与 SIM900A 通过HTTP协议将数据上传至云服务器上,如果需要了解Arduino和SIM900A的相关操作请看 https://www.jianshu.com/p/c967453c76e6

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

添加任务处理函数的具体步骤请看 https://www.jianshu.com/p/4842f377ff54

zigbee 实现终端和协调器无线组网的主要开发步骤请看 https://www.jianshu.com/p/8eb2508c585e

主要使用AT命令

主要使用AT命令

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

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[] 的数组中添加任务处理函数名

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执行语句的编号定义

/******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初始化函数

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 确定当前需要执行的命令语句以及需要的延时时间

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;
}

上一篇 下一篇

猜你喜欢

热点阅读