开发者学堂课程【基于STM32的端到端物联网全栈开发:LinkKit SDK 接入阿里云物联网平台(2)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/574/detail/7942
LinkKit SDK 接入阿里云物联网平台(2)
Linkkit SDK 的介绍
1、Linkkit C-SDK
2、Linkkit C-SDK 如何配置到 STM32平台
3、Linkkit C-SDK 的使用
阿里云 loT 提供给设备厂商用于快速将设备接入阿里云 loT 平台的功能代码集,它是一套代码,由多种语言实现的版本。
例如:嵌入式设备中嵌入式 C 语言版本(适用于 C 语言开发业务处理逻辑的设备,由于速度快、需要运行内存少目前大多数 IOT 设备运用 C 语言开发);运行在 node.js 下的 JavaScript 语言版本;运行在安卓环境下的 java 语言版本。
Linkkit SDK 的主要功能:
基础功能@阿里云 loT 平台设备管理.基础版
1.设备连云:支持多种协议连接阿里云 loT 平台:MQTT、CoAP、HTTP/S、HTTP2(做文件上传,)
2.设备认证:多种身份认证方式:一机一密(指在设备稍写该设备的方元组),一型一密(额外引入了产品密钥)
3.数据通信:SDK 提供上行、下行数据接口,数据加密功能
高级功能@阿里云 loT 平台设备管理.高级版
1.物模型:处理属性上报、设置;服务调用、事件上报
2.设备 OTA:设备厂商通过阿里云loT平台推送固件给设备,设备 SDK 负责接收固件并调用设备升级函数实现固件的烧写(用户可以实现节点上设备的固件下载)
3.时间同步:SDK 可从云端获取实时时间,用于设备的定时任务
4.Wifi 配网:SDK 提供多种配网方式:一键配网、手机热点配网、零配、路由器配网
Linkkit C-SDK 架构框图:(可以比较细节的展示各个组成模块)
最底层是 OS 层,兼容 RTOS 和非 RTOS,也可裸跑
橙色部分是连接协议,包括 MOTT,CoAP,HTTP,HTTP2.0
最上层是基于各种连接协议和服务的历程
Linkkit SDK 源文件组织:
build-rules:编译构建系统,基于 GNU Make 和 bash 脚本
project.mk:编译系统配置,指定 SDK 的目录排布等
LICENSE:软件许可证,C-SDK 使用的是 Apache-2.0版本软件许可证。
READIE.txt:简要说明,列出了 c-SDK 的功能模块和模块内容等
makefile:基于 GNU Make 编译 SDK 的顶层 Makefile
CMakeLists.txt:基于 cmake 编译 SDK 的顶层 CMakeLists.txt
make .settings:功能裁剪配置,可编辑该文件来裁剪 SDK 的内容
examples:例程目录,演示 SDK 的使用
coap:演示如何使用通信模块 CoAP 的 API
device-shadow:演示如何使用服务模块 DeviceShadow 的 API
http:演示如何使用通信模块 HTTP 的 API
http2:演示如何使用通信模块 HTTP2的 API
linkkit:演示如何使用服务模块 linkkit 的 API
mqtt:演示如何使用通信模块 MQTT 的 API
ota:演示如何使用服务模块 ota 的 API
include:头文件目录,列出 SDK 以来的 HAL 接口和向用户体提供的 API 接口
iot_export.h:列出所有 API 层函数的声明,是 sDK 所提供的接口
iot_import.h:列出所有 HAL 层函数的声明,是 SDK 所依赖的接口
exports:列出各功能点提供的 API 层接口
imports:列出各功能点依赖的 HAL 层接口
board:跨平台适配目录,一个目标平台对应一个 config.xxx.yyy 文件
config.rhino.make:适配到 AliOs Things 系统的编译配置文件
config.ubuntu.x86:适配到 ubuntu 系统的编译配置文件
config.win7.mingw32:适配到 win7/win10系统的编译配置文件
infra:SDK 核心获取中的基础模块目录
log:实现运行时 SDK 的日志
system:实现全局信息保存,如官方根证书,设备标识I等
utils:实现工具函数,如连接鉴权时的 SHA1摘要计算等
protocol:SDK 核心实现中华的通信模块目录
alcs:实现设备和手机 app 之间的本地加密通信
coap:实现设备和阿里云之间的 coAP 协议通信
http:实现设备和阿里云之间的 HTTP 协议通信
http2:实现设备和阿里云之间的 HTTP2协议通信实现设备和阿里云之间的 QTT 协议通信
mqtt:实现设备和阿里云之间的 MQTT 协议通信
services:SDK 核心实现中的服务模块目录
awss:实现设备和手机 app 之间的 wiFi 配网服务
linkkit:实现设备和阿里云之间的物模型管理服务实现
ota:设备和阿里云之间的固件升级服务
sdk-impl: API 实现目录,iot_export.h 中的 API 在此实现(是 sdk 对外实现的 api)
ref-impl:参考实现目录,包括加解密库和 HAL 接口的参考实现(是 hal 层安全模块,需要用户根据自己的意见平台和采用的安全框架来做适配)
hal:SDK 所依赖的 HAL 接口的参考实现
tls:加解密库的参考实现,由开源软件 mbedtls 裁剪而成
tools:用于辅助 build-rules 编译系统的编译脚本文件
橙色方框是核心实现以及对上层应用的接口
蓝色需要客户自己适配部分
设备端 C-SDK 的分层:
C-SDK Example(填入设备信息,便可在 linux 主机下运行)
C-SDK 接口层(API) e.g,LOT_xxx_yyy(sdk 跨平台完成之后,调用它编写逻辑和阿里云平台通信)
C-SDK 核心实现层(用户无需关心)(它完成了通道的功能封装)
硬件抽象层 HAL_xxx_yyy(这里是抽象不同的切用式目标板对 sdk 的支撑函数)
调用 API:
1.基础
2.MQTT
3.CoAP
4.HTTP
5.设备影子
6.OTA
7.Alink
适配 HAL:
1.基础功能
2.多线程
3.MQTT
4.CoAP
5.OTA
6.WIFI配网
7.设备信息
设备信息,相关 HAL:
HAL_GetChiplD:获取芯片 ID
HAL_GetDeviceID:获取设备 ID(在2.3.1及以后版本中不需要实现)
HAL_GetFirmwareVesion:获取固件版本号,必须实现
HAL_GetModuleID:获取模组 ID,用于紧密合作伙伴,一般客户只需要在此可实现为空函数
//前三个获取各种 id 用于 sdk 运行的时候向阿里云平台报告信息,发送到该系统主题
HAL_GetPartnerID:获取合作伙伴 ID,用于紧密合作伙伴,一般客户只需要在此可实现为空函数
HAL_GetDeviceName:获取 DeviceName,三元组获取函数之一,必须实现
HAL_GetDeviceSecret:获取 DeviceSecret,三元组获取函数之一,必须实现
HAL_GetProductKey:获取 ProductKey,三元组获取函数之一,必须实现
HAL_GetProductSecret:获取 ProductSecret,三元组获取函数之一,必须实现
HAL_SetDeviceName:设置 DeviceName,三元组配置函数之一,必须实现
HAL_SetDeviceSecret:设置 DeviceSecret,三元组配置函数之一,必须实现
HAL_SetProductKey:设置 ProductKey,三元组配置函数之一,必须实现
HAL_SetProductSecret:设置 ProductSecret,三元组配置函数之一,必须实现
相关 HAL 的实现:
用于 ITLS 安全方案时的网络连接;上报设备端信息;
HAL_GetPartnerID:example.demo.ST
HAL_GetModulelD:example.demo.emw3080
HAL_GetFirmwareVersion:app-1.0.0-20190101.1000
HAL_GetProductKey:从_product_key 读出
HAL_GetDeviceName:从_device_name 读出
HAL_GetDeviceSecret:从_device_secret 读出
HAL_GetProductSecret:从_product_secret 读出
HAL_GetDevicelD:由_product_key._device_name 拼成
HAL_GetNetiflnfo:保留参考实现
从 flash 固定位置读出配置写到运行环境的全局变量中:
HAL_SetProductKey:写_product_key
HAL_SetDeviceName:写_device_name
HAL_SetDeviceSecret:写_device_secret
HAL_SetProductSecret:写_product_secret
中定义的全局数组变量
基础功能,相关 HAL:(包括对内存的分配、释放管理、延时操作、打印函数、KV操作等)
HAL_Malloc:申请一片堆上内存
HAL_Free:释放一片堆上内存
HAL_SleepMs:睡眠函数,使当前执行线程睡眠指定的毫秒数
HAL_Snprintf:打印函数,向内存缓冲区格式化构建一个字符串,参考c99标准库函]数 snprintf
HAL_Printf:打印函数。用于向串口或其它标准输出打印日志或调试信息
HAL_Vsnprintf:字符串打印函数,将 va_list 类型的变量,打印到指定目标字符串
HAL_UptimeMs:时钟函数,获取本设备从加电以来到目前时间点已过去的毫秒数
HAL_Ku_Set:写入指定数据
HAL_K_Get:读取指定Kv数据
HAL_Ku_Del:删除指定Kv数据
HAL_Ku_Erase_All:擦除所有的 Kv 数据
多线程功能,相关 HAL 的实现:
MQTT client
初始化(iotx_mc_init):
HAL_MutexCreate
HAL_MutexDestroy
HAL_MutexLock
HAL_MutexUnlock
空函数,直接返回
未被本项目例程所需要 SDK 的子模块调用:
HAL_SemaphoreCreate
HAL_SemaphoreDestroy
HAL_SemaphorePost
HAL_SemaphoreWait
HAL_ThreadCreate
HAL_ThreadDetach
HAL_ThreadDelete
未实现
网络接口文件的适配:
(蓝色部分完全来自 st)
utils_net.c
iot_HAL_TCP_stm32.c
iot_HAL_TLs_mbedtls.c
mbedtls_net.c
wifi.c
emw3080.c
emw3080_io.c
MQTT,相关 API:
IOT_MQTT_CheckStateNormal:获取当前 MQTT 的连接状态
IOT_MQTT_Publish:向指定 topic 推送消息
IOT_MQTT_Publish_Simple:
IOT_MQTT_Subscribe:向云端订阅指定的 MQTT Topic
IOT_MQTT_Subscribe_Sync:
IOT_MQTT_Unsubscribe:向云端取消订阅指定的 topic
IOT_MQTT_Yield:接收网络报文消息并分发到用户的回调函数中
IOT_MQTT_Destroy:销毁指定 MQTT 连接并释放资源
1.设备认证
2.初始化 MQTT 参数
3.根据参数构建 MQTT 客户端实例
4.订阅业务关心的消息主题
5.发布业务关心的消息主题
6.等待消息的到来并处理