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命令
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;
}
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个字节 |
[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;
}
相关文章推荐
- Zigbee+SIM900A 通过http协议实现上传数据到云服务器
- Arduino+SIM900A 通过http协议实现上传数据到云服务器
- 使用GPRS模块SIM900A通过HTTP上传数据到云服务器的方法
- Android通过HTTP协议实现上传文件数据
- Android通过HTTP协议实现上传文件数据
- Android通过HTTP协议实现上传文件数据
- Android通过HTTP协议实现上传文件数据
- sim900a 裸AT通过GPRS网络发送接收数据
- 通过Http协议实现文件上传
- 通过Http协议实现文件上传
- 通过迈思德物联网网关将三菱Q00UJ系列PLC数据上传到云服务器
- Android开发入门之网络通信(通过HTTP协议实现文件上传)
- android通过http协议实现文件上传
- java实现服务端守护进程来监听客户端通过上传json文件写数据到hbase中
- 通过自定义数据绑定类实现MVC中图片上传
- PageOffice+C#+SqlServer+Aspose.Word+Aspose.Cells实现上传word模板,通过标签保存填写的数据到数据库中
- 微信的API都是通过https调用实现的,分为post方法调用和get方法调用。不需要上传数据的采用get方法(使用IntraWeb开发)
- Android学习笔记---28_网络通信之通过HTTP协议实现文件上传,组拼http 的post方法,传输内容
- 通过解析HTTP协议自己实现文件上传
- STM32通过SIM800L向yeelink端上传数据