嵌入式linux单板连接飞燕物联网平台(代码片段)

嵌入式大杂烩 嵌入式大杂烩     2023-03-31     158

关键词:

大家好,我是杂烩君。

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

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

  • 物联网平台

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

  • 城市物联网平台

它们的应用场景不一样。其中,物联网平台的入口是最容易找到的,网上大多数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、功能定义

定义一些属性:

2、人机交互

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

3、设备调试/添加设备

4、产品发布

5、获取设备SDK

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

二、移植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:

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配网:

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文件:

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 "$ENVCXXFLAGS -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 "$ENVCMAKE_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 "$ENVCMAKE_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
        )

我们工程的结构如:

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

注意:

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

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

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

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

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

5、设备连接云端

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

云端设备证书:

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

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

修改如:

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

可以在线调试设备:

demo获取

本篇笔记的demo可在本公众号后台回复关键词:飞燕平台初体验 ,即可获取。

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

注意

由于微信公众号近期改变了推送规则,为了防止找不到,可以星标置顶,这样每次推送的文章才会出现在您的订阅列表里。

猜你喜欢:

分享一种灵活性很高的协议格式(附代码例子)

嵌入式大杂烩周记 | 第 16 期

嵌入式大杂烩周记 | 第 15 期

访问非法内存为什么不会出错?

嵌入式大杂烩周记 | 第 14 期

分享几个实用的代码片段(第二弹)

分享一种你可能不知道的bug定位方法

分享一种修改配置文件的方法

《嵌入式大杂烩周记第 13 期:lz4》

《嵌入式并行多线程处理器,了解一下!》

《分享一种修改配置文件的方法》

《分享几个实用的代码片段(附代码例子)》

《废旧板子再利用:搭建无线调试环境!》

《嵌入式段错误的3种调试方法汇总!》

《简说TCP通信非阻塞接收(附代码例子)》

《TCP通信常用接口的使用封装》

《写国际化的嵌入式代码,时间问题如何处理?》

《Linux命令行万能解压命令》

《嵌入式软件中,总线错误的坑?替大家先踩一步》

《分享嵌入式软件调试方法及几个有用的工具!》

《分享两点提高编程能力的建议!》

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总

嵌入式设备ap配网实例分享(代码片段)

大家好,我是杂烩君。上一篇笔记我们分享了嵌入式Linux单板连接飞燕物联网平台,这篇我们分享一下配网。在这之前,建议阅读往期相关笔记:smartconfig一件配网:嵌入式大杂烩周记第5期:SmartLink嵌入式Linux设... 查看详情

嵌入式设备ap配网实例分享(代码片段)

大家好,我是杂烩君。上一篇笔记我们分享了嵌入式Linux单板连接飞燕物联网平台,这篇我们分享一下配网。在这之前,建议阅读往期相关笔记:smartconfig一件配网:嵌入式大杂烩周记第5期:SmartLink嵌入式Linux设... 查看详情

涂鸦智能物联网平台初探(代码片段)

...般人想象的要早,远早于后来的同类平台诸如阿里云飞燕物联网平台和腾讯物联网平台。在2014年国内掀起智能硬件开发大潮的时候,就已经开始了。知道“涂鸦”比较偶然。因为追溯历史,更早一些的物联网平台ÿ... 查看详情

使用mqtt连接阿里云的物联网云平台(代码片段)

**使用MQTT连接阿里云的物联网云平台**对于嵌入式的小伙伴来说,使用MQTT协议貌似是一个必须经过的过程,但对于一些刚入门或对MQTT不熟悉的人来说,寻找适合使用MQTT的平台也是一个难点,有些人可能会为了验... 查看详情

涂鸦智能物联网平台初探(代码片段)

...般人想象的要早,远早于后来的同类平台诸如阿里云飞燕物联网平台和腾讯物联网平台。在2014年国内掀起智能硬件开发大潮的时候,就已经开始了。知道“涂鸦”比较偶然。因为追溯历史,更早一些的物联网平台ÿ... 查看详情

无源物联网物联网的下一个风口?(代码片段)

作者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。文章目录无... 查看详情

无源物联网物联网的下一个风口?(代码片段)

作者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。文章目录无... 查看详情

物联网esp8266+云服务器搭建物联网通道(代码片段)

...;如阿里云、华为云、腾讯云、机智云等,要想使一个嵌入式设备接入物联网平台,一般需要一下几个步骤:1.通过2G、4G、NB-IOT、WIFI等手段让你的嵌入式设备能接入公网;2 查看详情

使用mqtt连接阿里云的物联网云平台(代码片段)

使用MQTT连接阿里云的物联网云平台(2)上一篇讲到在阿里云的物联网平台建立物理模型(即数据点),以及如何使用虚拟设备查看设备上线时上报的JSON格式和云平台下发的JSON格式,这点对于后面项目开发来说很重要。本篇将... 查看详情

使用mqtt连接华为云的物联网平台(代码片段)

...网平台文章目录使用MQT为云的物联网平台前言一、MQTT.fx连接华为云需要什么二、连接步骤1.创建连接2.订阅主题与发布主题3.实践操作总结前言上一篇说明了如何在华为云创建设备,并获取到它的DeviceID和密钥,通过这些... 查看详情

一个非常优秀的跨平台物联网开发常用的网络请求库libcurl(代码片段)

点击上方「嵌入式应用研究院」,选择「置顶公众号」第一时间查看嵌入式笔记!由于接下来要更多的和物联网云平台打交道。我考虑的一种实现方式是将业务代码和网络解析处理代码分离的模式。因此,有必要学习... 查看详情

中移m5311模块mqtt协议连接阿里云物联网平台(干货)(代码片段)

一、准备三元组在阿里云物联网平台新建产品和设备后,平台给每一个设备自动赋予三元组。二、准备MQTT协议参数新建产品时,阿里云物联网平台会分配一个含productkey的子域名,端口号固定是1883。域名中含有阿里云... 查看详情

华为iotda(物联网平台)如何使用pythonsdk实现应用侧连接(代码片段)

...们将通过Python语言实现物联网平台(华为IoTDA)的连接,主要使用的模块是官方提供的PythonSDK,对接目标为应用侧API对接。华为IoTDA应用侧API是指 查看详情

.netcore跨平台物联网开发:连接阿里云iot(代码片段)

系列教程目录 (一)连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档属性、方法、委托、类 http://pan.whuanle.cn/index.php?dir=uploads/阿里云IOT/AliIOTXFclient-dll类库&response下载三个库,头部引... 查看详情

物联网平台技术漫谈

...防御型的网络空间战给你留下想象空间JRTOS/Linux/裸机上的嵌入式软件移植IoT系统架构和部署 MikeAnderson简介在嵌入式领域超过39年的工作经验开发部分VxWorksLinux/Android内核讲师FRC#116FIRSTRoboticsTea 查看详情

一个非常优秀的跨平台物联网开发常用的网络请求库libcurl(代码片段)

点击上方「嵌入式应用研究院」,选择「置顶公众号」第一时间查看嵌入式笔记!由于接下来要更多的和物联网云平台打交道。我考虑的一种实现方式是将业务代码和网络解析处理代码分离的模式。因此,有必要学习... 查看详情

物联网工程学习路线

...该怎样学啊,求指一条路参考技术A1.编程方面:C、汇编2.嵌入式系统基础3.硬件器件与平台:节点器件(T-MoteSky、TIMSP430等);平台(Arduino,树莓派等)3.无线传感器网络:基础知识、协议栈(ZigBee,IETF6LowPan,CoAP等)4.无线传感... 查看详情

开源物联网平台建设参考解决方案(代码片段)

开源物联网平台建设、参考解决方案一、什么是物联网平台1.1物联网应用基础服务平台应具备的能力1.2物联网平台定位要求1.2.1提供统一的终端接入平台1.2.2提供统一的应用基础运行平台1.2.3提供统一的安全认证1.2.4提供统一的数... 查看详情