stm32_ota/USER/USER_HTTP/user_http.c

118 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "user_http.h"
#include <stdlib.h>
#include "cjson.h"
#include "userapp.h"
#include "key.h"
#include "user_flash.h"
#include "user_tcp.h"
#include "rtc.h"
/********************************************************************************
* @file gate_http.c
* @author 晏诚科技 Mr.Wang
* @version V1.0.0
* @date 11-Dec-2018
* @brief 提供Quectel模块EC20关于HTTP驱动程序
******************************************************************************
* @attention
*
* 约定基本名词如下:
* contextID:链路ID connetcID通道ID channal连接通道
* EC20模块链路ID范围1~16每一个链路ID都会对应一个本地IP 通道ID范围0~11。
* 每一个链路ID可以有12个通道ID。
* 本驱动强制规定HTTP协议只用一个链路1D即contextID=2用于HTTP链路。
* @use
* 先调用Http_Init()初始化HTTP链路等参数接着调用Send_Post发送POST请求最后通过Http_Read读取接收到的POST数据
*******************************************************************************/
/*****************************************
*内部常量
****************************************/
/*硬件注册接口 post请求相关参数宏定义*/
#define REG_BUF "POST http://%s%s HTTP/1.1\r\nContent-Type:application/json;charset=UTF-8\r\nHost:%s\r\ncontent-length:%d\r\n\r\n%s" //注册接口的请求数据
#define REG_HOST "quan.suning.com" //注册接口域名,使用苏宁提供的对时接口
#define REG_PORT "/getSysTime.do" //注册接口名
#define REC_BODY "{\"mac\":\"%s\"}" //body:{\"mac\":\"31FFD305524E353723892251\"}
/***************postBuf**********host***********httpPort**********body***************/
POSTP_s sReg = {REG_BUF, REG_HOST, REG_PORT, REC_BODY} ; //注册接口的POSTP_s实例化
/*********************************************************************************************************************
* 名 称RunResult Reg_Post(void)
* 功 能reg接口提交POST请求完成硬件注册同步RTC时间、设置RTC闹钟
* 说 明:
* 1、注册接口POST请求body:
* REC_BODY "{"mac":"31FFD305524E353723892251"}"
* 2、注册接口POST返回JSON:
* "{"sysTime2":"2020-10-10 10:58:44","sysTime1":"20201010105844"}"
* 注 意: 其实苏宁提供的对时接口不需要任何body数据都可以请求成功本例程将包含硬件MAC的json数据作为请求的body发起请求有两个目的
* 1、http中josn很常用所以给出使用cjson打包json数据包的方法。2、在实际应用中可以通过硬件地址完成设备的授权。
*********************************************************************************************************************/
RunResult Reg_Post(void)
{
RunResult runResult = TIMEOUT ;
GetDeviceMacAddress((uint8_t*)gateApp.macId, STRMACID) ;
cJSON * regBody = 0 ; //定义cjson
char * regBodyStr = 0 ; //定义指向cjson的字符串指针
regBody = cJSON_CreateObject(); //创建根节点对象
cJSON_AddStringToObject(regBody, "mac", (const char*)gateApp.macId); //向根节点加入字符串对象
regBodyStr=cJSON_Print(regBody);
DebugLogPrintf("硬件注册JSON%s", regBodyStr);
runResult = Send_Post( &sReg, regBodyStr) ;
if(runResult == RUNOK ) //post请求成功
{
runResult = Http_Read() ; //读取post返回的数据
if( RUNOK == runResult ) //读取POST返回数据成功
{
cJSON *json=NULL, *json_time=NULL; //json是json对象指针,json_time是 sysTime2对象的指针
json = cJSON_Parse((const char*)strrchr(ec20HttpBuf, '{')); //解析数据包
if (NULL == json) //如果解析失败
{
AppLogPrintf("cjson err:%s", cJSON_GetErrorPtr()) ;
runResult = RUNERR ;
}
else //解析json成功
{
json_time = cJSON_GetObjectItem(json, "sysTime2") ; //查找“sysTime2”字段
if( (json_time != NULL) && (json_time->type == cJSON_String)) /*存在“sysTime2”字段*/
{
strncpy( (char*)uCalendar.bytes, json_time->valuestring, 19) ;
RTC_Set( &uCalendar ) ; //设置时间
Calendar_u uAlaCal ; //设置闹钟
memcpy(uAlaCal.bytes, uCalendar.bytes, CALENDAR_LEN) ;
uAlaCal.sCalendar.w_date[1] += 1 ; //天数+1天
memcpy((u8*)uAlaCal.sCalendar.hour, "01", 2) ; //凌晨1点 闹钟时、分取决于此刻的时、分值
//memcpy((u8*)uAlaCal.sCalendar.min, "48", 2) ; //凌晨30分//uAlaCal.sCalendar.sec[0] += 2 ;
RTC_Alarm_Set(&uAlaCal) ;
DebugLogPrintf("服务器时间:%s\n", json_time->valuestring);
}
else /*不存在“sysTime2”字段*/
{
runResult = RUNERR ;
ErrorLogPrintf("No \"json_time\" .") ;
}
}
cJSON_Delete(json); //释放内存
}
else //读取POST返回数据失败
{
}
}
else //POST请求失败
{
HTTPBIT_3 = false ;
}
cJSON_Delete(regBody) ;
return runResult ;
}