AliOS Things 设备接入

更新时间:2018-04-04 16:06:19

简介

区别于普通的嵌入式设备 C SDK,AliOS Things 除了提供 Link Develop 设备接入能力以外,还赋予了设备一套完善的物联网操作系统,配有丰富的组件生态,如传感器框架、自组织Mesh网络、各类网络协议栈、安全支持等等,方便用户开发功能强大的物联网设备。
本文介绍如何在设备端基于 AliOS Things 接入 Link Develop 一站式开发平台,并将设备端采集到的传感器数据上报云端。
其中的设备端示例使用了 AliOS Things Starter Kit 开发板

开发环境准备

如果设备已经在使用 AliOS Things,可以直接转至设备端接入示例,开始设备端接入部分的开发。

Linux/Mac

安装

安装python pip包管理器,然后安装aos-cube到全局环境:

sudo pip install aos-cube

串口工具推荐安装(可选)

minicom 或者 picocom

Windows

安装

Python 2和Git安装完成以后,在Git Bash中安装aos-cube:

pip install --user -U aos-cube

注意

python版本为2.7,aos-cube version >= 0.2.22

下载 AliOS Things 代码

从GitHub克隆:

git clone https://github.com/alibaba/AliOS-Things.git

如果速度比较慢,也可以从镜像站点克隆:

git clone https://gitee.com/alios-things/AliOS-Things.git

设备端接入示例

功能概要

本例在设备端运行AliOS Things并采集加速度传感器数据通过MQTT上报到云端。

Link Develop支持云端设备模型的定义,为了能让云端理解上报的数据,我们先在平台创建产品及定义产品的功能。
加速度传感器的输出数据分别为X、Y、Z轴上的加速度值,因此需要在平台上定义相关功能。

产品创建

这里创建的是一个自定义产品:
所属分类:其他类型
产品名称:(自定义名称)
产品型号:(自定义型号)
节点类型:设备
通讯方式:Wi-Fi
数据格式:Alink


输入的其他字段含义可在页面帮助信息中查看。

功能定义

由于平台目前还没有加速度相关的属性值,我们在自定义功能栏定义相关功能:

定义一个加速度的属性:
标识符:Accelerometer
类型:JSON对象(结构体)
读写类型:只读

成员标识定义分别是X、Y、Z,标示各个轴向上的加速度值:
类型:浮点型(双精度)

定义完成后展示如下:

创建测试设备

产品创建成功后,我们为该产品添加实例(设备)。

生成激活凭证

设备添加成功后,会生成对应的激活凭证,设备连接到云端需要使用,可以理解是设备在云端的唯一标识符。
在平台上定义完成后就可以开始设备的开发。

设备本地开发

本文使用 aos 命令行方式进行开发,如果希望使用IDE方式开发,请参考文末链接:AliOS Things Starter Kit 开发文档(使用Visual Studio Code IDE方式)

查看、修改代码

打开 AliOS-Things 代码,可以看到类似如下目录结构:

AliOS-Things
├── README.md
├── board
├── build
├── example
│   ├── ldapp
│   │   ├── ldapp.mk
│   │   ├── mqtt-example.c
│   │   └── ucube.py
├── framework
├── include
├── kernel
├── ...
└── platform

这里我们要使用的是 example/ldapp 这一份示例代码,在 example/ldapp/mqtt-example.c 中更新设备激活凭证。
将前一章中生成的激活凭证填入到代码中即可,这样我们这个程序就会使用新的凭证信息连接到云端,如:

#define PRODUCT_KEY             "a1xxxxxxxxo"
#define DEVICE_NAME             "QSxxxxxxxxxxxxxxxxHc"
#define DEVICE_SECRET           "O6xxxxxxxxxxxxxxxxxxxxxxxxxxxxEi"

编译

此后的步骤请保证前序章节中开发环境准备步骤已完成。

AliOS-Things 目录下:

aos make ldapp@starterkit

编译完成会看到一份Memory Map,以及生成的目标二进制文件ldapp@starterkit.bin

Making ldapp@starterkit.elf
Making ldapp@starterkit.bin
Making ldapp@starterkit.hex

                        AOS MEMORY MAP

|=================================================================|
| MODULE                                   | ROM       | RAM      |
|=================================================================|
| newlib_stub                              | 226       | 0        |
| sal                                      | 12249     | 560      |
| kv                                       | 2917      | 36       |
| fota                                     | 2573      | 337      |
| socket_stand                             | 987       | 0        |
| yloop                                    | 1547      | 24       |
| libc_nano                                | 25084     | 464      |
| vcall                                    | 3526      | 4        |
| kernel_init                              | 661       | 36       |
| alink-ilop                               | 11158     | 1697     |
| rhino                                    | 12487     | 7661     |
| framework                                | 349       | 12       |
| ldapp                                    | 3064      | 580      |
| vfs                                      | 1881      | 1209     |
| digest_algorithm                         | 2036      | 0        |
| libgcc                                   | 3360      | 0        |
| sensor                                   | 3478      | 113      |
| fota_mqtt_transport                      | 2343      | 58       |
| download_http                            | 1898      | 88       |
| cli                                      | 5374      | 481      |
| mqtt                                     | 13382     | 8        |
| device_sal_mk3060                        | 6503      | 249      |
| fota_platform                            | 66        | 0        |
| netmgr                                   | 1728      | 277      |
| fota_download                            | 22        | 0        |
| cjson                                    | 1919      | 20       |
| stm32l4xx                                | 15862     | 7411     |
| starterkit                               | 1561      | 240      |
| log                                      | 418       | 20       |
| MQTTPacket                               | 2065      | 4        |
| hal                                      | 258       | 12       |
| atparser                                 | 4791      | 21       |
| armv7m                                   | 392       | 0        |
| *fill*                                   | 189       | 58       |
|=================================================================|
| TOTAL (bytes)                            | 146354    | 21680    |
|=================================================================|
Build complete
Making .gdbinit

烧录

aos upload ldapp@starterkit

这里我们使用 Starter Kit 开发板,MCU 是 STM32L433,因此可以看到 st-flash 工具的烧录日志:

$ aos upload ldapp@starterkit
target: ldapp@starterkit
image_path: /Users/librae/work/AliOS-Things/out/ldapp@starterkit/binary/ldapp@starterkit.bin
upload_cmd: /Users/librae/work/AliOS-Things/build/cmd/osx/st-flash
st-flash 1.5.0
2018-04-03T21:43:19 INFO common.c: Loading device parameters....
2018-04-03T21:43:19 INFO common.c: Device connected is: L43x/L44x device, id 0x10016435
2018-04-03T21:43:19 INFO common.c: SRAM size: 0xc000 bytes (48 KiB), Flash: 0x40000 bytes (256 KiB) in pages of 2048 bytes
Mass erasing
erase succeed
st-flash 1.5.0
2018-04-03T21:43:19 INFO common.c: Loading device parameters....
2018-04-03T21:43:19 INFO common.c: Device connected is: L43x/L44x device, id 0x10016435
2018-04-03T21:43:19 INFO common.c: SRAM size: 0xc000 bytes (48 KiB), Flash: 0x40000 bytes (256 KiB) in pages of 2048 bytes
2018-04-03T21:43:19 INFO common.c: Attempting to write 146504 (0x23c48) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08023800 erasedEraseFlash - Page:0x107 Size:0x800
2018-04-03T21:43:21 INFO common.c: Finished erasing 72 pages of 2048 (0x800) bytes
2018-04-03T21:43:21 INFO common.c: Starting Flash write for F2/F4/L4
2018-04-03T21:43:21 INFO flash_loader.c: Successfully loaded flash loader in sram
size: 32768
size: 32768
size: 32768
size: 32768
size: 15432
2018-04-03T21:43:24 INFO common.c: Starting verification of write complete
2018-04-03T21:43:26 INFO common.c: Flash written and verified! jolly good!
firmware upload succeed

运行

AliOS Things 在串口中提供了命令行交互的支持。
烧录完成后重启设备,打开串口调试工具并将波特率设置到115200,输入回车(换行符),可以看到#命令提示符,表示设备正常运行。也可以输入help命令进行交互,如:

#
# help
====Build-in Commands====
====Support six cmds once, seperate by ; ====
help:
echo:
exit: CLI exit
devname: print device name
sysver:
reboot: reboot system
time: system time
ota: system ota

====User Commands====
loglevel: set log level
tasklist: list all thread info
dumpsys: dump system info
udp: [ip] [port] [string data] send udp data
wifi_debug: wifi debug mode
mac: get/set mac
kv: kv [set key value | get key | del key | list]
version: show version
netmgr: netmgr [start|clear|connect ssid password]
mqtt: factory mqtt

#

配网

这里我们直接通过在串口中输入命令来连接WiFi完成配网:

netmgr connect SSID PASSWORD

例如:

# netmgr connect mywifi mypassword
[330060]<I> Will connect via at cmd: AT+WJAP=mywifi,mypassword
# [330100]<I> AT command AT+WJAP=mywifi,mypassword succeed, rsp:
OK
[337560]<I> AT command AT+WJAPIP? succeed, rsp:

+WJAPIP?:192.168.1.19,255.255.255.0,192.168.1.1,192.168.1.1
OK
[337580]<I> AT command AT+WMAC? succeed, rsp:

+WMAC:c8936840aa40
OK
[337580]<I> mac result: c8936840aa40
[337590]<I> Got ip : 192.168.1.19, gw : 192.168.1.1, mask : 255.255.255.0
[337590]<V> Hello, WiFi GOT_IP event! at board/starterkit/board_cli.c 200

设备WiFi连接成功后会自动建立MQTT连接,之后定期上报采集到的传感器数据。下图是正常运行的日志信息:

[337610]<V> Hello, WiFi GOT_IP event! at board/starterkit/board_cli.c 200

[337610]<V> wifi_service_event!
RHINOSOCK 32 HAL_TCP_Establish() | establish tcp connection with server(host=a1E31Zmhcxo.iot-as-mqtt.cn-shanghai.aliyuncs.com port=1883)
[337710]<I> Server conn (0) successful.
RHINOSOCK 71 HAL_TCP_Establish() | success to establish tcp, fd=0
[338210]<V> mqtt_service_event!
[338440]<V> subscribe success, packet-id=1
[339450]<V> packet-id=2, publish topic msg={"id":"1","version":"1.0","method":"thing.event.property.post","params":{"Accelerometer":{"X":-1.732227,"Y":-0.038281, "Z":7.062891}}}
[339480]<V> publish success, packet-id=2
[339980]<V> ----
[339980]<V> Topic: '/sys/a1E31Zmhcxo/QSUvUO7V5lxwJsOHgyHc/thing/event/property/post_reply' (Length: 69)
[339990]<V> Payload: '{"code":200,"data":{},"id":"1","message":"success","version":"1.0"}' (Length: 67)
[340000]<V> ----
[340490]<V> packet-id=3, publish topic msg={"id":"2","version":"1.0","method":"thing.event.property.post","params":{"Accelerometer":{"X":-1.713086,"Y":-0.057422, "Z":7.082031}}}
[340510]<V> publish success, packet-id=3
[341200]<V> ----
[341200]<V> Topic: '/sys/a1E31Zmhcxo/QSUvUO7V5lxwJsOHgyHc/thing/event/property/post_reply' (Length: 69)
[341210]<V> Payload: '{"code":200,"data":{},"id":"2","message":"success","version":"1.0"}' (Length: 67)
[341220]<V> ----
[341530]<V> packet-id=4, publish topic msg={"id":"3","version":"1.0","method":"thing.event.property.post","params":{"Accelerometer":{"X":-1.665234,"Y":-0.076563, "Z":7.072461}}}
[341550]<V> publish success, packet-id=4

链路调试

上行调试

查看设备运行状态,可以看到设备上报的数据及上报的时间点,则说明上行链路工作正常。

下行调试

操作方法如下,由于本案例没有可配置的下行数据,如需调试请开发者自行定义。

结语

至此,设备端到云端的链路已打通,后续可以在 Link Develop 上进一步进行开发以完成整个物联网应用。

关于 AliOS Things 的更多详细文档,请参考:

results matching ""

    No results matching ""