esp32使用c Link SDK与阿里云物联网平台通信
1.进入sdk定制页面然后点击开始生成。
获取c link sdk
1.进入sdk定制页面


然后点击开始生成。
移植C link sdk
移植C-SDK的过程主要包括了SDK代码的导入,SDK port层文件配置和编译系统的配置。
SDK的portfiles目录已经包含了ESP32的portfile,因此您只需要导入SDK源码,配置编译系统即可完成移植工作。
移植思路
-
方法一:在
project目录中引入C-SDK,将SDK源码与您的其他app源码共同编译。 -
方法二:将C-SDK作为idf自定义组件引入到
idf的components目录中。
根据官方推荐,使用方法二。
添加CMakeLists.txt
在从link sdk目录下添加CMakeLists.txt文件:

CMakeLists.txt内容如下:
set(include_dirs core core/sysdep core/utils components/data-model )
file(GLOB c_sdk_srcs
"core/*.c"
"core/utils/*.c"
"core/sysdep/*.c"
"portfiles/aiot_port/*.c"
"external/*.c"
"components/data-model/*.c"
)
idf_component_register(SRCS ${c_sdk_srcs}
INCLUDE_DIRS "${include_dirs}"
REQUIRES mbedtls)
复制link sdk到idf安装路径components下
例如我的路径:E:\Espressif\5.3.1\Espressif\frameworks\esp-idf-v5.3.1\components\

其它修改
1. 在官方的移植demo程序中有:“您需要下载附件posix_port.c(适配了esp32),用它将$IDF_PATH/components/C-SDK/portfiles/aiot_port目录下的posix_port.c替换掉”。
而我们的aiot_port目录下只有freertos_port.c,所以无需进行此操作。
2.LinkSDK与idf中都有mbedtls库,避免引用库冲突,修改文件$IDF_PATH/components/C-SDK/core/sysdep/core_adapter.c,关闭CORE_ADAPTER_MBEDTLS_ENABLED宏定义。如下:

3.下载官方附件的station_example_main.c替代examples\wifi\getting_started\station\main下的/station_example_main.c文件,建议把examples\wifi\getting_started\station复制一份,再替换。
esp32编译配置修改
打开station工程,为了支持link sdk可能需要一些库,如下:

忘记当时如何修改的了,不过都是小事,可以根据报错信息来进行具体添加。
阿里云创建物模型

创建产品与设备

创建成功之后就会出现

接下来为产品创建设备,点击添加设备,此处的test是我新添加的设备,显示未激活,只有设备连接上才会激活。

物模型的topic
此处,我创建的产品功能为设备上报温湿度数据到阿里云物模型,和接收阿里云服务器数据进行设备属性设置,既led等的亮灭。在产品页,点击查看,进入如下界面;

其中 /sys/k22e0WCtkgb/${deviceName}/thing/event/property/post是设备要发布的主题,既温湿度数据通过此主题从边端设备到服务器。
/sys/k22e0WCtkgb/${deviceName}/thing/service/property/set是设备要订阅的主题,既设备接受来自服务器的数据,对led进行开关。
其中${deviceName}要替换为你要连接的具体的设备名称,如我创建的设备名"test"或者”esp32“.
设备三元组信息
点击设备,进入设备界面,点击设备列表中要查看的设备的查看按钮,进入如下界面。点击查看就会弹出设备的三元组信息。

产品功能属性查看

Alink json格式
设备属性上报
Topic:/sys/${productKey}/${deviceName}/thing/event/property/post
请求数据示例:
{
"id": "123",
"version": "1.0",
"sys":{
"ack":0
},
"params": {
"Power": {
"value": "on",
"time": 1524448722000
},
"WF": {
"value": 23.6,
"time": 1524448722000
}
},
"method": "thing.event.property.post"
}
其中params可简化为如下:
"params": {
"Power": "on",
"WF": 23.6
}
设置设备属性
请求topic:/sys/${productKey}/${deviceName}/thing/service/property/set
请求格式示例:
{
"id": "123",
"version": "1.0",
"params": {
"temperature": "30.5"
},
"method": "thing.service.property.set"
}
station_example_main.c修改
1. wifi名称与密码修改

如 :

2.设备三元组

3.阿里云域名
替换为你要连接的站点,如果连的是上海点,则无需修改
4.端口号修改为1883
![]()
5.link_main函数修改
订阅设备属性设置主题,接受来自服务器消息。
/* MQTT 订阅topic功能示例, 请根据自己的业务需求进行使用 */
{
char *sub_topic = "/sys/k22e0WCtkgb/esp32/thing/service/property/set";
res = aiot_mqtt_sub(mqtt_handle, sub_topic, NULL, 1, NULL);
if (res < 0) {
printf("aiot_mqtt_sub failed, res: -0x%04lX\n", -res);
return -1;
}
}
/* MQTT 发布消息功能示例, 请根据自己的业务需求进行使用 */
// {
// char *pub_topic = "/sys/k22e0WCtkgb/esp32/thing/event/property/post";
// char *pub_payload = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}";
// res = aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, strlen(pub_payload), 0);
// if (res < 0) {
// printf("aiot_mqtt_sub failed, res: -0x%04lX\n", -res);
// return -1;
// }
// }
6.修改demo_mqtt_process_thread线程,来发送温湿度数据
/* 执行aiot_mqtt_process的线程, 包含心跳发送和QoS1消息重发 */
void *demo_mqtt_process_thread(void *args)
{
int32_t res = STATE_SUCCESS;
while (g_mqtt_process_thread_running) {
res = aiot_mqtt_process(args);
{
//添加的温湿度发送代码
char *pub_topic = "/sys/k22e0WCtkgb/esp32/thing/event/property/post";
//添加数据进入json格式
cJSON*param =cJSON_GetObjectItem(mqtt_cjson.root,"params");
cJSON_ReplaceItemInObject(param,"temperature",cJSON_CreateNumber(temperature));
cJSON_ReplaceItemInObject(param,"hum", cJSON_CreateNumber(humidity));
temperature+=0.1;
humidity+=0.1;
char*pub_payload = cJSON_PrintUnformatted(mqtt_cjson.root);
// ESP_LOGI(TAG, "%s", pub_payload);
//发送数据
res = aiot_mqtt_pub(args, pub_topic, (uint8_t *)pub_payload, strlen(pub_payload), 0);
if (res < 0) {
printf("aiot_mqtt_sub failed, res: -0x%04lX\n", -res);
}
cJSON_free(pub_payload);
}
if (res == STATE_USER_INPUT_EXEC_DISABLED) {
break;
}
sleep(10);
}
return NULL;
}
7.修改接受回调函数demo_mqtt_default_recv_handler
aiot_mqtt_recv函数会调用接受回调函数demo_mqtt_default_recv_handler。
case AIOT_MQTTRECV_PUB: {
printf("pub, qos: %d, topic: %.*s\n", packet->data.pub.qos, packet->data.pub.topic_len, packet->data.pub.topic);
printf("pub, payload: %.*s\n", (int16_t)packet->data.pub.payload_len, packet->data.pub.payload);
/* TODO: 处理服务器下发的业务报文 */
if(strstr((char*)packet->data.pub.topic,"/property/set")){
//判断下发的指令是关灯还是开
if(strstr((char*)packet->data.pub.payload,"{\"LEDSwitch\":1}")){
lv_custom_set_light(1);
// lv_led_on(guider_ui.screen_1_led_1);
ESP_LOGI(TAG, "light is on");
}
else{
lv_custom_set_light(0);
// lv_led_off(guider_ui.screen_1_led_1);
ESP_LOGI(TAG, "light is off");
}
结果
编译通过,连接上wifi和服务器,就可以通过物模型接受数据。

更多推荐



所有评论(0)