Luat开源硬件

LuaTask教程之连接TLINK云平台

2018-03-23  本文已影响17人  Luat物联网通信模块

本教程的目的用Air系列模块连上TLINK云平台

TLINK是集连接,云服务,场景应用,数据分析为一体的云平台,支持包括TCP透传,MQTT,HTTP,MODBUD RTU等协议。

1、注册

访问https://www.tlink.io,并注册账号

2、添加设备

image

3、添加传感器

image

在这儿添加了三个量:分别为温度,湿度,开关1,开关2

4、设置连接,mqtt协议

image image

序列号则为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.."/+"):“/+”为主题通配符

当设备作为订阅者时,订阅的主题可以使用通配符,更灵活的选择需要接收的数据。
举例说明:一个设备有三个开关量传感器

image

注:点击开关按钮平台对订阅设备发布消息时的主题为:序列号/传感器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、烧录到模块,上电,运行成功则可以通过平台查看传感器数据

image

7、平台下发数据

image

将开关1改为关闭状态

image

可以看到对应ID的开关的状态已经变为了0

到此为止,就可以通过Tlink平台发送和接收传感器数据了。

上一篇下一篇

猜你喜欢

热点阅读