本文介绍以获取MQTT上云
和OTA固件升级
能力为例,描述在Windows开发主机上的SDK移植过程。
背景信息
对于使用KEIL、IAR进行设备开发的用户,不能使用Make的方式编译SDK。此时用户可以配置需要的SDK功能,使用SDK提供的抽取工具将相应的代码抽取出来,然后将源文件添加到开发工具中的项目后进行编译。
对于使用Linux作为开发环境的用户,也可以使用本方式将代码抽取出来之后进行交叉编译。
设备端的整体开发过程如下所示。
![image..png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3455376861/p682971.png)
SDK功能配置
在本示例主要介绍MQTT上云和OTA固件下载功能。
在SDK的根目录双击config.bat
脚本运行,弹出如下功能选择界面(相当于Ubuntu16.04 64位主机上的make menuconfig
命令)。
![](https://cdn.nlark.com/yuque/0/2019/jpeg/288961/1552462182873-0f37f808-9412-4ddd-b54b-027f5fb7a1f6.jpeg#align=left&display=inline&height=324&originHeight=796&originWidth=1562&status=done&width=636)
按下空格键可以选中或者失效相关功能,使用键盘的上下键来在不同功能之间切换。
您可使用方向键将高亮光条移到选项上,再按键盘上的
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固件下载功能。
![](https://cdn.nlark.com/yuque/0/2019/png/288961/1552462225097-defde0b0-cfc5-40af-9af0-5b04a906b9df.png#align=left&display=inline&height=307&originHeight=793&originWidth=1552&status=done&width=602)
将光标移动到窗口底部的<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
,该脚本运行之后的界面如下所示:
![](https://cdn.nlark.com/yuque/0/2019/png/288961/1552462247790-43756050-7f74-4111-9ab2-2dfbcb03be53.png#align=left&display=inline&height=209&originHeight=313&originWidth=642&status=done&width=428)
抽取后的代码说明
如同config.bat
脚本的输出是make.settings
文件,extract.bat
脚本的输入是make.settings
,输出是output
文件。
![](https://cdn.nlark.com/yuque/0/2019/png/288961/1552462317956-b9f30f90-fc10-475c-94e9-826b0349d13b.png#align=left&display=inline&height=142&originHeight=549&originWidth=2322&status=done&width=600)
单击output
文件,查看其详细内容。output
目录结构如下:
output/
+-- eng
| +-- certs
| +-- dev_model
| +-- dev_sign
| +-- infra
| +-- mqtt
| +-- ota
| +-- wrappers
| +-- external_libs
+-- examples
其中output/eng
目录就对应SDK相关功能抽取出的代码,output/example
对应使用SDK中API接口的示例程序。
文件或目录 | 说明 |
| 对应SDK和支撑SDK的HAL接口。 |
| 内容会随着被选择的功能而变化。 |
| 存放验证阿里云IoT服务端的根证书,使能TLS传输时出现。 |
| 对应当前被选中的 |
| 对应当前被选中的 |
在本例中,eng
下面的目录如下所示:
![](https://cdn.nlark.com/yuque/0/2019/png/288961/1552462441620-69f4b0fb-5902-4f9f-b01c-bf6023908542.png#align=left&display=inline&height=293&originHeight=641&originWidth=1312&status=done&width=600)
这些功能点的例子程序都在output/examples
文件中
![](https://cdn.nlark.com/yuque/0/2019/png/288961/1552462509968-7acf1d53-cafb-4265-8d27-33d78f72e58b.png#align=left&display=inline&height=233&originHeight=517&originWidth=1334&status=done&width=600)
对接HAL接口或者wrapper接口
SDK运行时对外界所需要的依赖都以HAL_XXX
或者wrapper_xxx
进行定义,并放于文件output\eng\wrappers\wrapper.c
中,用户需要对其中的函数进行实现。
![](https://cdn.nlark.com/yuque/0/2019/png/288961/1552462727250-2988e953-07c1-4403-b2fc-0d1428ddbeed.png#align=left&display=inline&height=353&originHeight=1194&originWidth=1773&status=done&width=524)
对每个HAL_XXX
接口都有详细的注释和文档,您可参考SDK根目录下的wrappers子目录中的wrapper参考实现。
抽取出来的代码使用Make进行编译
用户也可能使用GNU Make对抽取出来的代码进行编译,因此在抽取出来的目录下仍然提供了一个示例的makefile
,make之后将会生成以下内容:
二进制文件 | 说明 | 产生方式 |
| SDK主库文件,提供所有形如 | 从 |
| 支撑SDK的HAL库,提供形如 | 从 |
| 功能点的例子程序。 | 从 |
使用C++编译器编译时错误的处理
C++编译器在编译的时候判断比gcc判断更加严格,如果编译出错,请进行如下编译。
增加 -fpermissive -w, 去掉 -ansi -Wdeclaration-after-statement
总结
图中红色文字表示用户执行动作,绿色文字表示用户得到的产物,过程如下图所示。
![](https://cdn.nlark.com/yuque/0/2019/png/288961/1552463211465-22401092-6555-4dfd-83f6-3b2e2088b3f1.png#align=left&display=inline&height=430&originHeight=1118&originWidth=1941&status=done&width=746)
图中左上角是移植过程的开始,到右下角是移植过程的结束,以获得目标设备架构的二进制库libiot_sdk.a
和libiot_hal.a
为标志。
整个SDK的抽取都已经完毕,您可以将output/eng
下的所有目录加入自己的工程中编译和集成,并参考output/examples
下的例程开始调用SDK提供的API。