栗子包含以下功能:
- 初始化相关的协议栈,连接 WiFi,通过 DHCP 获得 IP 地址
- 发出 HTTP 请求并接收回复
- 向 bilibili API 发出 HTTP GET 请求,获取 VeriMake 的 bilibili 账号 的粉丝数量,有两种运行方式:
① 在 FreeRTOS 里创建一个 Task 定时获取
② 在 CLI 里输入命令来获取
吃了这个栗子(不是毛栗子),就可以更容易地使用 BL602 去做自己想做的物联网应用了。
本文的完成参考了以下材料,非常感谢各位开发者们在互联网上的分享:
[1] BL IoT SDK 的中文文档
[2] Documentation of BL602 IoT SDK (Pine64 fork)
[3] LEE Lup Yuen: Reverse Engineering WiFi on RISC-V BL602
[4] Documentation of lwIP (Lightweight IP stack)
本文也同样允许转载,只需标上本文来源即可,推荐标注最初的来源:https://verimake.com/topics/298
目录
- 0. 引言
- 1. 我使用的 BL-HWC-G1 开发板
- 2. 必要的材料
- 3. 下载 SDK、编译项目、烧写到开发板
- 4. SDK 中的一个项目有哪些文件
- 5. 联网并发出 HTTP 请求的例子
1. 我使用的 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 操作系统,感兴趣的小伙伴可以参考 这个页面 尝试一下,也非常欢迎在william hill官网
中分享你的尝试。
2. 必要的材料- 一块 BL602 的开发板(本文以 BL-HWC-G1 为例,若使用其它 BL602 的开发板,步骤可能稍有不同)
- 一根 Type-C USB 线
- 安装有 GNU/Linux 或 (Windows + WSL) 或 macOS 的可联网电脑
3. 下载 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 例子的所有代码
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/ 目录下,输入
开始编译这个项目。等大约一分多钟编译完成后,把生成的机器码文件烧写进开发板。
烧写完成后,重启开发板。如果互联网连接正常,它会每隔 10 秒向哔哩哔哩 API 发出一次 HTTP GET 请求,查询 VeriMake 的用户信息。我们在终端模拟器中连接开发板,可以每隔 10 秒看到类似下图的这些信息,包含了 HTTP 请求的报文和过程中的一些计时等内容。 其中最下边还有类似这样的一行处理后的提示,即某某用户在什么时候有几个粉丝。
- uid=356383684 has 7508 followers at 2021-11-25 21:05:00 UTC+8
复制代码
此外,这个例子还提供一个功能,我们可以在命令行中手动输入 bili_get ,去查询特定用户的粉丝数量,比如我想查询 雅思刷题日记 的粉丝数量,只需输入
即可看到类似这样的提示:
- 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 请求了,并且也可以参考代码来开发自己想做的网络应用了。如果有注释没有讲清楚的地方,欢迎在本贴下方或者这个贴子里留言讨论。