MC60 HTTP GET请求问题
我正在使用MC60ca模块,MC60 HTTP GET请求问题,http,server,gsm,quectel,Http,Server,Gsm,Quectel,我正在使用MC60ca模块, 我想使用web套接字,以便从服务器进行握手时,必须发送HTTP GET请求。请求的形式如下: “获取HTTP/1.1\r\nHost:echo.websocket.org:80\r\nUpgrade:websocket\r\n连接:升级\r\nSec websocket版本:13\r\nSec websocket密钥:Gsr/P3vIWH+j2U5Rmt0Bkw==\r\n\0” 我尝试使用sdk1.6的HTTP示例发送它,但我得到了cme错误3810和3811 我
我想使用web套接字,以便从服务器进行握手时,必须发送HTTP GET请求。请求的形式如下: “获取HTTP/1.1\r\nHost:echo.websocket.org:80\r\nUpgrade:websocket\r\n连接:升级\r\nSec websocket版本:13\r\nSec websocket密钥:Gsr/P3vIWH+j2U5Rmt0Bkw==\r\n\0” 我尝试使用sdk1.6的
HTTP示例发送它,但我得到了cme错误3810和3811
我还在+QHTTPCFG=“requestheader”,1\0中完成了requestheader=1
如何解决此请求错误
代码附在下面
#ifdef EXAMPLE_HTTP
#include “custom_feature_def.h”
#include “ql_type.h”
#include “ql_stdlib.h”
#include “ql_trace.h”
#include “ql_timer.h”
#include “ql_uart.h”
#include “ql_error.h”
#include “ql_gprs.h”
#include “ql_fs.h”
#include “ril.h”
#include “ril_network.h”
#include “ril_http.h”
#define DEBUG_ENABLE 1
#if DEBUG_ENABLE > 0
#define DEBUG_PORT UART_PORT1
#define DBG_BUF_LEN 512
static char DBG_BUFFER[DBG_BUF_LEN];
#define APP_DEBUG(FORMAT,…) {
Ql_memset(DBG_BUFFER, 0, DBG_BUF_LEN);
Ql_sprintf(DBG_BUFFER,FORMAT,##VA_ARGS);
if (UART_PORT2 == (DEBUG_PORT))
{
Ql_Debug_Trace(DBG_BUFFER);
} else {
Ql_UART_Write((Enum_SerialPort)(DEBUG_PORT), (u8*)(DBG_BUFFER), Ql_strlen((const char *)(DBG_BUFFER)));
}
}
#else
#define APP_DEBUG(FORMAT,…)
#endif
/****************************************************************************
Define http parameters
****************************************************************************/
#define APN_NAME “CMNET\0”
#define APN_USERID “”
#define APN_PASSWD “”
#define HTTP_REQUEST 0 // 0=http-get, 1=http-post, 2=http-file
//
// http url address
//
#if (HTTP_REQUEST == 0)
// url for http-get
#define HTTP_URL_ADDR “GET HTTP/1.1\r\nHost: echo.websocket.org:80\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: Gsr/P3vIWH+j2U5Rmt0Bkw==\r\n\0”
//#define HTTP_URL_ADDR “GET /2016/04/create-xml-request-in-c-for-server.html HTTP/1.1\r\nHost: www.aticleworld.com\r\nContent-Type: text/plain\r\n\r\n\0”
//#define HTTP_URL_ADDR "GET /demo/AC001/AC001(6).txt HTTP/1.1\r\nHost: techxinnovations.in\r\nConnection: Keep-alive\r\nAccept: /\r\n\r\n "
#elif (HTTP_REQUEST == 1)
// url for http-post
//#define HTTP_URL_ADDR “https://www.google.com\0”
#define HTTP_URL_ADDR “http://echo.websocket.org\0”
//#define HTTP_URL_ADDR “http://www.quectel.com/\0”
#elif (HTTP_REQUEST == 2)
// url for http-file
#define HTTP_URL_ADDR “http://124.74.41.170:5015/index.html\0”
#endif
// for http-post (HTTP_REQUEST=1)
//#define HTTP_POST_MSG “GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n\0”
#define HTTP_POST_MSG “GET HTTP/1.1\r\nHost: echo.websocket.org:80\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: Gsr/P3vIWH+j2U5Rmt0Bkw==\r\n\0”
// for downloading file via http (HTTP_REQUEST=2)
#define RAM_FILE_NAME “RAM:http.file\0”
#define RAM_FILE_SIZE 4096
u8 arrHttpRcvBuf[101024]; // 10K buffer for http data
static void HTTP_Program(u8 get_post);
static void Callback_HTTP_DwnldFile(u32 dllSize, u32 cntntLen, s32 errCode);
static void Callback_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void customizedPara);
static void SIM_Card_State_Ind(u32 sim_stat);
void proc_main_task(s32 taskId)
{
ST_MSG msg;
// Register & open UART port
Ql_UART_Register(UART_PORT1, Callback_UART_Hdlr, NULL);
Ql_UART_Open(UART_PORT1, 115200, FC_NONE);
Ql_UART_Register(UART_PORT2, Callback_UART_Hdlr, NULL);
Ql_UART_Open(UART_PORT2, 115200, FC_NONE);
APP_DEBUG("\r\nOpenCPU: example for HTTP programming\r\n");
while (1)
{
Ql_OS_GetMessage(&msg);
switch(msg.message)
{
case MSG_ID_RIL_READY:
APP_DEBUG("<-- RIL is ready -->\r\n");
Ql_RIL_Initialize();
case MSG_ID_URC_INDICATION:
switch (msg.param1)
{
case URC_SYS_INIT_STATE_IND:
APP_DEBUG("<-- Sys Init Status %d -->\r\n", msg.param2);
break;
case URC_CFUN_STATE_IND:
APP_DEBUG("<-- CFUN Status:%d -->\r\n", msg.param2);
break;
case URC_SIM_CARD_STATE_IND:
SIM_Card_State_Ind(msg.param2);
break;
case URC_GSM_NW_STATE_IND:
APP_DEBUG("<-- GSM Network Status:%d -->\r\n", msg.param2);
break;
case URC_GPRS_NW_STATE_IND:
APP_DEBUG("<-- GPRS Network Status:%d -->\r\n", msg.param2);
if (NW_STAT_REGISTERED == msg.param2 || NW_STAT_REGISTERED_ROAMING == msg.param2)
{
// GPRS is ready.
// Now, you can start to program http
if (0 == HTTP_REQUEST)
{// HTTP-get
HTTP_Program(0);
}
else if (1 == HTTP_REQUEST)
{// HTTP-post
HTTP_Program(1);
}
else if (2 == HTTP_REQUEST)
{// HTTP downlaod file
HTTP_Program(2);
}
}
break;
}
break;
default:
break;
}
}
}
static void SIM_Card_State_Ind(u32 sim_stat)
{
switch (sim_stat)
{
case SIM_STAT_NOT_INSERTED:
APP_DEBUG("<-- SIM Card Status: NOT INSERTED -->\r\n");
break;
case SIM_STAT_READY:
APP_DEBUG("<-- SIM Card Status: READY -->\r\n");
break;
case SIM_STAT_PIN_REQ:
APP_DEBUG("<-- SIM Card Status: SIM PIN -->\r\n");
break;
case SIM_STAT_PUK_REQ:
APP_DEBUG("<-- SIM Card Status: SIM PUK -->\r\n");
break;
case SIM_STAT_PH_PIN_REQ:
APP_DEBUG("<-- SIM Card Status: PH-SIM PIN -->\r\n");
break;
case SIM_STAT_PH_PUK_REQ:
APP_DEBUG("<-- SIM Card Status: PH-SIM PUK -->\r\n");
break;
case SIM_STAT_PIN2_REQ:
APP_DEBUG("<-- SIM Card Status: SIM PIN2 -->\r\n");
break;
case SIM_STAT_PUK2_REQ:
APP_DEBUG("<-- SIM Card Status: SIM PUK2 -->\r\n");
break;
case SIM_STAT_BUSY:
APP_DEBUG("<-- SIM Card Status: BUSY -->\r\n");
break;
case SIM_STAT_NOT_READY:
APP_DEBUG("<-- SIM Card Status: NOT READY -->\r\n");
break;
default:
APP_DEBUG("<-- SIM Card Status: ERROR -->\r\n");
break;
}
}
s32 RIL_HTTP_SETCONTENT(u16 len)
{
s32 retRes;
s32 errCode = RIL_AT_FAILED;
char strAT[30];
Ql_sprintf(strAT, "AT+QHTTPCFG=\"contextid\",%d\0", len);
retRes = Ql_RIL_SendATCmd(strAT, Ql_strlen(strAT), ATRsp_QHTTP_Handler, &errCode, 0);
if (retRes != RIL_AT_SUCCESS)
{
if (RIL_AT_FAILED == errCode)
{
return retRes;
} else {
return errCode;
}
}
Ql_sprintf(strAT, "AT+QHTTPCFG=\"requestheader\",%d\0", len);
retRes = Ql_RIL_SendATCmd(strAT, Ql_strlen(strAT), ATRsp_QHTTP_Handler, &errCode, 0);
if (retRes != RIL_AT_SUCCESS)
{
if (RIL_AT_FAILED == errCode)
{
return retRes;
} else {
return errCode;
}
}
Ql_sprintf(strAT, "AT+QHTTPCFG=\"responseheader\",%d\0", len);
retRes = Ql_RIL_SendATCmd(strAT, Ql_strlen(strAT), ATRsp_QHTTP_Handler, &errCode, 0);
if (retRes != RIL_AT_SUCCESS)
{
if (RIL_AT_FAILED == errCode)
{
return retRes;
} else {
return errCode;
}
}
return retRes;
}
static u32 m_rcvDataLen = 0;
static void HTTP_RcvData(u8* ptrData, u32 dataLen, void* reserved)
{
APP_DEBUG("<-- Data coming on http, total len:%d -->\r\n", m_rcvDataLen + dataLen);
if ((m_rcvDataLen + dataLen) <= sizeof(arrHttpRcvBuf))
{
Ql_memcpy((void*)(arrHttpRcvBuf + m_rcvDataLen), (const void*)ptrData, dataLen);
} else {
if (m_rcvDataLen < sizeof(arrHttpRcvBuf))
{// buffer is not enough
u32 realAcceptLen = sizeof(arrHttpRcvBuf) - m_rcvDataLen;
Ql_memcpy((void*)(arrHttpRcvBuf + m_rcvDataLen), (const void*)ptrData, realAcceptLen);
APP_DEBUG("<-- Rcv-buffer is not enough, discard part of data (len:%d/%d) -->\r\n", dataLen - realAcceptLen, dataLen);
} else {// No more buffer
APP_DEBUG("<-- No more buffer, discard data (len:%d) -->\r\n", dataLen);
}
}
m_rcvDataLen += dataLen;
}
static void HTTP_Program(u8 http_action)
{
s32 ret;
//u32 readDataLen = 0;
// Set PDP context
ret = RIL_NW_SetGPRSContext(Ql_GPRS_GetPDPContextId());
APP_DEBUG("<-- Set GPRS PDP context, ret=%d -->\r\n", ret);
// Set APN
ret = RIL_NW_SetAPN(1, APN_NAME, APN_USERID, APN_PASSWD);
APP_DEBUG("<-- Set GPRS APN, ret=%d -->\r\n", ret);
// Open/Activate PDP context
ret = RIL_NW_OpenPDPContext();
APP_DEBUG("<-- Open PDP context, ret=%d -->\r\n", ret);
ret=RIL_HTTP_SETCONTENT(1); //AT+QHTTPCFG=\"requestheader\",1\0
APP_DEBUG("<-- RIL_HTTP_SETCONTENT, ret=%d -->\r\n", ret);
// Set HTTP server address (URL)
ret = RIL_HTTP_SetServerURL(HTTP_URL_ADDR, Ql_strlen(HTTP_URL_ADDR));
APP_DEBUG("<-- Set http server URL, ret=%d -->\r\n", ret);
// Send get/post request
m_rcvDataLen = 0;
if (0 == http_action)
{
// get-request
APP_DEBUG("BEFORE GET REQUET\r\n");
ret = RIL_HTTP_RequestToGet(100); // 100s timetout
APP_DEBUG("<-- Send get-request, ret=%d -->\r\n", ret);
// Read response from server
ret = RIL_HTTP_ReadResponse(120, HTTP_RcvData);
APP_DEBUG("<-- Read http response data, ret=%d, dataLen=%d -->\r\n", ret, m_rcvDataLen);
}
else if (1 == http_action)
{
// post-request
APP_DEBUG("BEFORE GET IN POST REQUET\r\n");
ret = RIL_HTTP_RequestToPost(HTTP_POST_MSG, Ql_strlen((char*)HTTP_POST_MSG));
APP_DEBUG("<-- Send post-request, postMsg=%s, ret=%d -->\r\n", (char*)HTTP_POST_MSG, ret);
// Read response from server
ret = RIL_HTTP_ReadResponse(120, HTTP_RcvData);
APP_DEBUG("<-- Read http response data, ret=%d, dataLen=%d -->\r\n", ret, m_rcvDataLen);
}
else if (2 == http_action){
// get-request
ret = RIL_HTTP_RequestToGet(100); // 100s timetout
APP_DEBUG("<-- Send get-request, ret=%d -->\r\n", ret);
// Download file from http server
ret = RIL_HTTP_DownloadFile(RAM_FILE_NAME, RAM_FILE_SIZE, Callback_HTTP_DwnldFile);
APP_DEBUG("<-- Download file from http server, ret=%d -->\r\n", ret);
}
// Close PDP context
ret = RIL_NW_ClosePDPContext();
APP_DEBUG("<-- Close PDP context, ret=%d -->\r\n", ret);
}
static void Callback_HTTP_DwnldFile(u32 dllSize, u32 cntntLen, s32 errCode)
{
s32 iRet;
APP_DEBUG("<-- Finished to download file from http server, dllSize=%d, cntntLen=%d, errCode=%d -->\r\n", dllSize, cntntLen, errCode);
iRet = Ql_FS_GetSize((char*)RAM_FILE_NAME);
APP_DEBUG("<-- Check RAM file:%s, size:%d -->\r\n", (char*)RAM_FILE_NAME, iRet);
}
static void Callback_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void* customizedPara)
{
APP_DEBUG(“Callback_UART_Hdlr: port=%d, event=%d, level=%d, p=%x\r\n”, port, msg, level, customizedPara);
}
#endif //EXAMPLE_FTP
\ifdef示例\u HTTP
#包括“自定义_功能_def.h”
#包括“ql_type.h”
#包括“ql_stdlib.h”
#包括“ql_trace.h”
#包括“ql_timer.h”
#包括“ql_uart.h”
#包括“ql_error.h”
#包括“ql_gprs.h”
#包括“ql_fs.h”
#包括“ril.h”
#包括“ril_network.h”
#包括“ril_http.h”
#定义调试\u启用1
#如果调试\u启用>0
#定义调试端口UART端口1
#定义DBG_BUF_LEN 512
静态字符DBG_缓冲区[DBG_BUF_LEN];
#定义应用程序调试(格式,…){
Ql_memset(DBG_缓冲区,0,DBG_BUF_LEN);
Ql#u sprintf(DBG#u缓冲区,格式,##VA#u参数);
如果(UART_端口2==(调试_端口))
{
Ql_调试_跟踪(DBG_缓冲区);
}否则{
Ql_UART_Write((Enum_SerialPort)(DEBUG_PORT),(u8*)(DBG_BUFFER),Ql_strlen((const char*)(DBG_BUFFER));
}
}
#否则
#定义应用程序调试(格式,…)
#恩迪夫
/****************************************************************************
定义http参数
****************************************************************************/
#定义APN_名称“CMNET\0”
#定义APN_用户ID“”
#定义APN_PASSWD“”
#定义HTTP_请求0//0=HTTP get,1=HTTP post,2=HTTP文件
//
//http url地址
//
#如果(HTTP_请求==0)
//http get的url
#定义HTTP\u URL\u ADDR“获取HTTP/1.1\r\n主机:echo.websocket.org:80\r\n升级:websocket\r\n连接:升级\r\nSec websocket版本:13\r\nSec websocket键:Gsr/P3vIWH+j2U5Rmt0Bkw=\r\n\0”
//#定义HTTP\u URL\u ADDR“GET/2016/04/create-xml-request-in-c-for-server.html HTTP/1.1\r\n主机:www.aticleworld.com\r\n内容类型:text/plain\r\n\r\n\0”
//#定义HTTP\u URL\u ADDR“GET/demo/AC001/AC001(6).txt HTTP/1.1\r\n主机:techxinovations.in\r\n连接:保持活动\r\n概念:/\r\n\r\n”
#elif(HTTP_请求==1)
//http post的url
//#定义HTTP\u URL\u ADDR“https://www.google.com\0”
#定义HTTP\u URL\u ADDR“http://echo.websocket.org\0”
//#定义HTTP\u URL\u ADDR“http://www.quectel.com/\0”
#elif(HTTP_请求==2)
//http文件的url
#定义HTTP\u URL\u ADDR“http://124.74.41.170:5015/index.html\0”
#恩迪夫
//对于http post(http_请求=1)
//#定义HTTP\u POST\u MSG“GET/HTTP/1.1\r\nHost:www.google.com\r\n\r\n\0”
#定义HTTP\u POST\u MSG“获取HTTP/1.1\r\n主机:echo.websocket.org:80\r\n升级:websocket\r\n连接:升级\r\nSec websocket版本:13\r\nSec websocket键:Gsr/P3vIWH+j2U5Rmt0Bkw=\r\n\0”
//用于通过http下载文件(http_请求=2)
#定义RAM\u文件\u名称“RAM:http.FILE\0”
#定义内存文件大小4096
u8 arrhttpcvbuf[101024];//用于http数据的10K缓冲区
静态无效HTTP_程序(u8 get_post);
静态无效回调文件(u32 dllSize、u32 cntntLen、s32 errCode);
静态无效回调\u UART\u Hdlr(枚举串行端口,枚举UARTEventType msg,bool级别,void customizedPara);
静态无效SIM卡状态标识(u32 SIM卡状态);
无效进程主任务(s32任务ID)
{
味精;
//注册并打开UART端口
Ql_UART_寄存器(UART_端口1,回调_UART_Hdlr,NULL);
Ql_UART_打开(UART_端口115200,FC_无);
Ql_UART_寄存器(UART_端口2,回调_UART_Hdlr,NULL);
Ql_UART_打开(UART_端口2、115200、FC_无);
APP_DEBUG(“\r\nOpenPU:HTTP编程示例\r\n”);
而(1)
{
Ql_OS_GetMessage(&msg);
开关(消息)
{
案例消息\u ID\u RIL\u就绪:
应用程序调试(“\r\n”);
Ql_RIL_Initialize();
案例消息\u ID\u URC\u指示:
开关(消息参数1)
{
案例资源系统初始状态标识:
应用程序调试(“\r\n”,msg.param2);
打破
案例URC\u CFUN\u STATE\u IND:
应用程序调试(“\r\n”,msg.param2);
打破
案例URC SIM卡状态标识:
SIM卡状态标识(消息参数2);
打破
案例URC\u GSM\u NW\u州工业:
应用程序调试(“\r\n”,msg.param2);
打破
案例URC\u GPRS\u NW\u州工业:
应用程序调试(“\r\n”,msg.param2);
if(NW_STAT_registed==msg.param2 | | NW_STAT_registed_ROAMING==msg.param2)
{
//GPRS已准备就绪。
//现在,您可以开始编写http
如果(0==HTTP\U请求)
{//httpget
HTTP_程序(0);
}
else if(1==HTTP\U请求)
{//HTTP-post
HTTP_计划(1);
}
else if(2==HTTP\U请求)
{//HTTP下载文件
HTTP_程序(2);
}
}
打破
}
打破
违约:
打破
}
}
}
静态无效SIM卡状态标识(u32 SIM卡状态)
{
开关(sim_stat)
{
案例模拟统计未插入:
应用程序调试(“\r\n”);
打破
案例模拟统计就绪:
应用程序调试(“\r\n”);
打破
机箱模拟统计引脚要求:
应用程序调试(“\r\n”);
打破
案例模拟统计要求:
应用程序调试(“\r\n”);
打破
案例模拟统计PHU引脚要求:
应用程序调试(“\r\n”);
打破
案例模拟统计数据要求:
应用程序调试(“\r\n”);
打破
案例模拟统计PIN2要求:
应用程序调试(“\r\n”);
打破
案例模拟统计数据要求:
应用程序调试(“\r\n”);
打破
案例模拟统计忙:
应用程序调试(“\r\n”);
打破
案例模拟统计未就绪:
应用程序调试(“\r\n”);
打破
违约:
应用程序调试(“\r\n”);
打破
}
}
s32 RIL_HTTP_设置内容(u16 len)
{
s32网;
s32错误码=