跳转至

TLINK云

一、演示功能概述

本篇文章演示的内容为:使用 iotcloud 库连接公有 TLINK 云,实现云端控制开发板上的灯亮灭的功能。

二、硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

三、准备软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools 工具

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V2004_Air780EPM;参考项目使用的内核固件

3. LuatOS 需要的脚本和资源文件:TODO

4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air780EPM 核心板,将本篇文章中演示使用的项目文件烧录到 Air780EPM 核心板中。

四、准备云平台环境

4.1 登录云平台

本文用到的云平台网址:https://www.tlink.io,若没有账号,请先自行注册账号。

4.2 创建测试设备

进入设备管理一栏

点击添加设备

设备名称根据自己喜好填写即可,本文填写为 Air780EPM_001,链接协议选择 MQTT,其他值默认即可

然后点击追加传感器

传感器名称填为灯控,本文测试的功能是控制灯的亮灭,所以类型选择为开关型(可操作)

然后,在网页提供的地图上选一个位置,最后点击创建设备即可

至此,测试设备创建成功

4.3 获取三元组

4.3.1 clientID

设备的序列号即为 clientID

4.3.2 username&password

username 为登录云平台使用的账号

password 为登录云平台使用的账号对应的密码

4.4 获取传感器序列号

进入监控中心

将灯控 ID 保存下来即可

五、iotcloud 接口参考

https://docs.openluat.com/air780epm/luatos/api/ext/iotcloud/

六、代码示例

代码中有详细的注释,可以用来参考:

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "IOTCLOUD_TLINK"
VERSION = "1.0.0"

-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用mqtt库需要下列语句]]
_G.sysplus = require("sysplus")

local iotcloud = require("iotcloud")

-- TLINK平台设备序列号
local serialNumber = "3724K8WXC40VUX2Q"
-- TLINK平台登录账号
local username = "XXXXXXXXXXXXXX"
-- TLINK平台登录密码
local password = "XXXXXXXXXXXXXX"

-- TLINK平台添加的传感器ID
local sensorsId = "200826181"

-- TLINK平台添加的传感器对应的TOPIC,iotcloud库会自动为设备订阅通配主题,用户只需判断报文是否来自该传感器的TOPIC即可
local tlinkSubTopic = serialNumber .. "/" .. sensorsId

-- 是否使用自动重连
local autoReconnect = false
local connectConfig =
{
    keepalive = 60, -- mqtt心跳设置为60秒
}

if autoReconnect then
    connectConfig.autoreconn = 3000 -- 云平台断开3秒后自动重连
end

-- TLINK平台switch类型传感器回传报文
local function switchSensorPub(cloudc, switch)
    local tmp = {
        sensorDatas = {{sensorsId = sensorsId, switcher = switch}}
    }
    local payload = json.encode(tmp)
    log.info("回传的报文", payload)
    cloudc:publish(serialNumber, payload)
end

-- 将gpio27设置为输出模式,高电平,gpio27在开发板上控制的是蓝灯
local ledCtrl = gpio.setup(27, 0)

-- 订阅来自iotcloud库发布的消息主题
sys.subscribe("iotcloud", function(cloudc, event, data, payload)
    -- 注意,此处不是协程内,复杂操作发消息给协程内进行处理
    if event == iotcloud.CONNECT then -- 云平台联上了
        log.info("TLINK 云平台连接成功")
        -- cloudc:subscribe("test") -- 可以自由订阅主题,详情可参考TLINK开发文档
    elseif event == iotcloud.RECEIVE then
        log.info("TLINK 发布消息", "topic", data, "payload", payload)
        -- 判断主题是否来自sensorsId的报文
        if data == tlinkSubTopic then
            -- json解析
            local userPayload, result, err = json.decode(payload)
            -- 防止异常的措施,防止json解析失败代码运行异常
            if result == 1 and userPayload and type(userPayload) == "table" then
                if userPayload.sensorDatas and userPayload.sensorDatas[1] then
                    local switch = userPayload.sensorDatas[1].switcher
                    -- 如果开关状态等于1,则打开蓝灯,否则关闭蓝灯
                    if switch == 1 then
                        ledCtrl(1)
                    else
                        ledCtrl(0)
                    end
                    -- 回传报文
                    switchSensorPub(cloudc, switch)
                end
            end
        end
    elseif event == iotcloud.OTA then
        -- 用户处理代码
        -- TLINK 不会有这条消息上报,可忽略
    elseif event == iotcloud.DISCONNECT then -- 云平台断开了
        -- 用户处理代码
        log.info("云平台连接断开")
        if not autoReconnect then
            cloudc:connect()
        end
    end
end)

sys.taskInit(function()
    -- 等待联网
    local result
    while true do
        log.info("等待联网")
        result = sys.waitUntil("IP_READY", 30000)
        if result then
            break
        end
    end
    log.info("联网成功")

    -- 创建TLINK云平台实例,在iotcloud TLINK平台中,device_name对应mqtt三元组的clientId,product_id对应mqtt三元组的username,product_secret对应mqtt三元组的password
    iotcloudc = iotcloud.new(iotcloud.TLINK, {
        device_name = serialNumber,
        produt_id = username,
        product_secret = password
    }, connectConfig)
    -- 创建成功,则连接,创建失败,就结束程序
    if iotcloudc then
        iotcloudc:connect()
    else
        log.error("iotcloud", "创建失败, 请检查参数")
    end
end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

七、代码运行

7.1 填写三元组

将按 4.3 章节中方式获取的三元组填到代码中对应的位置中即可

7.2 填写传感器 ID

将按 4.4 章节中方式获取的传感器序列号填到代码中对应的位置中即可

7.3 烧录代码

如何烧录项目文件到 Air780EPM 核心板

7.4 查看运行日志

日志打印云平台连接成功,说明设备已经连接到 TLINK 云平台上了

7.5 控制云平台开关下发报文

点击按钮并确认后,云平台即会向设备下发报文

可以看到,设备收到了开关状态为 1 的报文,并回传了报文结果,开发板上的蓝灯也亮了

云平台上收到设备回传的报文后,开关状态也发生了变化

再点击一次开关,可以看到,设备收到了开关状态为 0 的报文,并回传了报文结果,开发板上的蓝灯也灭了

云平台上收到设备回传的报文后,开关状态也发生了变化

八、总结

至此,我们已使用 Air780EPM 开发板实现了连接 TLINK 云平台并且远程控制开发板上灯的功能。