本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
原帖标题为:RISC-V SoC + IoT | 让博流 BL602 连接互联网 —— 使用 BL IoT SDK 通过 Wi-Fi 联网发出 HTTP GET 请求获取数据(以 BL-HWC-G1 开发板为例)
原帖网址为:https://verimake.com/topics/298 (旧版论坛网址,已失效)
原帖作者为:karb0n(旧版论坛 id = 39,注册于 2020-05-04 19:27:42)
原帖由作者初次发表于 2021-11-22 13:56:24
0. 引言
本文 是一份教程,展示了如何上手刚拿到的 博流智能 BL602 的开发板(本文以 BL-HWC-G1 为例),以及如何使用 BL IoT SDK 开发应用程序,还给出了个通过 WiFi 联网发出 HTTP 请求的栗子。
🌰 栗子包含以下功能:
- 初始化相关的协议栈,连接 WiFi,通过 DHCP 获得 IP 地址
- 发出 HTTP 请求并接收回复
- 向 bilibili API 发出 HTTP GET 请求,获取 VeriMake 的 bilibili 账号 的粉丝数量,有两种运行方式:
① 在 FreeRTOS 里创建一个 Task 定时获取
② 在 CLI 里输入命令来获取
吃了这个栗子(不是毛栗子),就可以更容易地使用 BL602 去做自己想做的物联网应用了。
目录
1. 我使用的 BL-HWC-G1 开发板
前段时间我在电子发烧友上申请了 博流 BL-HWC-G1 开发板试用,然后就收到了这块开发板。

从开发板介绍可以看出,这块开发板的核心是 BL602 IoT 3S 模组,BL602 是 博流智能 研发的一系列物联网 SoC,支持 WiFi 或 BLE,且内部集成了基于 RISC-V ISA 的 CPU,非常适合开发超低功耗物联网应用。这块开发板上还有一片 BL706,但这片 BL706 似乎是用于 USB2UART 给 BL602 提供命令行接口 (CLI) 和烧写接口的。
我们可以使用 BL IoT SDK 给 BL602 开发应用程序,根据 SDK 的文档介绍,它是适配所有 BL602 的开发板的(BL702 好像也行),所以如果您使用的是其它型号的 BL602 的开发板,也是可以参考本教程的,只不过少量步骤可能稍有不同。
这块 BL-HWC-G1 开发板还适配了 OpenHarmony L0 操作系统,感兴趣的小伙伴可以参考 这个页面 尝试一下,也非常欢迎在论坛中分享你的尝试。
2. 必要的材料
- 一块 BL602 的开发板(本文以 BL-HWC-G1 为例,若使用其它 BL602 的开发板,步骤可能稍有不同)
- 一根 Type-C USB 线
- 安装有 GNU/Linux 或 (Windows + WSL) 或 macOS 的可联网电脑
3. 下载 SDK、编译项目、烧写到开发板

如上图,BL IoT SDK 中文文档中的 “快速入门” 章节 已介绍了这些操作的步骤,本文就不复述一遍了,我们可以直接点进去阅读。
此外,本文再补充一些您可能需要的信息:
- 在博流智能开发者社区的 这个页面 可以下载 Windows 或者 macOS 版本的 Bouffalo Lab Dev Cube。
- 如果在 macOS 里准备烧录,不能直接点击 Bouffalo Lab Dev Cube 里的
Create & Download
,需要先按住开发板的 BOOT
按键不放,再按一下 RST
按键,最后再松开 BOOT
按键,然后才能进行烧录(这条信息来自于 HonestQiao 的贴子 “【博流 BL-HWC-G1 开发板试用】OpenHarmony编译和烧录”)。
- “快速入门” 中举例用的终端模拟器是 GTKTerm,这个软件只在 GNU/Linux 的图形界面下可用。如果你使用的 GNU/Linux 没有图形界面,需使用
cu
或者其它纯命令行工具来访问串口;如果你使用的是其它操作系统,需使用其它终端模拟器,比如 Windows 可以直接用 PuTTY,WSL 可以参考 这个文档。
4. SDK 中的一个项目有哪些文件
“快速入门” 中编译了 bl-iot-sdk/customer_app/bl602_demo_event
这个 demo 项目,提供了命令来展示开发板的一些功能。但是,这个 demo 的代码长达上千行,而自己想写的程序不一定需要用到那么多种功能,那我们要从哪里下手呢?可以返回上级的 bl-iot-sdk/customer_app/
目录,能看到还有下边这些文件夹,按类别提供了许多单独功能的 demo。
bl-iot-sdk/customer_app/
├── benchmark
├── bl602_demo_event
├── bl602_demo_wifi
├── bl702_demo_event
├── bl702_demo_lmac154
├── common
├── component
├── enjoy
├── get-start
├── network
├── peripheral
└── system
比如 network/
里是和网络相关的 demo,peripheral/
里是和外设相关的 demo。可以发现,还有一个叫作 get-start/
的目录,进入之后,是两个万物起源:
bl-iot-sdk/customer_app/get-start/
├── blink
└── helloworld
我们以 blink/
为例来看看一个最简单的项目的目录里边有哪些文件。blink/
是个 GPIO 的 demo,可以让某个引脚每隔一段时间切换一下输出电平的高低。(这个 demo 叫这名字的本意是想让某个灯闪烁,但是 BL-HWC-G1 上边的 BL602 没有直接连接 LED,所以如果想看到闪烁的灯,需要外接 LED)
blink/
里有如下的文件和文件夹
bl-iot-sdk/customer_app/get-start/blink/
├── Makefile
├── blink
│ ├── bouffalo.mk
│ └── main.c
├── genromap
└── proj_config.mk
在第 3 节中得知,执行 genromap
就可以开始编译这个项目,我们打开它可以发现,里边写着
#!/bin/sh
make CONFIG_CHIP_NAME=BL602 CONFIG_LINK_ROM=1 -j
exit $?
也就是说,运行它其实就会调用 make
。既然使用了 make
,那我们就可以编辑 Makefile
来描述编译的规则了。打开 blink
的 Makefile
能看到如下图所示的内容,包含了项目的名字等基本信息,以及需要包含的组件等。
如果我们想使用更多组件,需要在灰色方框框起来的那部分添加一些内容。至于添加的组件名字叫什么,可以在所需功能的 demo 项目的 Makefile
里查询。

除了 Makefile
之外,我们还要打开 proj_config.mk
,里边像下图一样,写了一些项目的配置信息。我们需根据自己项目需求,编辑一些条目。如果不知道需要修改哪些内容,也同样可以参考所需功能的 demo 项目的配置文件来查询。

blink/blink/main.c
是项目的主代码文件,如果我们要增加其它代码文件,也可以放在这一目录下。
了解了一个项目有哪些文件之后,我们继续进入下一节,来看看开发自己的项目的例子。
5. 联网并发出 HTTP 请求的例子
5.1 例子的所有代码
可以先在 https://github.com/CSY-tvgo/an-http-demo-on-BL602 下载这个例子的整个项目。
5.2 例子的使用方法
把下载的压缩包解压后放到 bl-iot-sdk/customer_app/get-start/
目录。
打开 get-start/httpGETbilibili_test/httpGETbilibili_test/main.c
,在第 688 ~ 689 行填上自己 WiFi 的 SSID 和密码。

在 get-start/httpGETbilibili_test/
目录下,输入
./genromap
开始编译这个项目。
等大约一分多钟编译完成后,把生成的机器码文件烧写进开发板。
烧写完成后,重启开发板。如果互联网连接正常,它会每隔 10 秒向哔哩哔哩 API 发出一次 HTTP GET 请求,查询 VeriMake 的用户信息。我们在终端模拟器中连接开发板(波特率:2000000
),可以每隔 10 秒看到类似下图的这些信息,包含了 HTTP 请求的报文和过程中的一些计时等内容。

其中最下边还有类似这样的一行处理后的提示,即某某用户在什么时候有几个粉丝。
uid=356383684 has 7508 followers at 2021-11-25 21:05:00 UTC+8
此外,这个例子还提供一个功能,我们可以在命令行中手动输入 bili_get <uid>
,去查询特定用户的粉丝数量,比如我想查询 雅思刷题日记 的粉丝数量,只需输入
bili_get 475921753
即可看到类似这样的提示:
uid=475921753 has 9003 followers at 2021-11-25 21:11:27 UTC+8
5.3 例子的开发过程与代码简介
编写出这个例子项目经历了以下步骤:
- 复制了一份
blink
项目(因为 blink
包含的组件最少),把文件夹改名成 httpGETbilibili_test
- 参考
bl602_demo_wifi
项目的配置信息,修改了本项目内的 Makefile
和 proj_config.mk
- 编写
main.c
内的代码
main.c
是本例子的主要代码,第 441 行以前的代码是直接从 bl602_demo_wifi
里复制来的,可以从如下图所示的这个注释开始往下看。

例子运行中的定时任务通过在 FreeRTOS 里创建 Task 实现,可以参考代码的 674 ~ 727 行。命令行中可输入的指令也是可以根据自己需求来添加的,可以参考代码的第 661 ~ 672 行。
http_request()
函数可以向指定的 host 发出指定内容的 HTTP 请求。
static int http_request(const char *hostname, const uint16_t port, const char *request, char *response);
// 发出 HTTP 请求,将返回结果存入 response
// @param[in] hostname 主机名
// @param[in] request 请求的报文
// @param[out] response 返回的报文
// @return 错误代码,为 0 表示运行成功
http_bili_GET()
函数可以读取某位哔哩哔哩用户的粉丝数量。
long http_bili_GET(char *uid, char *datetime);
// 读取某位 bilibili 用户的粉丝数量
// @param[in] uid 用户的 uid
// @param[out] datetime 返回结果的日期时间
// @return 粉丝数量,为 -1 表示读取错误
阅读代码和注释可以了解函数的具体实现。
基于这个例子,我们就可以较容易地使用 BL602 发出 HTTP 请求了,并且也可以参考代码来开发自己想做的网络应用了。如果有注释没有讲清楚的地方,欢迎在本贴下方留言讨论。