1

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

 1 year ago
source link: https://www.eefocus.com/embedded/527825
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

嵌入式Linux单板连接飞燕物联网平台-嵌入式系统-与非网

e3c65186d843ccca5b79e6455badf72d.jpg

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

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

物联网平台

生活物联网平台(飞燕平台)

城市物联网平台

它们的应用场景不一样。其中,物联网平台的入口是最容易找到的,网上大多数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单板系统的设备一步一步地连接飞燕平台。

一、云端创建产品

1、功能定义

定义一些属性:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2ejfwiaHJXRU2SXXZibrAbcCsejicv9b7ItgcreOKN7Yzdn5q1asPJRzFg%2F640%3Fwx_fmt%3Dpng&s=b8d9ef

2、人机交互

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV23ybXpc8M2s0GRpOxTGKkK25LdxxBjk8732hUmobHia4f7NRlYviciatnQ%2F640%3Fwx_fmt%3Dpng&s=0b32e6

3、设备调试/添加设备

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2GoxEjkvsyZ7aGfEjQVlLCJicRNrJRzqQZnk64aLDtEL6K4iak0wM9UsA%2F640%3Fwx_fmt%3Dpng&s=feed85

4、产品发布

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2KII7VGwU4SmyBUzxuu5auxl1ribCQXIDgg28unITyn0nP0B2nJAGl3Q%2F640%3Fwx_fmt%3Dpng&s=d5de9f

5、获取设备SDK

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2ovBueawG1L2sPNkYj3R7Eo5STeqiaMibUzf3wsC3QzgEdCl95t43kPVg%2F640%3Fwx_fmt%3Dpng&s=8137ed

二、移植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,比如我这里修改为:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2spNN5g8zwia4gRdnHiaykoNF19w5UCoKIdyma7nuXMJWicLt7XCN0ic6dA%2F640%3Fwx_fmt%3Dpng&s=9ddac4

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2XTdQvMVKYiaWRFFcXoIDtKF80ia0N6GRBfV914Z7nMNlmV0Jk3zyBiaqg%2F640%3Fwx_fmt%3Dpng&s=bbf8b5

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

CONFIG_ENV_CFLAGS   += \
    -Os -Wall \
    -g3 --coverage \
    -D_PLATFORM_IS_LINUX_ \
    -D__UBUNTU_SDK_DEMO__ \

CONFIG_ENV_CFLAGS   += \
    -DWITH_MQTT_DYN_BUF=1 \
    -DWITH_MEM_STATS=0 \
    -DWITH_MEM_STATS_PER_MODULE=0 \
    -DWITH_MQTT_JSON_FLOW=1 \
    -DWITH_MQTT_ZIP_TOPIC=1 \
    -DWITH_MQTT_SUB_SHORTCUT=1

CONFIG_ENV_CFLAGS   += \
    -DCONFIG_HTTP_AUTH_TIMEOUT=10000 \
    -DCONFIG_MID_HTTP_TIMEOUT=10000 \
    -DCONFIG_GUIDER_AUTH_TIMEOUT=10000 \
    -DCONFIG_MQTT_RX_MAXLEN=10000 \
    -DCONFIG_MBEDTLS_DEBUG_LEVEL=0 \
    -DCOMPATIBLE_LK_KV


ifneq (Darwin,$(strip $(shell uname)))
CONFIG_ENV_CFLAGS   += -rdynamic
CONFIG_ENV_CFLAGS   += -Werror
CONFIG_ENV_CFLAGS   += -Wno-missing-braces
else
CONFIG_src/ref-impl/hal :=
CONFIG_examples     :=
CONFIG_src/tools/linkkit_tsl_convert :=
endif

CONFIG_src/ref-impl/tls         :=
CONFIG_src/ref-impl/hal         :=

CONFIG_ENV_LDFLAGS  += -lpthread -lrt

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

2、配置SDK的功能

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2EZubJULFknFMCEmr2YKueJTID84PeHKKX9RLAVcw9coSNSM8u4ficFw%2F640%3Fwx_fmt%3Dpng&s=9907bd

3、编译libiot_sdk.a库

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2fzJsRlRyicTjk7qlBqbhdibwC6UWzgTYWj55TtkccDYC18ribibOO3boAQ%2F640%3Fwx_fmt%3Dpng&s=40d56a

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2HnickaMmbvn0e77UPiahtqODgKrvhFciaEB18b9gicqozbVQVIPI9YLUKA%2F640%3Fwx_fmt%3Dpng&s=907399

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV22hUTFeG6CWFHTsYXv0BhbtYcFl6MsXaMXkqN8nWIAUHNrnPue2aRBg%2F640%3Fwx_fmt%3Dpng&s=1504e8

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

4、交叉编译demo工程

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2Lic8ic36vK1PmmQ3ic06q9wH9H8kT49vvSjt4BWqkibWpJhicbvM6my1WCw%2F640%3Fwx_fmt%3Dpng&s=5d9388

其中include及src文件夹

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

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

cmake_minimum_required(VERSION 3.1)

message(STATUS "######################################")
message(STATUS "Build on target platform: ${TARGET_PLATFORM}")
message(STATUS "######################################")

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

# Debug模式(目标:工程名+编译时间)
if(${COMPILE_MODE} MATCHES ${DEBUG_VERSION})   
    message(STATUS "Compile mode: ${COMPILE_MODE}")
    set(USE_RELEASE_MODE 0)
    set(CMAKE_BUILD_TYPE "Debug")
    set(target ${TARGET_NAME}_${COMPILE_TIME})
# Release模式(目标:工程名+版本号)
else()
    message(STATUS "Compile mode: ${COMPILE_MODE}")
    set(USE_RELEASE_MODE 1)
    set(CMAKE_BUILD_TYPE "Release") 
    set(VERSION_MAJOR  1)    # 一级版本号
    set(VERSION_MINOR  0)    # 二级版本号
    set(VERSION_LEVEL3 0)    # 三级版本号
    set(target ${TARGET_NAME}_V${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_LEVEL3})
endif()
project(${target})

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

####################################### 共享库 ############################################

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


add_definitions (-DDLL_IOT_EXPORTS)

add_definitions (-DAWSS_DISABLE_ENROLLEE)
add_definitions (-DAWSS_DISABLE_REGISTRAR)
add_definitions (-DAWSS_SUPPORT_ADHA)
add_definitions (-DAWSS_SUPPORT_AHA)
add_definitions (-DAWSS_SUPPORT_APLIST)
add_definitions (-DAWSS_SUPPORT_DEV_AP)
add_definitions (-DAWSS_SUPPORT_PHONEASAP)
add_definitions (-DAWSS_SUPPORT_ROUTER)
add_definitions (-DAWSS_SUPPORT_SMARTCONFIG)
add_definitions (-DAWSS_SUPPORT_SMARTCONFIG_WPS)
add_definitions (-DAWSS_SUPPORT_ZEROCONFIG)
add_definitions (-DCOAP_SERV_MULTITHREAD)
add_definitions (-DCONFIG_HTTP_AUTH_TIMEOUT=5000)
add_definitions (-DCONFIG_MID_HTTP_TIMEOUT=5000)
add_definitions (-DCONFIG_GUIDER_AUTH_TIMEOUT=10000)
add_definitions (-DDEVICE_MODEL_ENABLED)
add_definitions (-DDEV_BIND_ENABLED)
add_definitions (-DFORCE_SSL_VERIFY)
add_definitions (-DMQTT_COMM_ENABLED)
add_definitions (-DMQTT_DIRECT)
add_definitions (-DOTA_ENABLED)
add_definitions (-DOTA_SIGNAL_CHANNEL=1)
add_definitions (-DSUPPORT_TLS)
add_definitions (-DWIFI_PROVISION_ENABLED)
add_definitions (-D_PLATFORM_IS_HOST_)

include_directories(build)
include_directories(ali_smartliving)
include_directories(ali_smartliving/include)
include_directories(ali_smartliving/include/exports)
include_directories(ali_smartliving/include/imports)
include_directories(ali_smartliving/linkkit/living_platform)
include_directories(ali_smartliving/src/ref-impl/hal)
include_directories(ali_smartliving/src/ref-impl/hal/os/ubuntu)
include_directories(ali_smartliving/src/infra/log)
include_directories(ali_smartliving/src/ref-impl/tls/include)
include_directories(ali_smartliving/src/infra/utils/digest)
include_directories(living_platform)

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

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

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

add_executable(${PROJECT_NAME}
        ${living_platform_src}
        ${hal_srcs}
        ${ssl_mbedtls_srcs}
        ${tls_srcs}
        main.c
        )
target_link_libraries(${PROJECT_NAME}
        ${ALI_IOT_LIBS}
        Threads::Threads
        m
        )

我们工程的结构如:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2duTzkd73gXQJib6Z9ZsRI82c65ll5SPnkXFYOPBuprDRjxQ6XfbL1EQ%2F640%3Fwx_fmt%3Dpng&s=4d86f6

我们的demo工程在文末回复具体的关键词可以获取。

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

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

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2hzJ81AibLeTwticOqm6XO0zM7r7kPFicXH4TlX96ox8FK5OqOKLUXxvAw%2F640%3Fwx_fmt%3Dpng&s=ef053d

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2ibyibYujRUcALXu1xmeuogic5vj8ouHYu7dBUAV3Ua60w3B4bG28U1yzQ%2F640%3Fwx_fmt%3Dpng&s=7af83d

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

5、设备连接云端

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

云端设备证书:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2DpXibXYsgWEx3rVjM5N76wsKvqsyCw8icictZBSAQoyMrm8TLqRTIAxeQ%2F640%3Fwx_fmt%3Dpng&s=0de0b3

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2Qich2BBNNc8h0O9WeX2zIvy59gTcwuDJxtXPyCIuHUw74KPB2nSTTmQ%2F640%3Fwx_fmt%3Dpng&s=c5f7ad

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2tXibvHY7eAYJD0hycbTjque3EpFS5CGJPH6uBh4rP79UXAv9CgiaHL9Q%2F640%3Fwx_fmt%3Dpng&s=7fba9d

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2piaT9sBgSKd43nsrCJG6eMobW5iaw9nWibeVzTQ8zO00eIDO3XUMcnnSQ%2F640%3Fwx_fmt%3Dpng&s=58b625
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2fkiawibNmics38D6Mg6a2cib6ibnbtyODiajCoeAfN1UYydDiaeyPmgfzvnCg%2F640%3Fwx_fmt%3Dpng&s=0c3794

可以在线调试设备:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV2kz1boPPMK2jgC1WAyiatm67FiaXKhF1e8PBHsjUwGvMDFVdV4iafaM09Q%2F640%3Fwx_fmt%3Dpng&s=a66612
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUz9RylATNd8J9ErIM4olubV23t3TStna2c7W6jvke1ujUbPeicM6qzEoA2LoibVZeeFLgZ3jwNt59YVQ%2F640%3Fwx_fmt%3Dpng&s=5713dc

demo获取

本篇笔记的demo可在本公众号【嵌入式大杂烩】后台回复关键词:飞燕平台初体验 ,即可获取。

以上就是使用嵌入式Linux单板系统连接飞燕平台的例子分享,下一篇我们分享基于飞燕平台的配网。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK