获取c link sdk

阿里云官方定制c link sdk教程

其他博客参考文章

1.进入sdk定制页面

 

        然后点击开始生成。 

移植C link sdk

阿里云官方乐鑫ESP32开发板移植

移植C-SDK的过程主要包括了SDK代码的导入,SDK port层文件配置和编译系统的配置。

SDK的portfiles目录已经包含了ESP32的portfile,因此您只需要导入SDK源码,配置编译系统即可完成移植工作。

移植思路

  • 方法一:在project目录中引入C-SDK,将SDK源码与您的其他app源码共同编译。

  • 方法二:将C-SDK作为idf自定义组件引入到idfcomponents目录中。

根据官方推荐,使用方法二。

添加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格式

阿里云官方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和服务器,就可以通过物模型接受数据。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐