对于使用KEIL、IAR进行设备开发的用户来说,不能使用make的方式编译SDK。此时用户可以配置需要的SDK功能,使用SDK提供的抽取工具将相应的代码抽取出来,然后将源文件添加到开发工具中的项目后进行编译; 对于使用Linux作为开发环境的用户,也可以使用本方式将代码抽取出来之后进行交叉编译。
本文将以获取MQTT上云
和OTA固件升级
能力为例,描述在Windows开发主机上的SDK移植过程
设备端的整体开发过程如下所示

以下是详细步骤讲解
SDK功能配置
SDK中有各种功能模块,用户需要决定需要使用哪些功能,在本例中假设用户需要MQTT上云和OTA固件下载的功能
在SDK的根目录双击config.bat
脚本运行,弹出如下的功能选择界面(相当于Ubuntu16.04 64位主机上的make menuconfig
命令)

- 按下空格键可以选中或者失效某个功能,使用小键盘的上下键来在不同功能之间切换。
- 如果想知道每个选项的具体含义,先用方向键将高亮光条移到那个选项上,再按键盘上的
h
按键,将出现帮助文本,对选项进行详细说明。
比如:
- 如果编译环境有自带标准头文件<stdint.h>,请使能选项
PLATFORM_HAS_STDINT
- 如果目标系统上运行有嵌入式操作系统,请使能选项
PLATFORM_HAS_OS
- 如果目标系统上支持
malloc
和free
这样的动态内存管理能力,请使能选项PLATFORM_HAS_DYNMEM
在本例中,我们需要MQTT上云和OTA固件下载的功能,所以需要选中
FEATURE_MQTT_COMM_ENABLED
:对应MQTT上云功能FEATURE_OTA_ENABLED
:对应OTA固件下载功能

然后将光标移动到窗口底部的<Exit>
上, 在随后弹出的保存对话框中选<Yes>
存盘退出配置界面
SDK代码抽取
经过上面的步骤,SDK根目录下的make.settings
功能配置文件的内容就会发生变化,对应到用户所选择的功能,如下所示:
FEATURE_MQTT_COMM_ENABLED=y
FEATURE_MQTT_DEFAULT_IMPL=y
# FEATURE_MQTT_PRE_AUTH is not set
FEATURE_MQTT_DIRECT=y
...
FEATURE_OTA_ENABLED=y
可以注意到其中对应所选功能点的开关FEATURE_MQTT_COMM_ENABLED
和FEATURE_OTA_ENABLED
都已被设置为y
,表示打开了
接下来运行代码抽取工具 extract.bat
,该脚本运行之后的界面如下所示:

抽取后的代码说明
如同config.bat
脚本的输出是make.settings
文件,extract.bat
脚本的输入是make.settings
,输出是output
文件夹

点击进去,观察它的内容。output目录结构如下
output/
+-- eng
| +-- certs
| +-- dev_model
| +-- dev_sign
| +-- infra
| +-- mqtt
| +-- ota
| +-- wrappers
| +-- external_libs
+-- examples
其中output/eng目录就对应的是SDK相关功能抽取出来的代码,output/example对应使用SDK中API接口的例子程序
文件或目录 | 说明 |
---|---|
output/eng |
对应SDK和支撑SDK的HAL接口 |
output/eng/infra |
不对应到某个具体的功能点,表示”基础“,但是内容的多少会随着被选择的功能点多少而变化 |
output/eng/certs |
不对应到某个具体的功能点,存放着验证阿里云IoT服务端的根证书,使能TLS传输时出现 |
output/eng/xxx |
对应当前被选中的xxx 功能的实现源码,其中output/eng/xxx/xxx_api.h 列出了这个功能的API
|
output/example/xxx |
对应当前被选中的xxx 功能的例子程序,演示了如何用这个功能的API编写业务逻辑
|
在本例中,eng下面的目录如下所示:

这些功能点的例子程序都在output/examples文件夹

对接HAL接口或者wrapper接口
SDK运行时对外界所需要的依赖都以HAL_XXX或者wrapper_xxx进行定义,并放于文件output\eng\wrappers\wrapper.c中,用户需要对其中的函数进行实现。

对每个HAL_XXX 接口都有详细的注释和文档,用户可以参考SDK根目录下的wrappers子目录中的wrapper参考实现。
其它
抽取出来的代码使用make进行编译
用户也可能使用GNU Make对抽取出来的代码进行编译,因此在抽取出来的目录下仍然提供了一个示例的makefile,make之后将会生成以下内容:
二进制文件 | 说明 | 产生方式 |
---|---|---|
libiot_sdk.a |
SDK主库文件,提供所有形如IOT_XXX 的用户API
|
从output/eng 下除了output/wrapper/* 的目录产生
|
libiot_hal.a |
支撑SDK的HAL库,提供形如HAL_XXX 的底层接口
|
从output/eng/wrappers 下源文件产生,其中output/eng/wrappers/wrapper.c 需要用户填写
|
xxx-example |
功能点的例子程序 | 从output/examples/xxx 下源文件产生,需要通过output 目录下运行make prog 命令编译
|
使用C++编译器编译时错误的处理
C++编译器在编译的时候判断比gcc判断更加严格,如果编译的时候出错,请编译时:
增加 -fpermissive -w, 去掉 -ansi -Wdeclaration-after-statement
总结
以图中红色文字表示用户执行的动作,用绿色文字表示用户得到的产物,则这个过程可用下图表示为

图中左上角是移植过程的开始,到右下角是移植过程的结束,以获得目标设备架构的二进制库libiot_sdk.a和libiot_hal.a为标志
到此为止整个SDK的抽取都已经讲解完毕,您可以将output/eng下的所有目录加入自己的工程中编译和集成,并参考output/examples下的例程开始调用SDK提供的API了