1.4.4.3 HeyThings_RTOS_SDK静态库开发说明
本文是关于使用HeyThings WiFi RTOS SDK静态库进行开发的说明指南。开发者可以在自己熟悉的芯片平台上把HeyThings提供的WiFi SDK静态库(libiot_wifi_sdk.a)嵌入到自己的应用程序中,实现在不改变开发者原有代码框架的情况下通过HeyThings SDK的接口接入HeyThings云平台。
[toc]
前提条件
使用HeyThings的WiFi SDK需要满足以下前提条件:
- HeyThings已为对应芯片平台推出SDK静态库
- 开发者已非常熟练对应芯片平台的开发调试
- 对应芯片平台具备以下功能 - 支持多线程及线程锁 - 具备TCP/IP协议栈 - 能够进行数据保存读写 - 具备WiFi完整功能接口 - 支持远程OTA功能
下面的开发说明将在以上的前提条件下基于ESP32芯片平台进行阐述,并在esp-idf/examples/get-started/hello_world例程的基础上进行相关代码说明。
链接静态库
- 拷贝esp-idf的hello_world到工作目录,并对其源码文件hello_world_main.c进行最简化裁剪:
/* Hello World Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void app_main()
{
while(1) {
printf("Hello world!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
- 修改编译系统的Makefile或者CMakelists.txt文件,链接静态库
拷贝WiFi SDK静态库libiot_wifi_sdk.a文件及API接口声明iot_api.h头文件到main文件夹下,并修改当前文件夹下的编译控制文件来链接到编译系统中。
对传统gnu make的Makefile,增加以下内容:
COMPONENT_ADD_LDFLAGS += $(COMPONENT_PATH)/libiot_wifi_sdk.a
对cmake的CMakelists.txt文件,增加以下内容:
target_link_libraries(${COMPONENT_TARGET} ${COMPONENT_PATH}/libiot_wifi_sdk.a)
对应以上的gnu make或者cmake,实际使用时二选一即可。
初始化SDK
分区表及SDK配置
在ESP32平台,WiFi SDK需要使用其flash存储及加密库等,因此会涉及分区表和esp-idf的相关配置。HeyThings将提供WiFi SDK对应需要的分区表iot_partition.csv和sdkconfig文件。
添加初始化源码
- 入口函数中创建WiFi SDK独立线程
/**
* @brief iot wifi sdk exclusive task thread
* @param pvParameter [task param]
*/
static void iot_wifi_sdk_task(void* pvParameter)
{
ESP_LOGI(TAG, "Init iot wifi sdk !");
// This function call will not return
iot_sdk_start(&sdk_callback_handler, dev_odos_flag, secert_mode, &g_dev_info);
}
/**
* @brief ESP32 application layer entrance
*/
void app_main()
{
xTaskCreate(&iot_wifi_sdk_task, "iot sdk", 16 * 1024, NULL, 6, NULL);
// user's initialization code
while(1) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
HeyThings WiFi SDK需要独立占用一个线程进行运行,在如上的ESP32入口函数app_main()
中为SDK创建了一个线程iot_wifi_sdk_task()
,然后在该线程中调用WiFi SDK的初始化函数iot_sdk_start()
。
- 配置初始化参数
iot_sdk_start()
有4个输入参数,用于配置SDK的设备基础信息、加密运行模式及对业务应用层的回调。
user_handler参数
该参数用于向SDK传递应用层的函数指针,实现SDK需要移交数据给业务应用层处理时进行回调,如控制业务命令、应用事件回调、SDK初始化完成回调等。
/** * @brief SDK unified callback function handler */ static oc_handler_t sdk_callback_handler = { .signal_event_loop = signal_event_loop, .cmd_handle = demo_handle_cmd, .event_handle = demo_handle_user_event, .init_complete_cb = demo_sdk_init_complete_callback };
odos参数
该参数用于向SDK传递当前设备是使用哪种加密类型,一型一密还是一机一密。
int dev_odos_flag = 1; //True means it is one device one secert
secert_mode参数
该参数用于向SDK传递当前设备是否需要使用pin码进行绑定。
DEV_SECERT_MODE_T secert_mode = SECERT_PIN;
p_dev_info参数
该参数用于向SDK传递当前的设备基础信息,如设备pid、cid、版本等。
/** * @brief hardcode info of this module */ iot_dev_info_t g_dev_info = { .pid = "xxxx", .cid = "xxxxxxxx", .manufacture = "oppo", .brand = "zhimei", .model = "F001", .connect_type = HW_WIFI, .hw_version = "1.0.0" };
业务应用开发
完成了SDK的初始化后,整个工程就可以编译出一个基础的不带具体业务应用功能的SDK demo,可继续在此基础上进行业务功能的开发。