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 烧录代码
7.4 查看运行日志
日志打印云平台连接成功,说明设备已经连接到 TLINK 云平台上了
7.5 控制云平台开关下发报文
点击按钮并确认后,云平台即会向设备下发报文
可以看到,设备收到了开关状态为 1 的报文,并回传了报文结果,开发板上的蓝灯也亮了
云平台上收到设备回传的报文后,开关状态也发生了变化
再点击一次开关,可以看到,设备收到了开关状态为 0 的报文,并回传了报文结果,开发板上的蓝灯也灭了
云平台上收到设备回传的报文后,开关状态也发生了变化
八、总结
至此,我们已使用 Air780EPM 开发板实现了连接 TLINK 云平台并且远程控制开发板上灯的功能。