[嵌入式Linux] 嵌入式Linux单板连接飞燕物联网平台

[复制链接]
 楼主| 呐咯密密 发表于 2022-10-21 09:19 | 显示全部楼层 |阅读模式

最近,我们的设备连接的云平台需要切到阿里的飞燕平台,做个笔记记录下。

阿里的物联网平台有好几个:

  • 物联网平台
  • 生活物联网平台(飞燕平台)
  • 城市物联网平台

它们的应用场景不一样。其中,物联网平台的入口是最容易找到的,网上大多数demo都是基于物联网平台。而本篇笔记我们是基于生活物联网平台(飞燕平台)来记录的。

阿里的生活物联网平台是面向消费级生活智能设备的平台。

平台入口:

https://www.aliyun.com/product/livinglink?spm=5176.13907935.J_3207526240.46.56603cc7M41In4

开发文档:

https://help.aliyun.com/document_detail/142147.html?spm=5176.20184507.J_1419255180.2.4c111d2e2IUsMC

下面我们使用基于嵌入式Linux单板系统的设备一步一步地连接飞燕平台。



 楼主| 呐咯密密 发表于 2022-10-21 09:20 | 显示全部楼层
一、云端创建产品

1、功能定义

定义一些属性:

2、人机交互

配置APP的,后面我们可以使用公版APP进行测试。

3、设备调试/添加设备

4、产品发布

5、获取设备SDK

飞燕平台的设备SDK需要发邮件进行获取,具体获取方式可查看文档。获取得到:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 呐咯密密 发表于 2022-10-21 09:22 | 显示全部楼层
二、移植sdk库至板子

可以参照文档《无AliOS Things的SDK适配指南》来交叉编译libiot_sdk.a库。

https://help.aliyun.com/document_detail/178333.htm?spm=a2c4g.11186623.0.0.1b046fdbIkFmIT#task-1935127

1、配置交叉编译器。

(1)修改文件build-rules/settings.mk中的TOOLCHAIN_DLDIR,比如我这里修改为:

(2)修改build-rules/funcs.mk里面的函数Relative_TcPath增加编译器的相对路径,比如我这里修改为:

(3)增加我们板子的config文件。在src/board/目录下增加一个新的config配置文件,里面的内容可以参照已有的配置文件,比如我参照的是config.ubuntu.x86来新增我的板子的配置文件config.linux.rv1126:

  1. CONFIG_ENV_CFLAGS   += \
  2.     -Os -Wall \
  3.     -g3 --coverage \
  4.     -D_PLATFORM_IS_LINUX_ \
  5.     -D__UBUNTU_SDK_DEMO__ \

  6. CONFIG_ENV_CFLAGS   += \
  7.     -DWITH_MQTT_DYN_BUF=1 \
  8.     -DWITH_MEM_STATS=0 \
  9.     -DWITH_MEM_STATS_PER_MODULE=0 \
  10.     -DWITH_MQTT_JSON_FLOW=1 \
  11.     -DWITH_MQTT_ZIP_TOPIC=1 \
  12.     -DWITH_MQTT_SUB_SHORTCUT=1

  13. CONFIG_ENV_CFLAGS   += \
  14.     -DCONFIG_HTTP_AUTH_TIMEOUT=10000 \
  15.     -DCONFIG_MID_HTTP_TIMEOUT=10000 \
  16.     -DCONFIG_GUIDER_AUTH_TIMEOUT=10000 \
  17.     -DCONFIG_MQTT_RX_MAXLEN=10000 \
  18.     -DCONFIG_MBEDTLS_DEBUG_LEVEL=0 \
  19.     -DCOMPATIBLE_LK_KV


  20. ifneq (Darwin,$(strip $(shell uname)))
  21. CONFIG_ENV_CFLAGS   += -rdynamic
  22. CONFIG_ENV_CFLAGS   += -Werror
  23. CONFIG_ENV_CFLAGS   += -Wno-missing-braces
  24. else
  25. CONFIG_src/ref-impl/hal :=
  26. CONFIG_examples     :=
  27. CONFIG_src/tools/linkkit_tsl_convert :=
  28. endif

  29. CONFIG_src/ref-impl/tls         :=
  30. CONFIG_src/ref-impl/hal         :=

  31. CONFIG_ENV_LDFLAGS  += -lpthread -lrt

  32. #交叉编译器的前缀,这里不要带路径
  33. CROSS_PREFIX := arm-linux-gnueabihf-

2、配置SDK的功能

我们可以直接编辑根目录下面的make.settings文件,也可以执行make menuconfig命令进行图形化配置,比如配置配网的方式等,这里我使用设备AP配网,所以我使能设备AP配网:

3、编译libiot_sdk.a库

先执行make clean命令进行清理操作,再执行make reconfig选择配置。

刚才我们添加的板子处于序号3的配置,输入3,然后回车:

然后执行make命令进行编译,编译无误的结果:

如果没有编译错误,生成的库文件libiot_sdk.a在output/release/lib目录下面。

4、交叉编译demo工程

我们准备一个工程,然后把sdk里的必要文件到我们的工程里,比如我这里新建一个ali_smartliving文件夹存放sdk相关的代码,ali_smartliving里面的内容如:

其中include及src文件夹就是sdk里对应的文件夹,lib里放的是我们上面交叉编译得到的libiot_sdk.a。

把sdk开发包examples/linkkit/living_platform的整个文件夹复制到我们的工程里,然后编写CMakeLists.txt文件:

  1. cmake_minimum_required(VERSION 3.1)

  2. message(STATUS "######################################")
  3. message(STATUS "Build on target platform: ${TARGET_PLATFORM}")
  4. message(STATUS "######################################")

  5. ####################################### 编译模式设置 #######################################
  6. set(DEBUG_VERSION "DebugMode")
  7. set(RELEASE_VERSION "ReleaseMode")
  8. set(COMPILE_MODE ${RELEASE_VERSION})            # 编译模式
  9. set(TARGET_NAME "ali_sdk_test")                 # 目标可执行程序名称
  10. string(TIMESTAMP COMPILE_TIME %m%d_%H%M)        # 生成编译时间

  11. # Debug模式(目标:工程名+编译时间)
  12. if(${COMPILE_MODE} MATCHES ${DEBUG_VERSION})   
  13.     message(STATUS "Compile mode: ${COMPILE_MODE}")
  14.     set(USE_RELEASE_MODE 0)
  15.     set(CMAKE_BUILD_TYPE "Debug")
  16.     set(target ${TARGET_NAME}_${COMPILE_TIME})
  17. # Release模式(目标:工程名+版本号)
  18. else()
  19.     message(STATUS "Compile mode: ${COMPILE_MODE}")
  20.     set(USE_RELEASE_MODE 1)
  21.     set(CMAKE_BUILD_TYPE "Release")
  22.     set(VERSION_MAJOR  1)    # 一级版本号
  23.     set(VERSION_MINOR  0)    # 二级版本号
  24.     set(VERSION_LEVEL3 0)    # 三级版本号
  25.     set(target ${TARGET_NAME}_V${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_LEVEL3})
  26. endif()
  27. project(${target})

  28. ####################################### 编译选项配置 #######################################
  29. set(TARGET_PLATFORM "x86-64" CACHE STRING "which platform the source code should be compiled on")
  30. message(STATUS "Build on target platform: ${TARGET_PLATFORM}")
  31. if(TARGET_PLATFORM MATCHES "rv1126")
  32.     include(cmake/rv1126_crosscompile_toolchain.cmake)  #交叉编译环境设置
  33. elseif(TARGET_PALTFORM MATCHES "x86-64")
  34.     message(STATUS "PC_DEBUG: ${PC_DEBUG}")
  35. endif()
  36. set(CMAKE_CXX_FLAGS "-std=c++11")
  37. set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall")  #-g for debug
  38. set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
  39. set(CMAKE_EXE_LINKER_FLAGS "-Wl,-Map=out.map")
  40. if(TARGET_PLATFORM MATCHES "rv1126")
  41. set(CMAKE_C_FLAGS "-fdata-sections -g -rdynamic -mapcs-frame -funwind-tables -ffunction-sections -Wall -Os")
  42. set(CMAKE_C_FLAGS "$ENV{CMAKE_C_FLAGS} -DDLL_HAL_EXPORTS -DCOMPATIBLE_LK_KV -lrt")
  43. elseif(TARGET_PALTFORM MATCHES "x86-64")
  44. set(CMAKE_C_FLAGS "-fdata-sections -g -rdynamic -mapcs-frame -funwind-tables -ffunction-sections -Wall -Os")
  45. set(CMAKE_C_FLAGS "$ENV{CMAKE_C_FLAGS} -DDLL_HAL_EXPORTS -DCOMPATIBLE_LK_KV -lrt")
  46. endif()
  47. set(CMAKE_CXX_FLAGS "-fdata-sections -Wno-psabi")

  48. ####################################### 共享库 ############################################

  49. set(ALI_IOT_LIBDIR ali_smartliving/lib)
  50. link_directories(${ALI_IOT_LIBDIR})
  51. set(ALI_IOT_LIBS libiot_sdk.a)


  52. add_definitions (-DDLL_IOT_EXPORTS)

  53. add_definitions (-DAWSS_DISABLE_ENROLLEE)
  54. add_definitions (-DAWSS_DISABLE_REGISTRAR)
  55. add_definitions (-DAWSS_SUPPORT_ADHA)
  56. add_definitions (-DAWSS_SUPPORT_AHA)
  57. add_definitions (-DAWSS_SUPPORT_APLIST)
  58. add_definitions (-DAWSS_SUPPORT_DEV_AP)
  59. add_definitions (-DAWSS_SUPPORT_PHONEASAP)
  60. add_definitions (-DAWSS_SUPPORT_ROUTER)
  61. add_definitions (-DAWSS_SUPPORT_SMARTCONFIG)
  62. add_definitions (-DAWSS_SUPPORT_SMARTCONFIG_WPS)
  63. add_definitions (-DAWSS_SUPPORT_ZEROCONFIG)
  64. add_definitions (-DCOAP_SERV_MULTITHREAD)
  65. add_definitions (-DCONFIG_HTTP_AUTH_TIMEOUT=5000)
  66. add_definitions (-DCONFIG_MID_HTTP_TIMEOUT=5000)
  67. add_definitions (-DCONFIG_GUIDER_AUTH_TIMEOUT=10000)
  68. add_definitions (-DDEVICE_MODEL_ENABLED)
  69. add_definitions (-DDEV_BIND_ENABLED)
  70. add_definitions (-DFORCE_SSL_VERIFY)
  71. add_definitions (-DMQTT_COMM_ENABLED)
  72. add_definitions (-DMQTT_DIRECT)
  73. add_definitions (-DOTA_ENABLED)
  74. add_definitions (-DOTA_SIGNAL_CHANNEL=1)
  75. add_definitions (-DSUPPORT_TLS)
  76. add_definitions (-DWIFI_PROVISION_ENABLED)
  77. add_definitions (-D_PLATFORM_IS_HOST_)

  78. include_directories(build)
  79. include_directories(ali_smartliving)
  80. include_directories(ali_smartliving/include)
  81. include_directories(ali_smartliving/include/exports)
  82. include_directories(ali_smartliving/include/imports)
  83. include_directories(ali_smartliving/linkkit/living_platform)
  84. include_directories(ali_smartliving/src/ref-impl/hal)
  85. include_directories(ali_smartliving/src/ref-impl/hal/os/ubuntu)
  86. include_directories(ali_smartliving/src/infra/log)
  87. include_directories(ali_smartliving/src/ref-impl/tls/include)
  88. include_directories(ali_smartliving/src/infra/utils/digest)
  89. include_directories(living_platform)

  90. ####################################### 源文件 ############################################
  91. aux_source_directory(living_platform living_platform_src)
  92. file(GLOB hal_srcs ${PROJECT_SOURCE_DIR}/ali_smartliving/src/ref-impl/hal/os/ubuntu/*.c)
  93. file(GLOB ssl_mbedtls_srcs ${PROJECT_SOURCE_DIR}/ali_smartliving/src/ref-impl/hal/ssl/mbedtls/*.c)
  94. file(GLOB tls_srcs ${PROJECT_SOURCE_DIR}/ali_smartliving/src/ref-impl/tls/library/*.c)

  95. set(THREADS_PREFER_PTHREAD_FLAG ON)
  96. find_package(Threads REQUIRED)

  97. message(STATUS "################## Compile time:${COMPILE_TIME} ##################")

  98. add_executable(${PROJECT_NAME}
  99.         ${living_platform_src}
  100.         ${hal_srcs}
  101.         ${ssl_mbedtls_srcs}
  102.         ${tls_srcs}
  103.         main.c
  104.         )
  105. target_link_libraries(${PROJECT_NAME}
  106.         ${ALI_IOT_LIBS}
  107.         Threads::Threads
  108.         m
  109.         )
我们工程的结构如:

注意:

大家自己移植、编译,可能会遇到如下两个问题:

(1)很多系统函数找不到,加上编译参数-lrt即可。

(2)softap_decrypt_password函数找不到。这个函数是在libawss_security.a库里的,而这个库我们并没有交叉编译,demo的文档也有提到:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 呐咯密密 发表于 2022-10-21 09:24 | 显示全部楼层

这里我们暂时用不到,也可以屏蔽掉sdk里调用这个函数的地方,如:

到了这一步,工程编译基本没什么问题了。下面开始连接云端

5、设备连接云端

先来测试设备连接云端,需要在代码里写入云端的设备证书。

云端设备证书:

代码里需要修改living_platform_ut.h文件里的如下宏定义:

修改的时候需要去掉PK_ 、PS_ 、 DN_ 、DS_ 这些前缀。

修改如:

运行测试,没报什么错的话,云端设备就会显示在线:

可以在线调试设备:






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部