阿里云推出的 物联网 平台是 专为 设备上云的平台,其物联网平台目前做的还是比较好的,尤其是高级版的 物模型 + IOT studio使得设备数据不仅能够在云端上线,而且可以方便的做web+app显示,基本上相当于web版本+app版的组态软件。基于阿里云的市场份额和功能特点,可以预计,未来其物联网平台应该会应用广泛。对于开发者而言,对重要的就是要使设备连接到物联网平台上,连接的协议如果自己实现还是非常复杂的,而其IOT-SDK就是为了方便开发者进行应用开发的,本系列文章计划对SDK架构分析、移植步骤、业务逻辑等全开发步骤进行分析,也算是过程资料。
系列文章参考了阿里云IOT C-SDK的官方手册《阿里云IOT C-SDK 手册》,C-SDK版本为v3.0.1.官方手册写的还是流程比较详全的,但是很多话写的过于专业,或者说写不够详细,也可能是我比较笨,所以需要结合代码和移植案例,来进行学习。接下来我们按照官方手册的流程来对C-SDK进行详细的分析,注意这里不是照搬,是提炼+总结。
C linkkit SDK 顾名思义,是为使用C语言 开发业务逻辑的设备 ,设备需要有联网功能,这分为2种情况,一种是设备本身能够联网,比如设备有以太网口,支持TCP/IP 协议。另一种需要外挂通信模组,比如GPRS模组、wifi模组等,而对于不能上网也没有模组的设备,需要通过通信网关来实现,网关简单的讲就是代理设备,这个后面会着重的讲解开发 流程。
在阿里云物联网平台上创建设备或网关,相当于注册,这是必须的,因为要上物联网,必须在物联网平台上注册,注册的方式,物联网平台上有详细的说明。
阿里云提供的是C-SDK的源码,我们具体使用的时候分两种情况:
① 我们直接通过SDK自带的编译系统,编译生成静态库*.a文件,然后我们在linux开发项目中引用该库 文件,当然要包含相 关的头文件,进行开发,SDK的设计还是比较 周全的,我们完全可以类似于u-boot 移植的流程,添加我们自己硬件设备的相关配置选项来进行移植、编译SDK.这一点我们后面详细的写该方式的移植步骤。
② 我们从C-SDK中抽取我们需要的功能代码,然后将代码放到我们的项目中,假设我们使用linux开发,我们就使用gcc来自己编译,而假设我们使用的是keil或IAR等IDE来开发,也是将对应功能的代码放入到工程中,进行 编译。这里可能会有人疑惑,SDK源码中那么多文件,我怎么知道抽取那些代码?抽取后会不会有各种问题?放心,该SDK在设计时就想到了这一点,在SDK的源码中,有2个工具,一个是 menuconfig 也就是“功能选项”可视化菜单功能和代码抽取工具。menuconfig菜单会将SDK支持的所有功能都罗列出来,然后我们选择我们要使用的功能,然后保存,它就会自动生成一个make.setting文件,这个文件记录了我们选择的功能,然后我们再使用代码抽取工具(一个脚本),抽取工具就会根据make.setting文件来自动的从SDK的源码中,抽取我们选择的功能所需要的全部源文件。这样我们就可以将抽出的代码放到我们的开发项目中,不管后面是基于linux+gcc,还是Keil或IAR等IDE。
两种方式各有利弊,第一种方式看起来简单,但是难度稍大,要求熟练在linux下进行移植、编译,而且代码冗余,不够清晰。第2种方案是阿里提倡的一种开发方案, 不仅代码更加简洁,而且条理清楚,尤其是使用外挂模组的,模组的HAL驱动实现也是相对麻烦的,需要一点点的调试。上面两种方案,后面都会有详细的移植案例来说明。
SDK的设计的出发点是语硬件平台无关的,以及运行在哪个操作系统上都无所谓的,只关注与物联网连接的软件功能的实现,所以它对底层的以来,都抽象成了一组 HAL_XXX风格的函数来代替。上面的抽取代码步骤,会生成一个 wrapper 文件夹,里面有个 wrapper_xxx.c 的文件,我们需要完善该文件中的所有HAL_XXX 接口函数。这其实也好理解,所有的跟硬件相关的项目移植,都涉及到接口的实现,毕竟每个人用的硬件方案都不一样,所以需要自己去实现。C SDK自带了ubuntu和Windows的接口实现代码,可以参考。这里特别说 一下,如果我们的设备是linux系统,而且有网口,具备TCP/IP驱动,那么可以直接用SDK自带的HAL接口,我们不需要实现HAL_xxx函数, 移植工作将会变得特别简单。
这里可能有些疑惑,为什么要把SDK和HAL分开,这是因为SDK首先提供了最核心的连接物联网的软件功能,这部分的功能能够生成一个 libiot_sdk.a 的库,这部分库只是联网的核心软件功能库,并不包含HAL层的库,而如果我们针对硬件设备开发,还需要实现HAL层,HAL层编译会生成一个libiot_hal.a库,这个库提供硬件接口,只有这两个库的功能都实现了,我们的业务逻辑才能真正的实现 真实的数据联网。注意上面说的是 两个库的功能实现,并不是说我们一定要生成这两个库,上面开发的第2种情况,也就是抽取代码的方案,我们将相关功能的文件放到 我们的项目文件中一起编译也是可以的, 只不过在linux下使用库开发,更加便利一些,也节省开发时间。所以生成库不是必须的,实现库的功能是必须的。有了这两种库的功能,我们就可以使用SDK提供的API来开发我们的项目了。
当我们实现了步骤2.4,不管是生成了库文件,还是将相应功能添加到 工程项目后,SDK提供的API接口就可以使用了,接下来我们就可以用这些API接口编写自己的业务逻辑了,比如连接物联网平台、上报数据、订阅主题、 接收命令 等等。
代码树如下:
+-- make.settings : 记录用户对SDK中哪些功能使用, 哪个功能关闭的配置文件
+-- makefile : 使用 Ubuntu16.04 及SDK自带编译系统时的makefile
+-- extract.bat : 使用 Windows 主机作为开发环境时的代码抽取脚本
+-- config.bat : 使用 Windows 主机作为开发环境时的功能配置脚本
+-- extract.sh : 使用 Linux 主机作为开发环境时的代码抽取脚本
+-- model.json :示例物模型.json格式
|
+-- output : SDK代码抽取以及编译构建的输出目录
| |
| +-- eng : SDK代码抽取输出目录, 运行 extract.sh 或
extract.bat 后产生
| | +-- dev_model
| | +-- dev_sign
| | +-- infra : 被抽取出来的各个功能点实现源码
| | +-- mqtt
| | +-- wrappers
| |
| +-- examples : 被抽取出来的各个功能点API调用例程
|
+-- certs : 服务端根证书目录, 存放阿里云IoT物联网平台的云端证书
+-- external_libs : SDK使用的第三方开源库
| +-- mbedtls
| +-- nghttp2
+-- src : SDK中各个功能点的实现源码, 运行 extract.sh 或
extract.bat 后会抽取到 output
| |
| +-- infra : 基座组件, 用户不必关心, 其内容的多寡由用户选择使用
的功能点多少自动适应
| +-- dev_sign : 设备签名模块, 体积最小的SDK可仅选用此功能
| +-- mqtt : MQTT上云
| +-- coap : CoAP上云
| +-- http : HTTP上云
| +-- ota : OTA固件升级
| +-- dev_model : 物模型管理
| +-- dynamic_register : 一型一密
| +-- dev_bind : 设备绑定
| +-- dev_reset : 设备重置
| +-- http2 : HTTP2流式传输和文件上传
| +-- wifi_provision : WiFi配网
| +-- atm : AT命令辅助模块, 将SDK运行在外挂网络通信模组的MCU
上, MCU和模组间用AT指令通信时使用
|
+-- tools : SDK抽取代码等行为所依赖的主机工具, 用户不必关心
+-- wrappers : SDK对外界依赖的函数接口 HAL_XXX 或者 wrapper_xxx
的参考实现
+-- atm
+-- os
| +-- freertos : SDK运行在FreeRTOS操作系统上的对接代码示例
| +-- nos : SDK运行在无操作系统的设备上的对接代码示例
| +-- ubuntu : SDK运行在Ubuntu操作系统上的对接代码示例
| +-- nucleus : SDK运行在Nucleus操作系统上的对接代码示例
+-- tls