【Clion开发】【一】阿里云物联网平台使用之M61开发板移植CLinkSDK

[复制链接]
查看690 | 回复6 | 2024-1-23 10:28:49 | 显示全部楼层 |阅读模式
本帖最后由 wxlinus 于 2024-1-23 10:41 编辑

阿里云物联网平台是一个集成了设备接入、设备管理、数据安全通信、消息订阅、消息转发和数据服务(存储、分析、过滤、解析、集成等)等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过云端SDK调用云端API将指令下发至设备端,实现远程控制

使用C语言开发产品时,您可使用物联网平台提供的C Link SDK,简化开发过程,使设备快速接入物联网平台。

CLinkSDK的使用说明、功能介绍和版本说明_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)

为了使用CLinkSDK我们需要把CLinkSDK移植到设备上
1、获取CLinkSDK
  • 登录物联网平台控制台

  • 进入SDK定制页面。



    • 在实例概览页签的全部环境下,找到对应的实例,单击实例卡片。

    • 在左侧的导航栏,单击文档与工具。

    • 在文档与工具页面的设备接入SDK区域,单击SDK定制。



  • 在SDK定制页面,根据需求配置相关参数。然后单击开始生成,完成SDK的下载



如何获取CLinkSDK4.x版本_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)

1.png
2、把下载的文件解压然后复制到安信可sdk的components下面
2.png
文件夹结构
3.png
3、在linksdk目录下新建CMakeLists.txt来配置编译设置

4.png
CMakeLists.txt
  1. sdk_generate_library()
  2. # 包含头文件
  3. sdk_add_include_directories(core)
  4. sdk_add_include_directories(core/sysdep)
  5. sdk_add_include_directories(core/utils)
  6. sdk_add_include_directories(components/data-model)

  7. # "core/*.c"
  8. sdk_library_add_sources(
  9.         core/aiot_mqtt_api.c
  10.         core/aiot_mqtt_props_api.c
  11.         core/aiot_state_api.c
  12. )
  13. # "core/utils/*.c"
  14. sdk_library_add_sources(
  15.         core/utils/core_auth.c
  16.         core/utils/core_diag.c
  17.         core/utils/core_global.c
  18.         core/utils/core_log.c
  19.         core/utils/core_sha256.c
  20.         core/utils/core_string.c
  21. )
  22. # "core/sysdep/*.c"
  23. sdk_library_add_sources(
  24.         core/sysdep/core_adapter.c
  25.         core/sysdep/core_sysdep.c
  26. )
  27. # "portfiles/aiot_port/*.c"
  28. sdk_library_add_sources(
  29.         portfiles/aiot_port/freertos_port.c

  30. )
  31. # "external/*.c"
  32. sdk_library_add_sources(
  33.         external/ali_ca_cert.c
  34. )</font>
复制代码
4、将linksdk添加到安信可sdk组件的CMakeLists.txt中
5.png
  1. sdk_add_subdirectory_ifdef(CONFIG_LINKSDK linksdk)
复制代码
5、在移植C Link SDK过程中,需要实现的系统依赖接口及说明
移植CLinkSDK中需要实现的系统依赖接口和示例_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)
以上过程可能有些复杂,但是最主要就是修改linksdk下面的freertos_port.c文件可以直接复制我修改好的文件、详细的请参考官方文档的内容
6.png
freertos_port.c
  1. /* 注意:core_sysdep_network_xxx 系列依赖函数是基于posix兼容的网络api实现的,用户应根据实际的网络接口类型进行重新适配 */
  2. //#include <stdlib.h>
  3. //#include <stddef.h>
  4. //#include <string.h>
  5. //#include <unistd.h>
  6. #include <sys/socket.h>
  7. #include <netdb.h>
  8. #include <errno.h>
  9. #include <bflb_sec_trng.h>
  10. #include "aiot_state_api.h"
  11. #include "aiot_sysdep_api.h"

  12. #include "FreeRTOS.h"
  13. #include "task.h"
  14. #include "semphr.h"

  15. /*
  16. *  CORE_SYSDEP_MBEDTLS_ENABLED 不是一个用户需要关心的编译开关
  17. *
  18. *  大多数情况下, 就保持它如下的设置即可
  19. *  只有少数时候, SDK的用户关心对接层代码的ROM尺寸, 并且也没有选择用TLS连接服务器
  20. *  那时才会出现, 将 CORE_SYSDEP_MBEDTLS_ENABLED 宏定义关闭的改动, 以减小对接尺寸
  21. *
  22. *  我们不建议去掉 #define CORE_SYSDEP_MBEDTLS_ENABLED 这行代码
  23. *  虽然物联网平台接收TCP方式的连接, 但我们不推荐这样做, TLS是更安全的通信方式
  24. *
  25. */
  26. #define CORE_SYSDEP_MBEDTLS_ENABLED

  27. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  28. #include "mbedtls/net_sockets.h"
  29. #include "mbedtls/ssl.h"
  30. #include "mbedtls/ctr_drbg.h"
  31. #include "mbedtls/debug.h"
  32. #include "mbedtls/platform.h"

  33. typedef struct {
  34.     mbedtls_net_context net_ctx;
  35.     mbedtls_ssl_context ssl_ctx;
  36.     mbedtls_ssl_config  ssl_config;
  37.     mbedtls_x509_crt    x509_server_cert;
  38.     mbedtls_x509_crt    x509_client_cert;
  39.     mbedtls_pk_context  x509_client_pk;
  40. } core_sysdep_mbedtls_t;
  41. #endif /* CORE_SYSDEP_MBEDTLS_ENABLED */

  42. typedef struct {
  43.     int fd;
  44.     core_sysdep_socket_type_t socket_type;
  45.     aiot_sysdep_network_cred_t *cred;
  46.     char *host;
  47.     uint16_t port;
  48.     uint32_t connect_timeout_ms;
  49. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  50.     core_sysdep_psk_t psk;
  51.     core_sysdep_mbedtls_t mbedtls;
  52. #endif
  53. } core_network_handle_t;


  54. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED

  55. static void *_core_mbedtls_calloc(size_t n, size_t size)
  56. {
  57.     void *buf = NULL;

  58.     if (n == 0 || size == 0) {
  59.         return NULL;
  60.     }

  61.     buf = pvPortMalloc(n * size);
  62.     if (NULL == buf) {
  63.         return NULL;
  64.     } else {
  65.         memset(buf, 0, n * size);
  66.     }
  67.     return buf;
  68. }

  69. #endif /* #ifdef CORE_SYSDEP_MBEDTLS_ENABLED */

  70. void *core_sysdep_malloc(uint32_t size, char *name)
  71. {
  72.     return pvPortMalloc(size);
  73. }

  74. void core_sysdep_free(void *ptr)
  75. {
  76.     vPortFree(ptr);
  77. }

  78. uint64_t core_sysdep_time(void)
  79. {
  80.     return (uint64_t)(xTaskGetTickCount() * portTICK_RATE_MS);
  81. }

  82. void core_sysdep_sleep(uint64_t time_ms)
  83. {
  84.     vTaskDelay(pdMS_TO_TICKS(time_ms));
  85. }

  86. void *core_sysdep_network_init(void)
  87. {
  88.     core_network_handle_t *handle = NULL;

  89.     handle = pvPortMalloc(sizeof(core_network_handle_t));
  90.     if (handle == NULL) {
  91.         return NULL;
  92.     }
  93.     memset(handle, 0, sizeof(core_network_handle_t));

  94.     return handle;
  95. }

  96. int32_t core_sysdep_network_setopt(void *handle, core_sysdep_network_option_t option, void *data)
  97. {
  98.     core_network_handle_t *network_handle = (core_network_handle_t *)handle;

  99.     if (handle == NULL || data == NULL) {
  100.         return STATE_PORT_INPUT_NULL_POINTER;
  101.     }

  102.     if (option >= CORE_SYSDEP_NETWORK_MAX) {
  103.         return STATE_PORT_INPUT_OUT_RANGE;
  104.     }

  105.     switch (option) {
  106.         case CORE_SYSDEP_NETWORK_SOCKET_TYPE: {
  107.             network_handle->socket_type = *(core_sysdep_socket_type_t *)data;
  108.         }
  109.             break;
  110.         case CORE_SYSDEP_NETWORK_HOST: {
  111.             network_handle->host = pvPortMalloc(strlen(data) + 1);
  112.             if (network_handle->host == NULL) {
  113.                 printf("malloc failed\n");
  114.                 return STATE_PORT_MALLOC_FAILED;
  115.             }
  116.             memset(network_handle->host, 0, strlen(data) + 1);
  117.             memcpy(network_handle->host, data, strlen(data));
  118.         }
  119.             break;
  120.         case CORE_SYSDEP_NETWORK_PORT: {
  121.             network_handle->port = *(uint16_t *)data;
  122.         }
  123.             break;
  124.         case CORE_SYSDEP_NETWORK_CONNECT_TIMEOUT_MS: {
  125.             network_handle->connect_timeout_ms = *(uint32_t *)data;
  126.         }
  127.             break;
  128. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  129.         case CORE_SYSDEP_NETWORK_CRED: {
  130.             network_handle->cred = pvPortMalloc(sizeof(aiot_sysdep_network_cred_t));
  131.             if (network_handle->cred == NULL) {
  132.                 printf("malloc failed\n");
  133.                 return STATE_PORT_MALLOC_FAILED;
  134.             }
  135.             memset(network_handle->cred, 0, sizeof(aiot_sysdep_network_cred_t));
  136.             memcpy(network_handle->cred, data, sizeof(aiot_sysdep_network_cred_t));
  137.         }
  138.             break;
  139.         case CORE_SYSDEP_NETWORK_PSK: {
  140.             core_sysdep_psk_t *psk = (core_sysdep_psk_t *)data;
  141.             network_handle->psk.psk_id = pvPortMalloc(strlen(psk->psk_id) + 1);
  142.             if (network_handle->psk.psk_id == NULL) {
  143.                 printf("malloc failed\n");
  144.                 return STATE_PORT_MALLOC_FAILED;
  145.             }
  146.             memset(network_handle->psk.psk_id, 0, strlen(psk->psk_id) + 1);
  147.             memcpy(network_handle->psk.psk_id, psk->psk_id, strlen(psk->psk_id));
  148.             network_handle->psk.psk = pvPortMalloc(strlen(psk->psk) + 1);
  149.             if (network_handle->psk.psk == NULL) {
  150.                 vPortFree(network_handle->psk.psk_id);
  151.                 printf("malloc failed\n");
  152.                 return STATE_PORT_MALLOC_FAILED;
  153.             }
  154.             memset(network_handle->psk.psk, 0, strlen(psk->psk) + 1);
  155.             memcpy(network_handle->psk.psk, psk->psk, strlen(psk->psk));
  156.         }
  157.             break;
  158. #endif
  159.         default: {
  160.             printf("unknown option\n");
  161.         }
  162.     }

  163.     return STATE_SUCCESS;
  164. }

  165. static int32_t _core_sysdep_network_tcp_establish(core_network_handle_t *network_handle)
  166. {
  167.     int32_t res = STATE_SUCCESS, fd = 0;
  168.     char service[6] = {0};
  169.     struct addrinfo hints;
  170.     struct addrinfo *addrInfoList = NULL, *pos = NULL;

  171.     memset(&hints, 0, sizeof(struct addrinfo));
  172.     hints.ai_family = AF_INET; /* only IPv4 */
  173.     hints.ai_socktype = SOCK_STREAM;
  174.     hints.ai_protocol = IPPROTO_TCP;
  175.     hints.ai_flags = 0;
  176.     sprintf(service, "%u", network_handle->port);

  177.     printf("establish tcp connection with server(host='%s', port=[%u])\n", network_handle->host, network_handle->port);

  178.     res = getaddrinfo(network_handle->host, service, &hints, &addrInfoList);
  179.     if (res != 0) {
  180.         printf("getaddrinfo error, errno: %d, host: %s, port: %s\n", errno, network_handle->host, service);
  181.         return STATE_PORT_NETWORK_DNS_FAILED;
  182.     }

  183.     for (pos = addrInfoList; pos != NULL; pos = pos->ai_next) {
  184.         if (pos->ai_family != AF_INET) {
  185.             printf("socket type error\n");
  186.             res = -1;
  187.             continue;
  188.         }

  189.         fd = socket(pos->ai_family, pos->ai_socktype, pos->ai_protocol);
  190.         if (fd < 0) {
  191.             printf("create socket error\n");
  192.             res = -1;
  193.             continue;
  194.         }

  195.         if (connect(fd, pos->ai_addr, pos->ai_addrlen) == 0) {
  196.             network_handle->fd = fd;
  197.             res = STATE_SUCCESS;
  198.             break;
  199.         }

  200.         close(fd);
  201.         printf("connect error, errno: %d\n", errno);
  202.     }

  203.     if (res < 0) {
  204.         printf("fail to establish tcp\n");
  205.         res = STATE_PORT_NETWORK_CONNECT_FAILED;
  206.     } else {
  207.         printf("success to establish tcp, fd=%d\n", network_handle->fd);
  208.         res = STATE_SUCCESS;
  209.     }
  210.     freeaddrinfo(addrInfoList);

  211.     return res;
  212. }

  213. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  214. static void _port_uint2str(uint16_t input, char *output)
  215. {
  216.     uint8_t i = 0, j = 0;
  217.     char temp[6] = {0};

  218.     do {
  219.         temp[i++] = input % 10 + '0';
  220.     } while ((input /= 10) > 0);

  221.     do {
  222.         output[--i] = temp[j++];
  223.     } while (i > 0);
  224. }

  225. void core_sysdep_rand(uint8_t *output, uint32_t output_len);
  226. static int _mbedtls_random(void *handle, unsigned char *output, size_t output_len)
  227. {
  228.     core_sysdep_rand(output, output_len);
  229.     return 0;
  230. }

  231. static void _mbedtls_debug(void *ctx, int level, const char *file, int line, const char *str)
  232. {
  233.     ((void) level);
  234.     if (NULL != ctx) {
  235.         printf("%s\n", str);
  236.     }
  237. }

  238. static int32_t _core_sysdep_network_mbedtls_establish(core_network_handle_t *network_handle)
  239. {
  240.     int32_t res = 0;
  241.     char port_str[6] = {0};

  242. #if defined(MBEDTLS_DEBUG_C)
  243.     mbedtls_debug_set_threshold(0);
  244. #endif /* #if defined(MBEDTLS_DEBUG_C) */
  245.     mbedtls_net_init(&network_handle->mbedtls.net_ctx);
  246.     mbedtls_ssl_init(&network_handle->mbedtls.ssl_ctx);
  247.     mbedtls_ssl_config_init(&network_handle->mbedtls.ssl_config);
  248.     mbedtls_platform_set_calloc_free(_core_mbedtls_calloc, free);

  249.     if (network_handle->cred->max_tls_fragment == 0) {
  250.         printf("invalid max_tls_fragment parameter\n");
  251.         return STATE_PORT_TLS_INVALID_MAX_FRAGMENT;
  252.     }

  253.     printf("establish mbedtls connection with server(host='%s', port=[%u])\n", network_handle->host, network_handle->port);

  254.     _port_uint2str(network_handle->port, port_str);

  255.     if (network_handle->cred->max_tls_fragment <= 512) {
  256.         res = mbedtls_ssl_conf_max_frag_len(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_MAX_FRAG_LEN_512);
  257.     } else if (network_handle->cred->max_tls_fragment <= 1024) {
  258.         res = mbedtls_ssl_conf_max_frag_len(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_MAX_FRAG_LEN_1024);
  259.     } else if (network_handle->cred->max_tls_fragment <= 2048) {
  260.         res = mbedtls_ssl_conf_max_frag_len(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_MAX_FRAG_LEN_2048);
  261.     } else if (network_handle->cred->max_tls_fragment <= 4096) {
  262.         res = mbedtls_ssl_conf_max_frag_len(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_MAX_FRAG_LEN_4096);
  263.     } else {
  264.         res = mbedtls_ssl_conf_max_frag_len(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_MAX_FRAG_LEN_NONE);
  265.     }

  266.     if (res < 0) {
  267.         printf("mbedtls_ssl_conf_max_frag_len error, res: -0x%04X\n", -res);
  268.         return res;
  269.     }

  270.     res = mbedtls_net_connect(&network_handle->mbedtls.net_ctx, network_handle->host, port_str, MBEDTLS_NET_PROTO_TCP);
  271.     if (res < 0) {
  272.         printf("mbedtls_net_connect error, res: -0x%04X\n", -res);
  273.         if (res == MBEDTLS_ERR_NET_UNKNOWN_HOST) {
  274.             res = STATE_PORT_NETWORK_DNS_FAILED;
  275.         } else if (res == MBEDTLS_ERR_NET_SOCKET_FAILED) {
  276.             res = STATE_PORT_TLS_SOCKET_CREATE_FAILED;
  277.         } else if (res == MBEDTLS_ERR_NET_CONNECT_FAILED) {
  278.             res = STATE_PORT_TLS_SOCKET_CONNECT_FAILED;
  279.         }
  280.         return res;
  281.     }

  282.     res = mbedtls_ssl_config_defaults(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_IS_CLIENT,
  283.                                       MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);
  284.     if (res < 0) {
  285.         printf("mbedtls_ssl_config_defaults error, res: -0x%04X\n", -res);
  286.         return res;
  287.     }

  288.     mbedtls_ssl_conf_max_version(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_MAJOR_VERSION_3,
  289.                                  MBEDTLS_SSL_MINOR_VERSION_3);
  290.     mbedtls_ssl_conf_min_version(&network_handle->mbedtls.ssl_config, MBEDTLS_SSL_MAJOR_VERSION_3,
  291.                                  MBEDTLS_SSL_MINOR_VERSION_3);
  292.     mbedtls_ssl_conf_rng(&network_handle->mbedtls.ssl_config, _mbedtls_random, NULL);
  293.     mbedtls_ssl_conf_dbg(&network_handle->mbedtls.ssl_config, _mbedtls_debug, stdout);

  294.     if (network_handle->cred->option == AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA) {
  295.         static const int ciphersuites[1] = {MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256};
  296.         mbedtls_ssl_conf_ciphersuites(&network_handle->mbedtls.ssl_config, ciphersuites);

  297.         if (network_handle->cred->x509_server_cert == NULL && network_handle->cred->x509_server_cert_len == 0) {
  298.             printf("invalid x509 server cert\n");
  299.             return STATE_PORT_TLS_INVALID_SERVER_CERT;
  300.         }
  301.         mbedtls_x509_crt_init(&network_handle->mbedtls.x509_server_cert);

  302.         res = mbedtls_x509_crt_parse(&network_handle->mbedtls.x509_server_cert,
  303.                                      (const unsigned char *)network_handle->cred->x509_server_cert, (size_t)network_handle->cred->x509_server_cert_len + 1);
  304.         if (res < 0) {
  305.             printf("mbedtls_x509_crt_parse server cert error, res: -0x%04X\n", -res);
  306.             return STATE_PORT_TLS_INVALID_SERVER_CERT;
  307.         }

  308.         if (network_handle->cred->x509_client_cert != NULL && network_handle->cred->x509_client_cert_len > 0 &&
  309.             network_handle->cred->x509_client_privkey != NULL && network_handle->cred->x509_client_privkey_len > 0) {
  310.             mbedtls_x509_crt_init(&network_handle->mbedtls.x509_client_cert);
  311.             mbedtls_pk_init(&network_handle->mbedtls.x509_client_pk);
  312.             res = mbedtls_x509_crt_parse(&network_handle->mbedtls.x509_client_cert,
  313.                                          (const unsigned char *)network_handle->cred->x509_client_cert, (size_t)network_handle->cred->x509_client_cert_len + 1);
  314.             if (res < 0) {
  315.                 printf("mbedtls_x509_crt_parse client cert error, res: -0x%04X\n", -res);
  316.                 return STATE_PORT_TLS_INVALID_CLIENT_CERT;
  317.             }
  318.             res = mbedtls_pk_parse_key(&network_handle->mbedtls.x509_client_pk,
  319.                                        (const unsigned char *)network_handle->cred->x509_client_privkey,
  320.                                        (size_t)network_handle->cred->x509_client_privkey_len + 1, NULL, 0);
  321.             if (res < 0) {
  322.                 printf("mbedtls_pk_parse_key client pk error, res: -0x%04X\n", -res);
  323.                 return STATE_PORT_TLS_INVALID_CLIENT_KEY;
  324.             }
  325.             res = mbedtls_ssl_conf_own_cert(&network_handle->mbedtls.ssl_config, &network_handle->mbedtls.x509_client_cert,
  326.                                             &network_handle->mbedtls.x509_client_pk);
  327.             if (res < 0) {
  328.                 printf("mbedtls_ssl_conf_own_cert error, res: -0x%04X\n", -res);
  329.                 return STATE_PORT_TLS_INVALID_CLIENT_CERT;
  330.             }
  331.         }
  332.         mbedtls_ssl_conf_ca_chain(&network_handle->mbedtls.ssl_config, &network_handle->mbedtls.x509_server_cert, NULL);
  333.     } else if (network_handle->cred->option == AIOT_SYSDEP_NETWORK_CRED_SVRCERT_PSK) {
  334. #if 0
  335.         static const int ciphersuites[1] = {MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA};
  336.         res = mbedtls_ssl_conf_psk(&network_handle->mbedtls.ssl_config,
  337.                                    (const unsigned char *)network_handle->psk.psk, (size_t)strlen(network_handle->psk.psk),
  338.                                    (const unsigned char *)network_handle->psk.psk_id, (size_t)strlen(network_handle->psk.psk_id));
  339.         if (res < 0) {
  340.             printf("mbedtls_ssl_conf_psk error, res = -0x%04X\n", -res);
  341.             return STATE_PORT_TLS_CONFIG_PSK_FAILED;
  342.         }

  343.         mbedtls_ssl_conf_ciphersuites(&network_handle->mbedtls.ssl_config, ciphersuites);
  344. #endif
  345.         return STATE_PORT_TLS_CONFIG_PSK_FAILED;
  346.     } else {
  347.         printf("unsupported security option\n");
  348.         return STATE_PORT_TLS_INVALID_CRED_OPTION;
  349.     }

  350.     res = mbedtls_ssl_setup(&network_handle->mbedtls.ssl_ctx, &network_handle->mbedtls.ssl_config);
  351.     if (res < 0) {
  352.         printf("mbedtls_ssl_setup error, res: -0x%04X\n", -res);
  353.         return res;
  354.     }

  355.     mbedtls_ssl_set_bio(&network_handle->mbedtls.ssl_ctx, &network_handle->mbedtls.net_ctx, mbedtls_net_send,
  356.                         mbedtls_net_recv, mbedtls_net_recv_timeout);
  357.     mbedtls_ssl_conf_read_timeout(&network_handle->mbedtls.ssl_config, network_handle->connect_timeout_ms);

  358.     while ((res = mbedtls_ssl_handshake(&network_handle->mbedtls.ssl_ctx)) != 0) {
  359.         if ((res != MBEDTLS_ERR_SSL_WANT_READ) && (res != MBEDTLS_ERR_SSL_WANT_WRITE)) {
  360.             printf("mbedtls_ssl_handshake error, res: -0x%04X\n", -res);
  361.             if (res == MBEDTLS_ERR_SSL_INVALID_RECORD) {
  362.                 res = STATE_PORT_TLS_INVALID_RECORD;
  363.             } else {
  364.                 res = STATE_PORT_TLS_INVALID_HANDSHAKE;
  365.             }
  366.             return res;
  367.         }
  368.     }

  369.     res = mbedtls_ssl_get_verify_result(&network_handle->mbedtls.ssl_ctx);
  370.     if (res < 0) {
  371.         printf("mbedtls_ssl_get_verify_result error, res: -0x%04X\n", -res);
  372.         return res;
  373.     }
  374.     return 0;
  375. }
  376. #endif /* #ifdef CORE_SYSDEP_MBEDTLS_ENABLED */

  377. int32_t core_sysdep_network_establish(void *handle)
  378. {
  379.     core_network_handle_t *network_handle = (core_network_handle_t *)handle;

  380.     if (handle == NULL) {
  381.         return STATE_PORT_INPUT_NULL_POINTER;
  382.     }

  383.     if (network_handle->socket_type == CORE_SYSDEP_SOCKET_TCP_CLIENT) {
  384.         if (network_handle->host == NULL) {
  385.             return STATE_PORT_MISSING_HOST;
  386.         }
  387.         if (network_handle->cred == NULL) {
  388.             return _core_sysdep_network_tcp_establish(network_handle);
  389.         } else {
  390.             if (network_handle->cred->option == AIOT_SYSDEP_NETWORK_CRED_NONE) {
  391.                 return _core_sysdep_network_tcp_establish(network_handle);
  392.             }
  393. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  394.             else {
  395.                 return _core_sysdep_network_mbedtls_establish(network_handle);
  396.             }
  397. #endif
  398.         }

  399.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_TCP_SERVER) {
  400.         return STATE_PORT_TCP_SERVER_NOT_IMPLEMENT;
  401.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_UDP_CLIENT) {
  402.         return STATE_PORT_UDP_CLIENT_NOT_IMPLEMENT;
  403.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_UDP_SERVER) {
  404.         return STATE_PORT_UDP_SERVER_NOT_IMPLEMENT;
  405.     }

  406.     printf("unknown nwk type or tcp host absent\n");

  407.     return STATE_PORT_NETWORK_UNKNOWN_SOCKET_TYPE;
  408. }

  409. static int32_t _core_sysdep_network_tcp_recv(core_network_handle_t *network_handle, uint8_t *buffer, uint32_t len,
  410.                                              uint32_t timeout_ms)
  411. {
  412.     int res = 0;
  413.     int32_t recv_bytes = 0;
  414.     ssize_t recv_res = 0;
  415.     uint64_t timestart_ms = 0, timenow_ms = 0, timeselect_ms = 0;
  416.     fd_set recv_sets;
  417.     struct timeval timeselect;

  418.     FD_ZERO(&recv_sets);
  419.     FD_SET(network_handle->fd, &recv_sets);

  420.     /* Start Time */
  421.     timestart_ms = core_sysdep_time();
  422.     timenow_ms = timestart_ms;

  423.     do {
  424.         timenow_ms = core_sysdep_time();

  425.         if (timenow_ms - timestart_ms >= timenow_ms ||
  426.             timeout_ms - (timenow_ms - timestart_ms) > timeout_ms) {
  427.             break;
  428.         }

  429.         timeselect_ms = timeout_ms - (timenow_ms - timestart_ms);
  430.         timeselect.tv_sec = timeselect_ms / 1000;
  431.         timeselect.tv_usec = timeselect_ms % 1000 * 1000;

  432.         res = select(network_handle->fd + 1, &recv_sets, NULL, NULL, &timeselect);
  433.         if (res == 0) {
  434.             /* printf("_core_sysdep_network_tcp_recv, nwk select timeout\n"); */
  435.             continue;
  436.         } else if (res < 0) {
  437.             printf("_core_sysdep_network_tcp_recv, errno: %d\n", errno);
  438.             perror("_core_sysdep_network_tcp_recv, nwk select failed: ");
  439.             return STATE_PORT_NETWORK_SELECT_FAILED;
  440.         } else {
  441.             if (FD_ISSET(network_handle->fd, &recv_sets)) {
  442.                 recv_res = recv(network_handle->fd, buffer + recv_bytes, len - recv_bytes, 0);
  443.                 if (recv_res == 0) {
  444.                     printf("_core_sysdep_network_tcp_recv, nwk connection closed\n");
  445.                     return STATE_PORT_NETWORK_RECV_CONNECTION_CLOSED;
  446.                 } else if (recv_res < 0) {
  447.                     printf("_core_sysdep_network_tcp_recv, errno: %d\n", errno);
  448.                     perror("_core_sysdep_network_tcp_recv, nwk recv error: ");
  449.                     if (errno == EINTR) {
  450.                         continue;
  451.                     }
  452.                     return STATE_PORT_NETWORK_RECV_FAILED;
  453.                 } else {
  454.                     recv_bytes += recv_res;
  455.                     /* printf("recv_bytes: %d, len: %d\n",recv_bytes,len); */
  456.                     if (recv_bytes == len) {
  457.                         break;
  458.                     }
  459.                 }
  460.             }
  461.         }
  462.     } while (((timenow_ms - timestart_ms) < timeout_ms) && (recv_bytes < len));

  463.     /* printf("%s: recv over\n",__FUNCTION__); */
  464.     return recv_bytes;
  465. }

  466. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  467. static int32_t _core_sysdep_network_mbedtls_recv(core_network_handle_t *network_handle, uint8_t *buffer, uint32_t len,
  468.                                                  uint32_t timeout_ms)
  469. {
  470.     int res = 0;
  471.     int32_t recv_bytes = 0;

  472.     mbedtls_ssl_conf_read_timeout(&network_handle->mbedtls.ssl_config, timeout_ms);
  473.     do {
  474.         res = mbedtls_ssl_read(&network_handle->mbedtls.ssl_ctx, buffer + recv_bytes, len - recv_bytes);
  475.         if (res < 0) {
  476.             if (res == MBEDTLS_ERR_SSL_TIMEOUT) {
  477.                 break;
  478.             } else if (res != MBEDTLS_ERR_SSL_WANT_READ &&
  479.                        res != MBEDTLS_ERR_SSL_WANT_WRITE &&
  480.                        res != MBEDTLS_ERR_SSL_CLIENT_RECONNECT) {
  481.                 if (recv_bytes == 0) {
  482.                     printf("mbedtls_ssl_recv error, res: -0x%04X\n", -res);
  483.                     if (res == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
  484.                         return STATE_PORT_TLS_RECV_CONNECTION_CLOSED;
  485.                     } else if (res == MBEDTLS_ERR_SSL_INVALID_RECORD) {
  486.                         return STATE_PORT_TLS_INVALID_RECORD;
  487.                     } else {
  488.                         return STATE_PORT_TLS_RECV_FAILED;
  489.                     }
  490.                 }
  491.                 break;
  492.             }
  493.         } else if (res == 0) {
  494.             break;
  495.         } else {
  496.             recv_bytes += res;
  497.         }
  498.     } while (recv_bytes < len);

  499.     return recv_bytes;
  500. }
  501. #endif /* #ifdef CORE_SYSDEP_MBEDTLS_ENABLED */

  502. int32_t core_sysdep_network_recv(void *handle, uint8_t *buffer, uint32_t len, uint32_t timeout_ms,
  503.                                  core_sysdep_addr_t *addr)
  504. {
  505.     core_network_handle_t *network_handle = (core_network_handle_t *)handle;

  506.     if (handle == NULL || buffer == NULL) {
  507.         return STATE_PORT_INPUT_NULL_POINTER;
  508.     }

  509.     if (len == 0 || timeout_ms == 0) {
  510.         return STATE_PORT_INPUT_OUT_RANGE;
  511.     }

  512.     if (network_handle->socket_type == CORE_SYSDEP_SOCKET_TCP_CLIENT) {
  513.         if (network_handle->cred == NULL) {
  514.             return _core_sysdep_network_tcp_recv(network_handle, buffer, len, timeout_ms);
  515.         } else {
  516.             if (network_handle->cred->option == AIOT_SYSDEP_NETWORK_CRED_NONE) {
  517.                 return _core_sysdep_network_tcp_recv(network_handle, buffer, len, timeout_ms);
  518.             }
  519. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  520.             else {
  521.                 return _core_sysdep_network_mbedtls_recv(network_handle, buffer, len, timeout_ms);
  522.             }
  523. #endif
  524.         }
  525.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_TCP_SERVER) {
  526.         return STATE_PORT_TCP_SERVER_NOT_IMPLEMENT;
  527.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_UDP_CLIENT) {
  528.         return STATE_PORT_UDP_CLIENT_NOT_IMPLEMENT;
  529.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_UDP_SERVER) {
  530.         return STATE_PORT_UDP_SERVER_NOT_IMPLEMENT;
  531.     }

  532.     printf("unknown nwk type\n");

  533.     return STATE_PORT_NETWORK_UNKNOWN_SOCKET_TYPE;
  534. }

  535. int32_t _core_sysdep_network_tcp_send(core_network_handle_t *network_handle, uint8_t *buffer, uint32_t len,
  536.                                       uint32_t timeout_ms)
  537. {
  538.     int res = 0;
  539.     int32_t send_bytes = 0;
  540.     ssize_t send_res = 0;
  541.     uint64_t timestart_ms = 0, timenow_ms = 0, timeselect_ms = 0;
  542.     fd_set send_sets;
  543.     struct timeval timeselect;

  544.     FD_ZERO(&send_sets);
  545.     FD_SET(network_handle->fd, &send_sets);

  546.     /* Start Time */
  547.     timestart_ms = core_sysdep_time();
  548.     timenow_ms = timestart_ms;

  549.     do {
  550.         timenow_ms = core_sysdep_time();

  551.         if (timenow_ms - timestart_ms >= timenow_ms ||
  552.             timeout_ms - (timenow_ms - timestart_ms) > timeout_ms) {
  553.             break;
  554.         }

  555.         timeselect_ms = timeout_ms - (timenow_ms - timestart_ms);
  556.         timeselect.tv_sec = timeselect_ms / 1000;
  557.         timeselect.tv_usec = timeselect_ms % 1000 * 1000;

  558.         res = select(network_handle->fd + 1, NULL, &send_sets, NULL, &timeselect);
  559.         if (res == 0) {
  560.             printf("_core_sysdep_network_tcp_send, nwk select timeout\n");
  561.             continue;
  562.         } else if (res < 0) {
  563.             printf("_core_sysdep_network_tcp_send, errno: %d\n", errno);
  564.             perror("_core_sysdep_network_tcp_send, nwk select failed: ");
  565.             return STATE_PORT_NETWORK_SELECT_FAILED;
  566.         } else {
  567.             if (FD_ISSET(network_handle->fd, &send_sets)) {
  568.                 send_res = send(network_handle->fd, buffer + send_bytes, len - send_bytes, 0);
  569.                 if (send_res == 0) {
  570.                     printf("_core_sysdep_network_tcp_send, nwk connection closed\n");
  571.                     return STATE_PORT_NETWORK_SEND_CONNECTION_CLOSED;
  572.                 } else if (send_res < 0) {
  573.                     printf("_core_sysdep_network_tcp_send, errno: %d\n", errno);
  574.                     perror("_core_sysdep_network_tcp_send, nwk recv error: ");
  575.                     if (errno == EINTR) {
  576.                         continue;
  577.                     }
  578.                     return STATE_PORT_NETWORK_SEND_FAILED;
  579.                 } else {
  580.                     send_bytes += send_res;
  581.                     if (send_bytes == len) {
  582.                         break;
  583.                     }
  584.                 }
  585.             }
  586.         }
  587.     } while (((timenow_ms - timestart_ms) < timeout_ms) && (send_bytes < len));

  588.     return send_bytes;
  589. }

  590. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  591. int32_t _core_sysdep_network_mbedtls_send(core_network_handle_t *network_handle, uint8_t *buffer, uint32_t len,
  592.                                           uint32_t timeout_ms)
  593. {
  594.     int32_t res = 0;
  595.     int32_t send_bytes = 0;
  596.     uint64_t timestart_ms = 0, timenow_ms = 0;
  597.     struct timeval timeout;

  598.     /* timeout */
  599.     timeout.tv_sec = timeout_ms / 1000;
  600.     timeout.tv_usec = (timeout_ms % 1000) * 1000;

  601.     /* Start Time */
  602.     timestart_ms = core_sysdep_time();
  603.     timenow_ms = timestart_ms;

  604.     res = setsockopt(network_handle->mbedtls.net_ctx.fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
  605.     if (res < 0) {
  606.         printf("setsockopt error, errno: %d\r\n", errno);
  607.         return STATE_PORT_TLS_SEND_FAILED;
  608.     }

  609.     do {
  610.         timenow_ms = core_sysdep_time();

  611.         if (timenow_ms - timestart_ms >= timenow_ms ||
  612.             timeout_ms - (timenow_ms - timestart_ms) > timeout_ms) {
  613.             break;
  614.         }

  615.         res = mbedtls_ssl_write(&network_handle->mbedtls.ssl_ctx, buffer + send_bytes, len - send_bytes);
  616.         if (res < 0) {
  617.             if (res != MBEDTLS_ERR_SSL_WANT_READ &&
  618.                 res != MBEDTLS_ERR_SSL_WANT_WRITE) {
  619.                 if (send_bytes == 0) {
  620.                     printf("mbedtls_ssl_send error, res: -0x%04X\n", -res);
  621.                     if (res == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
  622.                         return STATE_PORT_TLS_SEND_CONNECTION_CLOSED;
  623.                     } else if (res == MBEDTLS_ERR_SSL_INVALID_RECORD) {
  624.                         return STATE_PORT_TLS_INVALID_RECORD;
  625.                     } else {
  626.                         return STATE_PORT_TLS_SEND_FAILED;
  627.                     }
  628.                 }
  629.                 break;
  630.             }
  631.         } else if (res == 0) {
  632.             break;
  633.         } else {
  634.             send_bytes += res;
  635.         }
  636.     } while (((timenow_ms - timestart_ms) < timeout_ms) && (send_bytes < len));

  637.     return send_bytes;
  638. }
  639. #endif /* #ifdef CORE_SYSDEP_MBEDTLS_ENABLED */

  640. int32_t core_sysdep_network_send(void *handle, uint8_t *buffer, uint32_t len, uint32_t timeout_ms,
  641.                                  core_sysdep_addr_t *addr)
  642. {
  643.     core_network_handle_t *network_handle = (core_network_handle_t *)handle;

  644.     if (handle == NULL || buffer == NULL) {
  645.         printf("invalid parameter\n");
  646.         return STATE_PORT_INPUT_NULL_POINTER;
  647.     }
  648.     if (len == 0 || timeout_ms == 0) {
  649.         return STATE_PORT_INPUT_OUT_RANGE;
  650.     }

  651.     if (network_handle->socket_type == CORE_SYSDEP_SOCKET_TCP_CLIENT) {
  652.         if (network_handle->cred == NULL) {
  653.             return _core_sysdep_network_tcp_send(network_handle, buffer, len, timeout_ms);
  654.         } else {
  655.             if (network_handle->cred->option == AIOT_SYSDEP_NETWORK_CRED_NONE) {
  656.                 return _core_sysdep_network_tcp_send(network_handle, buffer, len, timeout_ms);
  657.             }
  658. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  659.             else {
  660.                 return _core_sysdep_network_mbedtls_send(network_handle, buffer, len, timeout_ms);
  661.             }
  662. #endif
  663.         }
  664.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_TCP_SERVER) {
  665.         return STATE_PORT_TCP_SERVER_NOT_IMPLEMENT;
  666.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_UDP_CLIENT) {
  667.         return STATE_PORT_UDP_CLIENT_NOT_IMPLEMENT;
  668.     } else if (network_handle->socket_type == CORE_SYSDEP_SOCKET_UDP_SERVER) {
  669.         return STATE_PORT_UDP_SERVER_NOT_IMPLEMENT;
  670.     }

  671.     printf("unknown nwk type\n");

  672.     return STATE_PORT_NETWORK_UNKNOWN_SOCKET_TYPE;
  673. }

  674. static void _core_sysdep_network_tcp_disconnect(core_network_handle_t *network_handle)
  675. {
  676.     shutdown(network_handle->fd, 2);
  677.     close(network_handle->fd);
  678. }

  679. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  680. static void _core_sysdep_network_mbedtls_disconnect(core_network_handle_t *network_handle)
  681. {
  682.     mbedtls_ssl_close_notify(&network_handle->mbedtls.ssl_ctx);
  683.     mbedtls_net_free(&network_handle->mbedtls.net_ctx);
  684.     if (network_handle->cred->option == AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA) {
  685.         mbedtls_x509_crt_free(&network_handle->mbedtls.x509_server_cert);
  686.         mbedtls_x509_crt_free(&network_handle->mbedtls.x509_client_cert);
  687.         mbedtls_pk_free(&network_handle->mbedtls.x509_client_pk);
  688.     }
  689.     mbedtls_ssl_free(&network_handle->mbedtls.ssl_ctx);
  690.     mbedtls_ssl_config_free(&network_handle->mbedtls.ssl_config);
  691. }
  692. #endif /* #ifdef CORE_SYSDEP_MBEDTLS_ENABLED */

  693. int32_t core_sysdep_network_deinit(void **handle)
  694. {
  695.     core_network_handle_t *network_handle = NULL;

  696.     if (handle == NULL || *handle == NULL) {
  697.         return STATE_PORT_INPUT_NULL_POINTER;
  698.     }

  699.     network_handle = *(core_network_handle_t **)handle;

  700.     /* Shutdown both send and receive operations. */
  701.     if (network_handle->socket_type == 0 && network_handle->host != NULL) {
  702.         if (network_handle->cred == NULL) {
  703.             _core_sysdep_network_tcp_disconnect(network_handle);
  704.         } else {
  705.             if (network_handle->cred->option == AIOT_SYSDEP_NETWORK_CRED_NONE) {
  706.                 _core_sysdep_network_tcp_disconnect(network_handle);
  707.             }
  708. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  709.             else {
  710.                 _core_sysdep_network_mbedtls_disconnect(network_handle);
  711.             }
  712. #endif
  713.         }
  714.     }

  715.     if (network_handle->host != NULL) {
  716.         vPortFree(network_handle->host);
  717.         network_handle->host = NULL;
  718.     }
  719.     if (network_handle->cred != NULL) {
  720.         vPortFree(network_handle->cred);
  721.         network_handle->cred = NULL;
  722.     }
  723. #ifdef CORE_SYSDEP_MBEDTLS_ENABLED
  724.     if (network_handle->psk.psk_id != NULL) {
  725.         vPortFree(network_handle->psk.psk_id);
  726.         network_handle->psk.psk_id = NULL;
  727.     }
  728.     if (network_handle->psk.psk != NULL) {
  729.         vPortFree(network_handle->psk.psk);
  730.         network_handle->psk.psk = NULL;
  731.     }
  732. #endif

  733.     vPortFree(network_handle);
  734.     *handle = NULL;

  735.     return 0;
  736. }

  737. void core_sysdep_rand(uint8_t *output, uint32_t output_len)
  738. {
  739.     /* 使用bl提供的硬件随机数生成接口, 仅适用于esp8266和esp32 */
  740.     bflb_trng_readlen(output,output_len);
  741. }

  742. void *core_sysdep_mutex_init(void)
  743. {
  744.     return xSemaphoreCreateMutex();
  745. }

  746. void core_sysdep_mutex_lock(void *mutex)
  747. {
  748.     xSemaphoreTake((SemaphoreHandle_t)mutex, portMAX_DELAY);
  749. }

  750. void core_sysdep_mutex_unlock(void *mutex)
  751. {
  752.     xSemaphoreGive((SemaphoreHandle_t)mutex);
  753. }

  754. void core_sysdep_mutex_deinit(void **mutex)
  755. {
  756.     if (mutex != NULL || *mutex != NULL) {
  757.         vSemaphoreDelete((SemaphoreHandle_t)*mutex);
  758.         *mutex = NULL;
  759.     }
  760. }

  761. aiot_sysdep_portfile_t g_aiot_sysdep_portfile = {
  762.         core_sysdep_malloc,
  763.         core_sysdep_free,
  764.         core_sysdep_time,
  765.         core_sysdep_sleep,
  766.         core_sysdep_network_init,
  767.         core_sysdep_network_setopt,
  768.         core_sysdep_network_establish,
  769.         core_sysdep_network_recv,
  770.         core_sysdep_network_send,
  771.         core_sysdep_network_deinit,
  772.         core_sysdep_rand,
  773.         core_sysdep_mutex_init,
  774.         core_sysdep_mutex_lock,
  775.         core_sysdep_mutex_unlock,
  776.         core_sysdep_mutex_deinit
  777. };
复制代码
6、项目的配置修改我这里以Project_basic为例
  • 配置proj.conf文件把linksdk包含进去

7.png
proj.conf
  1. # Aliyun c LinkSDK
  2. set(CONFIG_LINKSDK 1)
复制代码
  • 修改项目下的FreeRTOSConfig.h添加下面几行

8.png
FreeRTOSConfig.h

  1. #define posixconfigENABLE_CLOCKID_T 0
  2. #define posixconfigENABLE_MODE_T 0
  3. #define posixconfigENABLE_TIMER_T 0
  4. #define posixconfigENABLE_TIMESPEC 0
  5. #define posixconfigENABLE_ITIMERSPEC 0
复制代码
7、build一下
可以看到linksdk已经生成了

9.png
编译完成也没有报错说明移植就没有啥大问题了、有问题按照报错提示改就行
10.png
8、最后主要是进行移植验证等下一个帖子讲,内容有点多还需要整理一下、主要就是阿里云物联网平台的使用、设备端的开发、扩展组件、物模型的相关使用
相关代码已经放在gitee上面可以提前看看m61sdk: 安信可m61模组sdk移植项目 (gitee.com)
写的一般,欢迎大佬指正(#^.^#),我主要用的Clion开发的用vscode基本上也差不多
剧透一下
11.png
12.png






9.png
10.png
11.png
12.png

本帖被以下淘专辑推荐:

回复

使用道具 举报

爱笑 | 2024-1-23 10:42:32 | 显示全部楼层
优秀!不错不错
用心做好保姆工作
回复 支持 反对

使用道具 举报

1084504793 | 2024-1-23 10:47:00 | 显示全部楼层
回复

使用道具 举报

WangChong | 2024-1-23 11:22:41 | 显示全部楼层
学习了
回复

使用道具 举报

bzhou830 | 2024-1-23 13:27:52 | 显示全部楼层
选择去发光,而不是被照亮
回复

使用道具 举报

WT_0213 | 2024-1-24 09:08:25 | 显示全部楼层
点赞
回复

使用道具 举报

lazy | 2024-1-24 09:10:56 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则