BL602 HTTP的使用

1、前提条件:

      1.1、BL602已完成WIFI的连接,可以参考BL602 WIFI的使用

      1.2、需要在服务器放入一个文件,用来做下载测试。本人使用tomcat搭建一个局域网服务器,
在局域网的手机或者电脑,可以通过下面的网站访问该文件

http://192.168.43.103:8080/bl602/bl602_demo_user.bin

        192.168.43.103是服务器的IP,如果是局域网搭建的服务器就是电脑的IP

        8080是服务器端口号,局域网一般是8080

        bl602/bl602_demo_user.bin是服务器文件的路径 

2、下面创建http任务,WIFI连接成功之后,去下载服务器文件,并打印出来。我们在WIFI获取到IP之后,调用user_http_start()即可

 

user_http.c

#include "user_http.h"


/********************************************************************
 *@brief	HTTP任务函数
 *@param[in] pvParameters
 *@return	 none
 *******************************************************************/
static void user_http_task(void *pvParameters)
{
	//是否当前wifi没有连接
	if(!wifi_sta_is_connected())
	{
        USER_LOG_NAME("wifi no connect\r\n");
		goto	ota_fail_exit1;
	}

    struct  sockaddr_in remote_ip;
    int     read_bytes;
    char    *file_name  = "bl602_demo_user.bin";        //服务器文件名
    int     http_socket = -1;
    char    *recv_buf   = NULL;

    //分配接收缓存内存
    if((recv_buf = (char *)pvPortMalloc(USER_HTTP_REV_BUFF_LEN)) == NULL)
    {
        USER_LOG_NAME("recv_buf memory allocation failed\r\n");
        goto    ota_fail_exit;   
    }

    //创建TCP socket
    if ((http_socket = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    {
        USER_LOG_NAME("creator socket failed\r\n");
        goto    ota_fail_exit;
    }

    //配置TCP参数
    bzero(&remote_ip, sizeof(struct sockaddr_in));
    remote_ip.sin_family 	  = AF_INET;
    remote_ip.sin_addr.s_addr = inet_addr(USER_HTTP_SERVER_IP);
    remote_ip.sin_port 		  = htons(USER_HTTP_SERVER_PORT);

    //连接TCP
    if (connect(http_socket, (struct sockaddr *)(&remote_ip), sizeof(struct sockaddr)) != 0 )
    {
        USER_LOG_NAME("socket connect failed\r\n");
        goto    ota_fail_exit;
    }
    else
    {
        USER_LOG_NAME("socket connect success\r\n");
    }


    //向http服务器发送GET请求
    const char *GET_FORMAT =
        "GET %s%s HTTP/1.0\r\n"
        "Host: %s:%d\r\n"
        "Accept: application/octet-stream\r\n"
        "Accept-Encoding: identity\r\n"
        "User-Agent: bl602\r\n\r\n";


    char *ota_http_request = NULL;


    #define ASPRINTF_MODE   0

    #if ASPRINTF_MODE
    //方法1:使用asprintf
    int ret = asprintf(&ota_http_request, GET_FORMAT, USER_HTTP_SERVER_FILEPATH, file_name, USER_HTTP_SERVER_IP, USER_HTTP_SERVER_PORT);
    //是否分配内存失败
    if (ret < 0) 
    {
        free(ota_http_request);
        USER_LOG_NAME("asprintf failed\r\n");
        goto    ota_fail_exit;
    }

    #else
    //方法2:使用snprintf
    int ret_len = snprintf(NULL, 0, GET_FORMAT, USER_HTTP_SERVER_FILEPATH, file_name, USER_HTTP_SERVER_IP, USER_HTTP_SERVER_PORT);
    ret_len += 1;
    
    //分配内存
    if((ota_http_request = (char *)pvPortMalloc(ret_len)) == NULL)
    {
        USER_LOG_NAME("ota_http_request memory allocation failed\r\n");
        goto    ota_fail_exit;   
    }
    snprintf(ota_http_request, ret_len, GET_FORMAT, USER_HTTP_SERVER_FILEPATH, file_name, USER_HTTP_SERVER_IP, USER_HTTP_SERVER_PORT);
    #endif



    //发送http请求
    if (write(http_socket, ota_http_request, strlen(ota_http_request) + 1) < 0)
    {
    #if ASPRINTF_MODE
        free(ota_http_request);
    #else
        vPortFree(ota_http_request);
    #endif

        USER_LOG_NAME("http write failed\r\n");
        goto    ota_fail_exit;
    }

    USER_LOG_NAME("http send http request success\r\n");
    printf("%s\n",ota_http_request);

    //后面没有使用,释放内存
    #if ASPRINTF_MODE
        free(ota_http_request);
    #else
        vPortFree(ota_http_request);
    #endif




    int  total_len    = 0;
    bool is_head_done = false;

    //读取http文件数据
    while ((read_bytes = read(http_socket , recv_buf, USER_HTTP_REV_BUFF_LEN)) >= 0)
    {
        int i;
        if(!is_head_done)
        {
            for(i=0;i<read_bytes;i++)
            {
            	printf("%c",recv_buf[i]);
            }
            is_head_done = true;

            printf("\r\nfile data\r\n");
            printf("Address  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f");
        }
        else
        {
            for(i=0;i<read_bytes;i++)
            {
                if((total_len % 16) == 0)
                {
                    printf("\r\n%08x ",total_len);
                }
                total_len++;
                printf("%02x ",recv_buf[i]);
            }
        }

    //  vTaskDelay(20 / portTICK_PERIOD_MS);
    }


    printf("\r\n");
    USER_LOG_NAME("http finish: file len %d\r\n",total_len);


ota_fail_exit:
    if(http_socket != -1)
    {
        close(http_socket);
    }

    if(recv_buf != NULL)
    {
        vPortFree(recv_buf);
        recv_buf = NULL;
    }

ota_fail_exit1:
    vTaskDelete(NULL);
}





/********************************************************************
 *@brief	 HTTP开始
 *@param[in] none
 *@return	 none
 *******************************************************************/
void user_http_start()
{
	if(xTaskCreate(user_http_task, "", 1024, NULL, 4, NULL) != pdPASS)
	{
        USER_LOG_NAME("task create fail\r\n");
	}
    else
    {
        USER_LOG_NAME("task create success\r\n");
    }
}




user_http.h

#ifndef __USER_HTTP_H__
#define __USER_HTTP_H__

#include <blog.h>
#include "bl_gpio.h"

#include <FreeRTOS.h>
#include <task.h>
#include <timers.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>

#include <vfs.h>
#include <aos/kernel.h>
#include <aos/yloop.h>
#include <event_device.h>
#include <cli.h>

#include <bl602_glb.h>
#include <bl602_hbn.h>

#include <bl_uart.h>
#include <bl_chip.h>
#include <bl_wifi.h>
#include <hal_wifi.h>
#include <bl_sec.h>
#include <bl_cks.h>
#include <bl_irq.h>
#include <bl_dma.h>
#include <bl_timer.h>
#include <bl_gpio_cli.h>
#include <bl_wdt_cli.h>
#include <hal_uart.h>
#include <hal_sys.h>
#include <hal_gpio.h>
#include <hal_boot2.h>
#include <hal_board.h>
#include "hal_button.h"
#include <looprt.h>
#include <loopset.h>
#include <bl_sys_time.h>
#include <bl_sys.h>
#include <bl_romfs.h>
#include <fdt.h>

#include <easyflash.h>
#include <utils_log.h>
#include <libfdt.h>
#include <blog.h>

#include <wifi_mgmr_ext.h>
#include <lwip/sockets.h>


//===================================================================
//							常量定义
//===================================================================
#define USER_HTTP_SERVER_IP         "192.168.43.103"     	//服务器IP
#define USER_HTTP_SERVER_PORT       8080                  	//服务器端口
#define USER_HTTP_SERVER_FILEPATH   "/bl602/"		        //服务器文件路径
#define USER_HTTP_REV_BUFF_LEN      1024



//===================================================================
//							变量声明
//===================================================================


//===================================================================
//							函数声明
//===================================================================
void user_http_start();



#endif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当您使用BL602 SDK开发BL602应用程序时,您需要编写一个Makefile来指导编译和构建过程。以下是一个简单的BL602 Makefile示例: ```makefile # 指定编译器和工具链 CC := riscv-none-embed- LD := riscv-none-embed-ld # 指定编译器选项 CFLAGS := -march=rv32imac -mabi=ilp32 -O2 -Wall # 指定链接器选项 LDFLAGS := -nostartfiles -Wl,-T,bl602.ld # 源文件列表 SRCS := main.c foo.c bar.c # 生成目标文件列表 OBJS := $(SRCS:.c=.o) # 指定输出文件名 TARGET := app all: $(TARGET) $(TARGET): $(OBJS) $(LD) $(LDFLAGS) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(TARGET) ``` 在这个示例中,您需要根据您的项目结构和需求进行适当的调整。以下是一些常用的Makefile指令解释: - `CC`:指定编译器名称(例如,riscv-none-embed-gcc)。 - `LD`:指定链接器名称(例如,riscv-none-embed-ld)。 - `CFLAGS`:指定编译器选项(例如,优化等级,警告等)。 - `LDFLAGS`:指定链接器选项(例如,链接脚本等)。 - `SRCS`:列出所有源文件的列表。 - `OBJS`:根据`SRCS`生成目标文件列表。 - `TARGET`:指定生成的可执行文件名。 - `all`:默认目标,编译整个项目。 - `$(TARGET)`:链接目标文件生成可执行文件。 - `%.o: %.c`:规则,指示如何将.c文件编译为.o目标文件。 - `clean`:清除生成的目标文件和可执行文件。 要使用此Makefile,您可以将其保存为名为`Makefile`的文件,并在终端中使用`make`命令来编译和构建您的BL602应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dear_Wally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值