概述
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的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复