本教程的目的用Air系列模块连上TLINK云平台
TLINK是集连接,云服务,场景应用,数据分析为一体的云平台,支持包括TCP透传,MQTT,HTTP,MODBUD RTU等协议。
1、注册
访问https://www.tlink.io,并注册账号
2、添加设备
3、添加传感器
在这儿添加了三个量:分别为温度,湿度,开关1,开关2
4、设置连接,mqtt协议
序列号则为MQTT需要订阅和发布的主题
5、编译连接Tlink的代码,开发者根据自己的情况修改几处代码:订阅的主题,传感器数量
module(..., package.seeall)
require "AM2320"
require "mqtt"
local buf = ""
local topic = "48IA7P931952ZH98" --这儿添申请到的序列号
--[[
将参数打包为json格式,我这儿是温湿度,开发者根据自己的情况修改,如果有多个值,则按照
{
addTime = "2015-01-01 12:00:00",
value = hum --湿度
}
的样式添加
]]
local function msgPack(tmp,hum)
local torigin =
{
sensorDatas =
{
{
addTime = "2015-01-01 12:00:00",
value = tmp --温度
},
{
addTime = "2015-01-01 12:00:00",
value = hum --湿度
}
}
}
local jsondata = json.encode(torigin)
return jsondata
end
--[[
解析从平台下达的json。
]]
local function msgUnpack(origin)
print("payload",origin)
local tjsondata,result,errinfo = json.decode(origin)
if result then
return tjsondata["sensorDatas"][1]["sensorsId"],tjsondata["sensorDatas"][1]["switcher"]
else
print("json.decode error",errinfo)
end
end
--[[
用AM2320获取温湿度,每六秒获取一次
]]
sys.taskInit(function()
if i2c.setup(2, i2c.SLOW) ~= i2c.SLOW then
log.error("I2C.init is: ", "fail")
end
while true do
local tmp, hum = AM2320.read(2, 0x5c)
tmp = string.sub(tmp,1,-2).."."..string.sub(tmp, -1)
hum = string.sub(hum,1,-2).."."..string.sub(hum, -1)
print("tastTask.AM2320 data is : ", tmp, hum)
buf = msgPack(tmp,hum)
sys.wait(6000)
end
end)
--[[
连接MQTT,
]]
sys.taskInit(function()
while not socket.isReady() do --判断是否正常联网
sys.wait(10000) --如果未联网,则挂起10000ms,再次判断
end
local mqttc = mqtt.client(misc.getimei()) --实例mqtt client,参数为clinet id,这儿以IMEI作为
while true do
while not mqttc:connect("mqtt.tlink.io", 1883) do --连接tlink的mqtt服务器
sys.wait(2000) --如果连接失败,则挂起2000ms,再次判断
end
if mqttc:subscribe(topic.."/+") then --订阅设备
while true do
local r, data = mqttc:receive(1000) --阻塞
if r then
id,status = msgUnpack(data.payload) --接收成功,则解析数据
print("ID",id)
print("switcher",status)
elseif data == "timeout" then
mqttc:publish(topic,buf) --接收失败,则发送当前传感器数据
end
end
end
end
end)
有几个点需要讲解下:
1、mqttc:subscribe(topic.."/+")
:“/+”为主题通配符
当设备作为订阅者时,订阅的主题可以使用通配符,更灵活的选择需要接收的数据。
举例说明:一个设备有三个开关量传感器
注:点击开关按钮平台对订阅设备发布消息时的主题为:序列号/传感器ID
● 假如A设备订阅的主题为序列号,订阅主题:G0PQM7BG2749G054。(可以收到相同主题发布者发布的数据,当A设备同时发布和订阅同一主题时会收到自己发布的数据)
● 假如A设备订阅所有的传感器,订阅主题:G0PQM7BG2749G054/+。(可以收到所有开关的数值,推荐)
● 假如A设备只订阅“开关1”,订阅主题:G0PQM7BG2749G054/11042。(只能收到“开关1”的数值)
2、mqttc:receive(1000)
阻塞接收消息
阻塞和挂起相似,阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。
说得白话一点:当执行mqttc:receive(1000)
后,当前线程被挂起,此时有个断点,如果在1000ms内,接收到了消息,那么就返回断点处继续执行,然后重新计时。如果没有接收到消息,那么在1000ms后,也回到断点处。
3、tmp = string.sub(tmp,1,-2).."."..string.sub(tmp, -1)
由于不支持浮点数,所以AM2320读取出来的时候经过字符串处理加上小数点,比如"15.3"这样,其实是字符串,
6、烧录到模块,上电,运行成功则可以通过平台查看传感器数据
7、平台下发数据
将开关1改为关闭状态
可以看到对应ID的开关的状态已经变为了0
到此为止,就可以通过Tlink平台发送和接收传感器数据了。