10. M601 HTTP例程介绍

2023-11-09


#include <stdint.h>

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

#include "zyf_app.h"

#include "zyf_trace.h"
#include "zyf_timer.h"
#include "zyf_thread.h"


#include "httpclient.h"
#include "example_httpclient.h"

static Uart_Param_t g_uart1param;


void UartWriteCallBack(void* Param) // general com
{
    Uart_Param_t *uartparam = (Uart_Param_t *)Param; 
    if(Param == NULL)
    {
        return;
    }    

    ZYF_UartWrite(uartparam->port,(uint8_t *)"UartWrite succeed\r\n",strlen("UartWrite succeed\r\n"));
    ZYF_UartWriteCallbackSwitch(uartparam->port,false);

}

void UartReadCallBack(void* Param) // 
{
    uint32_t recvlen = 0;
    Uart_Param_t *uartparam = (Uart_Param_t *)Param; 

    /*
    UART_PORT1 = 0,
    UART_PORT2 = 1,
    UART_PORT3 = 2,
    */
    ZYF_LOG("Uart%d recv",uartparam->port);

    while(ZYF_UartRead(uartparam->port, &(uartparam->uartbuf[recvlen]), 1))
    {
        ZYF_LOG("recv :%02x",uartparam->uartbuf[recvlen]);
        recvlen++;
    }
    ZYF_UartWrite(uartparam->port,uartparam->uartbuf,recvlen);
    ZYF_UartWriteCallbackSwitch(uartparam->port,true);
}


static void AppUartInit(void)
{
    int32_t ret;
    g_uart1param.port = DEBUG_PORT;
    ZYF_UartRegister(g_uart1param.port, UartReadCallBack,&g_uart1param);
    ZYF_UartWriteCbRegister(g_uart1param.port,UartWriteCallBack,&g_uart1param);
    ZYF_UartOpen(g_uart1param.port, 115200, ZYF_FC_NONE);

    ZYF_LOG("AppUartInit");
    return;
}


void ZYF_HttpPdpActCallback(uint8_t status)
{
    ZYF_HttpClient_t *ptClient = &ZYF_HttpClient;
    ZYF_AppMsg_t tMsg;

    if (ptClient->ctx.ptMsg != NULL) {
        tMsg.wMsgId = status;
        ZYF_MsgQPut(ptClient->ctx.ptMsg, (void *)&tMsg);
    }
}


void ZYF_PdpActiveCnf(uint8_t contextId, int32_t errCode)
{
    ZYF_LOG("PDP: Active");

    ZYF_HttpPdpActCallback(APP_MSG_PDP_ACTIVE);
}

void ZYF_PdpDeactiveCnf(uint8_t contextId, int32_t errCode)
{
    ZYF_LOG("PDP: Deactive");
}

#if 1
/**
  * @brief      Http client "get" method working flow.
  * @param      None
  * @return     None
  */
void httpClientHead(void)
{

#if 1

    #define HTTP_GET_URL    "http://120.79.143.209:80/file/download.do?filename=BSJIOT.txt"
    char *get_url = HTTP_GET_URL;    
    httpclient_t client = {0};
    httpclient_data_t client_data = {0};
    char *buf,*header_buf;
    HTTPCLIENT_RESULT ret;
    int val_pos, val_len;
    

    buf = pvPortMalloc(BUF_SIZE);   
    if (buf == NULL) {        
        ZYF_LOG("memory malloc failed.");
        return;
    }   

    header_buf = pvPortMalloc(BUF_SIZE);   
    if (header_buf == NULL) {     
        vPortFree(buf);
        ZYF_LOG("memory malloc failed.");
        return;
    }   

    memset(header_buf,0,BUF_SIZE);
    client_data.header_buf_len = BUF_SIZE;
    client_data.header_buf = header_buf;
    client_data.response_buf = buf;
    client_data.response_buf_len = BUF_SIZE;    
    client_data.response_buf[0] = '\0';
    ret = httpclient_head(&client, get_url, &client_data);
    if (ret < 0)
        goto fail;   
    ZYF_LOG("heads received: %s", client_data.header_buf);

    // get response header
    if(0 == httpclient_get_response_header_value(client_data.header_buf, "Content-length", &val_pos, &val_len))
        ZYF_LOG("Content-length: %.*s", val_len, client_data.header_buf + val_pos);

fail:
    vPortFree(buf);
    vPortFree(header_buf);

    // Print final log
    if (ret >= 0)    
        ZYF_LOG("example project test success.");
    else        
        ZYF_LOG( "httpclient_get fail, reason:%d.", ret);
                        
#endif




}

void httpClientGet(void)
{
    char *url = "http://www.hizyf.com/";
    httpclient_t client = {0};
    httpclient_data_t client_data = {0};
    char *buf = NULL;
    int32_t recvlen = 0;
    
    buf = pvPortMalloc(BUF_SIZE);
    if (buf == NULL) {
        ZYF_LOG("Malloc failed.\r\n");
        return;
    }
    memset(buf, 0, BUF_SIZE);
    client_data.response_buf = buf;  //Sets a buffer to store the result.
    client_data.response_buf_len = BUF_SIZE;  //Sets the buffer size.
    #if 0
    int ret = httpclient_get(&client, url, &client_data);
    #else
    ZYF_LOG("url:: %s\r\n", url);

    HTTPCLIENT_RESULT ret = HTTPCLIENT_ERROR_CONN;
    ret = httpclient_connect(&client, url);

    if (!ret) {
        ret = httpclient_send_request(&client, url, HTTPCLIENT_GET, &client_data);

        if (!ret) {
            do{
                ret = httpclient_recv_response(&client, &client_data,HTTPCLIENT_GET);         
                recvlen += client_data.content_block_len;
                ZYF_LOG("Data received: %d,content_block_len:%d\r\n", recvlen,client_data.content_block_len);
                ZYF_LOG("Data received: %s\r\n", client_data.response_buf);
            }while(ret == HTTPCLIENT_RETRIEVE_MORE_DATA);
        }
    }

    httpclient_close(&client);
    #endif
    

    
    vPortFree(buf);

    return;

    
}

void httpClientPost(void)
{
    char *url = "http://api.mediatek.com/mcs/v2/devices/D0n2yhrl/datapoints.csv";
    char *header = "deviceKey:FZoo0S07CpwUHcrt\r\n";
    char *content_type = "text/csv";
    char *post_data = "1,,I am string!";
    httpclient_t client = {0};
    httpclient_data_t client_data = {0};
    char *buf = NULL;
    buf = pvPortMalloc(BUF_SIZE);
    if (buf == NULL) {
        ZYF_LOG("Malloc failed.\r\n");
        return;
    }
    memset(buf, 0, BUF_SIZE);
    client_data.response_buf = buf;  //Sets a buffer to store the result.
    client_data.response_buf_len = BUF_SIZE;  //Sets the buffer size.
    httpclient_set_custom_header(&client, header);  //Sets the custom header if needed.
    client_data.post_buf = post_data;  //Sets the user data to be posted.
    client_data.post_buf_len = strlen(post_data);  //Sets the post data length.
    client_data.post_content_type = content_type;  //Sets the content type.
    httpclient_post(&client, url, &client_data);
    ZYF_LOG("Data received: %s\r\n", client_data.response_buf);

    vPortFree(buf);

}

void httpClientPut(void)
{
    char *url = "http://ec2-52-76-74-57.ap-southeast-1.compute.amazonaws.com/mcs/test/ok/200";
    char *content_type = "text/csv";
    char *put_data = "1,,I am string!";
    httpclient_t client = {0};
    httpclient_data_t client_data = {0};
    char *buf = NULL;
    buf = pvPortMalloc(BUF_SIZE);
    if (buf == NULL) {
        ZYF_LOG("Malloc failed.\r\n");
        return;
    }
    memset(buf, 0, BUF_SIZE);
    client_data.response_buf = buf;  //Sets a buffer to store the result.
    client_data.response_buf_len = BUF_SIZE;  //Sets the buffer size.
    client_data.post_buf = put_data;  //Sets the user data to be put.
    client_data.post_buf_len = strlen(put_data);  //Sets the put data length.
    client_data.post_content_type = content_type;  //Sets the content type.
    httpclient_put(&client, url, &client_data);
    ZYF_LOG("Data received: %s\r\n", client_data.response_buf);
}



#endif




void HttpClienThread(void *pvParam)
{
    ZYF_HttpCtx_t * ctx = (ZYF_HttpCtx_t*)pvParam;
    ZYF_AppMsg_t tMsg;

    ZYF_LOG("HttpClienThread enter!");
    int iRet = -1;


    while (1) {
        iRet = ZYF_MsgQGet(ctx->ptMsg, (void *)&tMsg);
        if (iRet < 0) {
            ZYF_LOG("Failed to get msg");
            ZYF_ThreadSleep(10);
        }
        switch(tMsg.wMsgId)
        {
            case APP_MSG_PDP_ACTIVE:
            case APP_MSG_HTTP_TEST:
            {
                //httpClientHead();
                httpClientGet();
                //httpClientPost();
                //httpClientPut();
                ZYF_StartTimer(ctx->timer, 20000);       
                break;
            }
            default:
            {
                break;
            }
        }

        
    }
}




static void ZYF_HttpTimerCallback(void *pvParam)
{
    ZYF_HttpCtx_t * ctx = (ZYF_HttpCtx_t*)pvParam;
    ZYF_AppMsg_t tMsg;

    if (ctx->ptMsg != NULL) {
        tMsg.wMsgId = APP_MSG_PDP_ACTIVE;
        ZYF_MsgQPut(ctx->ptMsg, (void *)&tMsg);
    }


}



void ZYF_HttpClientTest(void)
{

    ZYF_HttpClient.ctx.ptMsg = ZYF_MsgQCreate(10, sizeof(ZYF_AppMsg_t));
    if(ZYF_HttpClient.ctx.ptMsg != NULL)
    {
        ZYF_LOG("Succeeded to create network msg");
    }
    ZYF_HttpClient.ctx.timer = ZYF_CreateTimer(ZYF_HttpTimerCallback, (void *)&ZYF_HttpClient.ctx);
    ZYF_ThreadCreate("HttpClienThread", HttpClienThread, (void *)&ZYF_HttpClient.ctx, ZYF_PRIORITY_NORMAL, 1024 * 8);

}


void HttpClient_Example(void * Param)
{
    ZYF_MsgQ_t *ptMsg;
    ZYF_AppMsg_t tMsg;
    int iRet = -1;
    ptMsg = ZYF_MsgQCreate(10, sizeof(ZYF_AppMsg_t));
    ZYF_LOG("thread enter!");

    ZYF_NetworkInit();
    ZYF_HttpClientTest();
    while (1) {
        ZYF_LOG("in while.");
        iRet = ZYF_MsgQGet(ptMsg, (void *)&tMsg);
        if (iRet < 0) {
            ZYF_LOG("Failed to get msg");
            ZYF_ThreadSleep(1000);
        }
    }

}

static void prvInvokeGlobalCtors(void)
{
    extern void (*__init_array_start[])();
    extern void (*__init_array_end[])();

    size_t count = __init_array_end - __init_array_start;
    for (size_t i = 0; i < count; ++i)
        __init_array_start[i]();
}


int appimg_enter(void *param)
{
    AppUartInit();
    ZYF_LOG("application image enter, param 0x%x", param);

    prvInvokeGlobalCtors();

    ZYF_ThreadCreate("HttpClient_Example", HttpClient_Example, NULL, ZYF_PRIORITY_HIGH, 10*1024);
    return 0;
}

void appimg_exit(void)
{
    OSI_LOGI(0, "application image exit");
}






















 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10. M601 HTTP例程介绍 的相关文章

  • 2023年工业信息安全技能大赛—岗位技能锦标赛通知

    点击星标 即时接收最新推文 一 锦标赛背景 为加速推进数字化 智能化 5G 大数据等新一代信息技术与制造业深度融合 提升工业信息安全行业学习人员的技能水平 结合装备制造产业发展需要 促进装备制造产业高质量发展 加快培养工业信息安全技能人才
  • SM.MS图床api调用

    第一步 注册sm ms账号 并获取API Access 第二步 HTML结构 我用的是vue
  • upload-labs大详解

    pass1 上传一个php一句话文件 记得改成php格式 发现不允许上传php类型的 只能上传jpg gif pngl的我们打算用burp抓包 先上传jpg的 然后用burp改成php的 放包后 找到它的存储位置 用蚁剑连接 成功连接 pa
  • python基础笔记(二)_pandas的基础语法

    数据分析工具包 Pandas 基础序列 一维数组 Series Series 是带有标签的一维数组 可以保存任何数据类型 轴标签统称为索引 index查看series索引 类型为rangeindex values查看series值 类型是n
  • Mysql之一行转多行(列转行)--- help_topic

    用到的知识点 substring index str delim count str 要处理的字符串 delim 分隔符 count 计数 例子 str www wikibt com substring index str 1 结果是 ww
  • Java实现比较APP版本号大小

    实现代码如下 比较APP版本号的大小 p 1 前者大则返回一个正数 2 后者大返回一个负数 3 相等则返回0 param version1 app版本号 param version2 app版本号 return int public sta
  • 如何利用ChatGPT写毕业论文

    如何利用ChatGPT写毕业论文 ChatGPT是什么 利用ChatGPT写毕业论文的步骤 1 准备数据 2 训练模型 3 生成论文 4 检查论文 总结 地址 ChatGPT是什么 ChatGPT是一个基于GPT 2模型的开源聊天机器人 它
  • Fabric开发(三)ubuntu下启动Fabric2.2.0网络,并测试一个Fabcar的demo

    前面几章内容 我们已经详细讲解过fabric 1 4 3网络搭建 fabric2 2 0本地编译 今天 我们在fabria2 2 0版本中 启动一个网络 并用SDK调用一个fabcar 的demo 体验一下fabric新版本 我们今天用No
  • 华为云AI视觉开发平台--HiLens使用中如何导入(转换)模型?

    HiLens是华为云的端云协同多模态AI开发应用平台 提供简单易用的开发框架 开箱即用的开发环境 丰富的AI技能市场和云上管理平台 对接多种端侧计算设备 支持视觉及听觉AI应用开发 AI应用在线部署 海量设备管理等 华为HiLens由AI推
  • 玩转Mixly – 9、Arduino AVR编程 之 函数

    以下内容源自Mixly官方技术文档 https mixly readthedocs io zh CN latest Arduino AVR 08Functions html 函数 在函数部分 主要分为定义函数和执行函数 需注意 当用户自定义
  • PHP自学教程之PHP加密函数

    数据加密的基本原理就是对原来的明文的文件或数据按某种算法进行处理 使其成为不可读的一定代码 通常称为 密文 通过这样的途径来达到保护数据不被非法窃取和阅读目的 PHP加密的函数主要有 crypt md5 和sha1 函数 还有加密的拓展库M
  • REDIS09_LBS出现背景、GEO算法介绍、算法步骤、剖析、邻近网格位置推算

    文章目录 LBS出现的背景 重新认识经纬度 感性认识GeoHash Geohash算法介绍 Geohash算法步骤 更深入剖析GeoHash 邻近网格位置推算 LBS出现的背景 移动互联网时代LBS应用越来越多 所在位置附近三公里的药店 交
  • Spring Boot + Spring Cloud + Spring Cloud Alibaba 版本对照表

    Json 详细数据 Spring Cloud 版本对应文档 Spring Cloud Alibaba 版本对应文档 spring cloud dependencies 版本 spring cloud 版本 spring boot 版本 sp
  • 4,使用 OpenCV 进行边缘检测

    效果微信扫码查看 原图 sobel X sobel Y sobel XY canny边缘检测 边缘检测是一种图像处理技术 用于识别对象的边界 边缘 或图像内的区域 边缘是与图像相关的最重要的特征之一 我们通过图像的边缘了解图像的底层结构 因
  • 第1组 团队展示

    1 组长博客链接 组长博客 2 团队项目描述 借呗 想借就借无需等待的资源管理平台 3 队员风采 林睿 风格 日常迷糊 喜欢慵懒随性 擅长的技术 还没有可以说得上擅长的技术 会基础的c和c 一点点python 编程的兴趣 想好好学pytho
  • 今日头条最新signature

    最新今日头条sign加密更新了 抽时间看了看 比上次的加密难度增加了许多 接下来讲下加密流程 今日头条获取下一页面的数据时断点位置 我们只需要找到window byted acrawler的生成就可以了 用fiddler拦击服务器返回的的r
  • Sortablejs实现vue项目表格拖动排序

    1 简介 Sortable js是一款优秀的js拖拽库 支持ie9及以上版本ie浏览器和现代浏览器 也可以运行在移动触摸设备中 不依赖jQuery 支持 Meteor AngularJS React Vue Knockout框架和任何CSS
  • Tomcat 9 免安装版 配置教程

    1 首先进入到https tomcat apache org 下载对应版本的TomCat 的 zip 包 解压到PC某个文件夹中 2 进入到目录 解压路径 bin 下 如我的路径参考 D Tomcat apache tomcat 9 0 6
  • Android 使用 okhttp3和retrofit2 进行单文件和多文件上传

    目录 前言 一 单文件上传 二 多文件上传 总结 前言 开发项目中需要进行单文件多文件的上传功能 下面演示的ApiResponse是自己分装的返回值 要根据自己的项目来完成 使用的mvvm框架 kotlin协程 看下大体思路和传参形式 仅供

随机推荐

  • leetcode刷题(9.24总结)

    1 相交链表 题目描述 https leetcode cn problems intersection of two linked lists class Solution def getIntersectionNode self head
  • 不平衡数据处理技术——RUSBoost

    RUSBoost是一个非常简单的针对不平衡数据集的算法 算法如其名 就是RUS Boost RUS random undersampling 随机欠抽样 随机从数据集中抽取一定量的多数类样本和少数类组成平衡分布的训练数据集 Boost 指的
  • linux 给lvm磁盘扩容

    目录 linux 给lvm磁盘扩容 扩容步骤 确认可用空间 创建新的物理卷 将物理卷添加到现有的卷组中 扩展逻辑卷 linux 给lvm磁盘扩容 早上到公司发现磁盘满了 挂载点是一个lvm 跟领导确认后决定先扩容再清理 原先是1T 决定扩容
  • oRACLE错误怎么办,Oracle的常见错误及解决办法

    ORA 12528 TNS listener all appropriate instances are blocking new connections ORA 12528问题是因为监听中的服务使用了动态服务 实例虽然启动 但没有注册到监
  • 解决adbd cannot run as root in production builds问题

    1 验证你的手机是否已经root了 adb shell su 行命令后 变为 即 表示root 成功 2 安装adbd insecure apk adb install adbd insecure apk 3 设置 打开应用将Enable
  • 集成公告|多链NFT游戏Blockchain Monster Hunt即将上线Moonbeam

    用户现可在Moonbase Alpha测试网体验Blockchain Monster Hunt游戏 并计划将于明年Moonbeam启动后上线Moonbeam平台 Moonbeam宣布支持多链NFT游戏Blockchain Monster H
  • 【弱网测试】

    弱网测试简介 1 测试方法及工具 随着互联网的快速发展 越来越多的应用核心功能需要联网实现 现在的网络制式有2G 3G 4G 5G 还有越来越多的公众WiFi 不同的网络环境和网络制式的差异都会对用户使用APP造成一定的影响 弱网测试作为健
  • [Codeforces 1579G] Minimal Coverage

    You are given n lengths of segments that need to be placed on an infinite axis with coordinates The first segment is pla
  • 爬虫获取电影数据----以沈腾参演电影为例

    数据可视化 分析实战 1 1 沈腾参演电影数据获取 1 2 电影数据可视化分析 文章目录 数据可视化 分析实战 前言 1 网页分析 2 构建数据获取函数 2 1 网页数据获取函数 2 2 网页照片获取函数 3 获取参演影视作品基本数据 4
  • Linux的c编程-文件节点的打开与读写操作

    1 open 打开文件 相关函数 read write fcntl close link stat umask unlink fopen 表头文件 include
  • Python实现简单爬虫功能

    在我们日常上网浏览网页的时候 经常会看到一些好看的图片 我们就希望把这些图片保存下载 或者用户用来做桌面壁纸 或者用来做设计的素材 我们最常规的做法就是通过鼠标右键 选择另存为 但有些图片鼠标右键的时候并没有另存为选项 还有办法就通过就是通
  • 如何用php请求gpt接口

    定义GPT接口地址和参数 url https api openai com v1 completions data array prompt gt Once upon a time max tokens gt 5 temperature g
  • 清除HTML的超链接样式,Markdown导出HTML,删除超链接下划线和字体样式

    使用Markdown生成的HTML含有超链接的下划线 如下图 将Markdown导出的HTML文件放置在Blog文章中时 Markdown文件的超链接下划线样式会影响整个页面的超链接下划线样式 如下图 修改方法是 将Markdown导出的H
  • Quaternion.Euler(0, 90, 0)*Vector3(0.0, 0.0, -10)

    Quaternion Euler x y z 返回一个绕x轴旋转x度再绕y轴旋转y度再绕z轴旋转z度的Quaternion 因此Quaternion Euler 0 90 0 返回一个绕y轴旋转90度的旋转操作 Quaternion作用于V
  • nginx 显示php错误日志,nginx php-fpm 输出php错误日志-php教程

    nginx是一个web效劳器 因而nginx的access日记只有对拜访页面的记载 没有会有php 的 error log信息 nginx把对php的申请发给php fpm fastcgi过程来解决 默许的php fpm只会输入php fp
  • 2021蓝桥杯模拟赛-删除字符

    题目 题目链接 题解 贪心 贪心思路 将整个字符串视为若干段降序排列的子串 即 从左边开始向右遍历 遇到逆序的就删除 再对新的串从头遍历找逆序 不停地重复整个过程是为了保证删除的尽可能靠前 贪心 如果整个字符串都顺序了 但是还要删 那么就从
  • 【Python计量】自相关性(序列相关性)的检验

    文章目录 一 图示法 一 滞后图 二 自相关图 三 自相关图和偏自相关图 二 DW检验法 三 Breusch Godfrey检验 一 手动编制函数进行BG检验 二 调用statsmodels的函数进行BG检验 四 Ljung Box检验 此
  • 高德地图api之location定位服务

    除了basic map外 高德地图api还提供了定位服务 兴趣点搜索服务 路线查找服务 离线地图服务 现在我们看一下api中如何使用AMaplocation定位服务 其实在android api中已经提供了android location
  • 查找子串出现的次数C/C++(strstr函数)

    任务描述 本关任务 计算一个字符串 子串 在另一个字符串 长串 中出现的次数 相关知识 字符串操作函数 C 和 C 提供了一系列操作字符串的函数 要使用这些函数只要在代码的头文件部分包含 string h 即可 这里我们用到strstr函数
  • 10. M601 HTTP例程介绍

    include