我是靠谱客的博主 现代菠萝,最近开发中收集的这篇文章主要介绍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 connectrn");
		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 failedrn");
        goto    ota_fail_exit;   
    }

    //创建TCP socket
    if ((http_socket = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    {
        USER_LOG_NAME("creator socket failedrn");
        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 failedrn");
        goto    ota_fail_exit;
    }
    else
    {
        USER_LOG_NAME("socket connect successrn");
    }


    //向http服务器发送GET请求
    const char *GET_FORMAT =
        "GET %s%s HTTP/1.0rn"
        "Host: %s:%drn"
        "Accept: application/octet-streamrn"
        "Accept-Encoding: identityrn"
        "User-Agent: bl602rnrn";


    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 failedrn");
        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 failedrn");
        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 failedrn");
        goto    ota_fail_exit;
    }

    USER_LOG_NAME("http send http request successrn");
    printf("%sn",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("rnfile datarn");
            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("rn%08x ",total_len);
                }
                total_len++;
                printf("%02x ",recv_buf[i]);
            }
        }

    //  vTaskDelay(20 / portTICK_PERIOD_MS);
    }


    printf("rn");
    USER_LOG_NAME("http finish: file len %drn",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 failrn");
	}
    else
    {
        USER_LOG_NAME("task create successrn");
    }
}




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

最后

以上就是现代菠萝为你收集整理的BL602 HTTP的使用的全部内容,希望文章能够帮你解决BL602 HTTP的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部