加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、云端創(chuàng)建產(chǎn)品
    • 二、移植sdk庫(kù)至板子
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式Linux單板連接飛燕物聯(lián)網(wǎng)平臺(tái)

2022/10/22
2257
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是雜燴君。最近,我們的設(shè)備連接的云平臺(tái)需要切到阿里的飛燕平臺(tái),做個(gè)筆記記錄下。

阿里的物聯(lián)網(wǎng)平臺(tái)有好幾個(gè):

物聯(lián)網(wǎng)平臺(tái)

生活物聯(lián)網(wǎng)平臺(tái)(飛燕平臺(tái))

城市物聯(lián)網(wǎng)平臺(tái)

 

它們的應(yīng)用場(chǎng)景不一樣。其中,物聯(lián)網(wǎng)平臺(tái)的入口是最容易找到的,網(wǎng)上大多數(shù)demo都是基于物聯(lián)網(wǎng)平臺(tái)。而本篇筆記我們是基于生活物聯(lián)網(wǎng)平臺(tái)(飛燕平臺(tái))來記錄的。

阿里的生活物聯(lián)網(wǎng)平臺(tái)是面向消費(fèi)級(jí)生活智能設(shè)備的平臺(tái)。

平臺(tái)入口:

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

開發(fā)文檔:

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

下面我們使用基于嵌入式Linux單板系統(tǒng)的設(shè)備一步一步地連接飛燕平臺(tái)。

一、云端創(chuàng)建產(chǎn)品

1、功能定義

定義一些屬性:

2、人機(jī)交互

配置APP的,后面我們可以使用公版APP進(jìn)行測(cè)試。

3、設(shè)備調(diào)試/添加設(shè)備

4、產(chǎn)品發(fā)布

5、獲取設(shè)備SDK

飛燕平臺(tái)的設(shè)備SDK需要發(fā)郵件進(jìn)行獲取,具體獲取方式可查看文檔。獲取得到:

二、移植sdk庫(kù)至板子

可以參照文檔《無AliOS Things的SDK適配指南》來交叉編譯libiot_sdk.a庫(kù)。

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里面的函數(shù)Relative_TcPath增加編譯器的相對(duì)路徑,比如我這里修改為:

(3)增加我們板子的config文件。在src/board/目錄下增加一個(gè)新的config配置文件,里面的內(nèi)容可以參照已有的配置文件,比如我參照的是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文件,也可以執(zhí)行make menuconfig命令進(jìn)行圖形化配置,比如配置配網(wǎng)的方式等,這里我使用設(shè)備AP配網(wǎng),所以我使能設(shè)備AP配網(wǎng):

 

 

3、編譯libiot_sdk.a庫(kù)

先執(zhí)行make clean命令進(jìn)行清理操作,再執(zhí)行make reconfig選擇配置。

 

 

剛才我們添加的板子處于序號(hào)3的配置,輸入3,然后回車:

然后執(zhí)行make命令進(jìn)行編譯,編譯無誤的結(jié)果:

如果沒有編譯錯(cuò)誤,生成的庫(kù)文件libiot_sdk.a在output/release/lib目錄下面。

4、交叉編譯demo工程

我們準(zhǔn)備一個(gè)工程,然后把sdk里的必要文件到我們的工程里,比如我這里新建一個(gè)ali_smartliving文件夾存放sdk相關(guān)的代碼,ali_smartliving里面的內(nèi)容如:

 

 

其中include及src文件夾

就是sdk里對(duì)應(yīng)的文件夾,lib里放的是我們上面交叉編譯得到的libiot_sdk.a。

把sdk開發(fā)包examples/linkkit/living_platform的整個(gè)文件夾復(fù)制到我們的工程里,然后編寫CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.1)

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

####################################### 編譯模式設(shè)置 #######################################
set(DEBUG_VERSION "DebugMode")
set(RELEASE_VERSION "ReleaseMode")
set(COMPILE_MODE ${RELEASE_VERSION})            # 編譯模式
set(TARGET_NAME "ali_sdk_test")                 # 目標(biāo)可執(zhí)行程序名稱
string(TIMESTAMP COMPILE_TIME %m%d_%H%M)        # 生成編譯時(shí)間

# Debug模式(目標(biāo):工程名+編譯時(shí)間)
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模式(目標(biāo):工程名+版本號(hào))
else()
    message(STATUS "Compile mode: ${COMPILE_MODE}")
    set(USE_RELEASE_MODE 1)
    set(CMAKE_BUILD_TYPE "Release") 
    set(VERSION_MAJOR  1)    # 一級(jí)版本號(hào)
    set(VERSION_MINOR  0)    # 二級(jí)版本號(hào)
    set(VERSION_LEVEL3 0)    # 三級(jí)版本號(hào)
    set(target ${TARGET_NAME}_V${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_LEVEL3})
endif()
project(${target})

####################################### 編譯選項(xiàng)配置 #######################################
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)  #交叉編譯環(huán)境設(shè)置
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") 

####################################### 共享庫(kù) ############################################

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
        )

我們工程的結(jié)構(gòu)如:

我們的demo工程在文末回復(fù)具體的關(guān)鍵詞可以獲取。

注意:

大家自己移植、編譯,可能會(huì)遇到如下兩個(gè)問題:

(1)很多系統(tǒng)函數(shù)找不到,加上編譯參數(shù)-lrt即可。

(2)softap_decrypt_password函數(shù)找不到。這個(gè)函數(shù)是在libawss_security.a庫(kù)里的,而這個(gè)庫(kù)我們并沒有交叉編譯,demo的文檔也有提到:

 

這里我們暫時(shí)用不到,也可以屏蔽掉sdk里調(diào)用這個(gè)函數(shù)的地方,如:

到了這一步,工程編譯基本沒什么問題了。下面開始連接云端

5、設(shè)備連接云端

先來測(cè)試設(shè)備連接云端,需要在代碼里寫入云端的設(shè)備證書。

云端設(shè)備證書:

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

修改的時(shí)候需要去掉PK_ 、PS_ 、 DN_ 、DS_ 這些前綴。

修改如:

運(yùn)行測(cè)試,沒報(bào)什么錯(cuò)的話,云端設(shè)備就會(huì)顯示在線:

可以在線調(diào)試設(shè)備:

 

demo獲取

本篇筆記的demo可在本公眾號(hào)【嵌入式大雜燴】后臺(tái)回復(fù)關(guān)鍵詞:飛燕平臺(tái)初體驗(yàn) ,即可獲取。

以上就是使用嵌入式Linux單板系統(tǒng)連接飛燕平臺(tái)的例子分享,下一篇我們分享基于飛燕平臺(tái)的配網(wǎng)。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

本公眾號(hào)專注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時(shí),公眾號(hào)內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進(jìn)步!