Luat开源硬件

Luat实例教程:远程修改LCD上二维码

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

本教程目的:开发者通过MQTT协议远程发送内容,终端通过接收到的内容自动生成二维码。

lcd接线图参照lcd教程

1、下载UI的lod

固件下载链接UI

2、代码修改

打开demo/qrcode,修改qrcode.lua文件,选择lcd屏幕芯片,将其他注释掉。

代码下载链接qrcode

注意:lcd芯片配置文件从demo/ui 目录中引用

打开test.lua,修改为下。其思路和远程修改lcd大致相同。流程为:连接mqtt->订阅主题->接收到内容进入回调函数->根据接收到的消息生成二维码。

module(...,package.seeall)
require"qrcode"
require"string"
require"color_standard_spi_st7735"

--LCD分辨率的宽度和高度(单位是像素)
WIDTH,HEIGHT = disp.getlcdinfo()
--[[
函数名:print
功能  :打印接口,此文件中的所有打印都会加上test前缀
参数  :无
返回值:无
]]
local function print(...)
    _G.print("test",...)
end

require"misc"
require"mqtt"
require"common"
module(...,package.seeall)

local ssub,schar,smatch,sbyte,slen = string.sub,string.char,string.match,string.byte,string.len
--测试时请搭建自己的服务器
local PROT,ADDR,PORT = "TCP","lbsmqtt.airm2m.com",1883
local mqttclient


--[[
函数名:print
功能  :打印接口,此文件中的所有打印都会加上test前缀
参数  :无
返回值:无
]]
local function print(...)
    _G.print("test",...)
end

local qos0cnt,qos1cnt = 1,1

--- 二维码显示函数
local function appQRCode(payload)
    disp.clear()
    disp.drawrect(0, 0, WIDTH-1, HEIGHT-1, WHITE)
    local displayWidth = (WIDTH>HEIGHT and HEIGHT or WIDTH)-4
    disp.putqrcode(data, width, displayWidth, (WIDTH-displayWidth)/2, (HEIGHT-displayWidth)/2)
    disp.update()
end

--[[
函数名:pubqos0testsndcb
功能  :“发布1条qos为0的消息”发送结果的回调函数
参数  :
        usertag:调用mqttclient:publish时传入的usertag
        result:true表示发送成功,false或者nil发送失败
返回值:无
]]
local function pubqos0testsndcb(usertag,result)
    print("pubqos0testsndcb",usertag,result)
    sys.timer_start(pubqos0test,10000)
    qos0cnt = qos0cnt+1
end

--[[
函数名:pubqos0test
功能  :发布1条qos为0的消息
参数  :无
返回值:无
]]
function pubqos0test()
    --注意:在此处自己去控制payload的内容编码,mqtt库中不会对payload的内容做任何编码转换
  mqttclient:publish("/v1/device/"..misc.getimei().."/qos0topic","qos0data",0,pubqos0testsndcb,"publish0test_"..qos0cnt) --在mqtt例程中的46行
end



--[[
函数名:subackcb
功能  :MQTT SUBSCRIBE之后收到SUBACK的回调函数
参数  :
        usertag:调用mqttclient:subscribe时传入的usertag
        result:true表示订阅成功,false或者nil表示失败
返回值:无
]]
local function subackcb(usertag,result)
    print("subackcb",usertag,result)
end

--[[
函数名:rcvmessage
功能  :收到PUBLISH消息时的回调函数,根据显示的内容变化终端LCD上的二维码
参数  :
        topic:消息主题(gb2312编码)
        payload:消息负载(原始编码,收到的payload是什么内容,就是什么内容,没有做任何编码转换)
        qos:消息质量等级
返回值:无
]]
local function rcvmessagecb(topic,payload,qos)
    print("rcvmessagecb",topic,payload,qos)
    --显示二维码
    appQRCode(payload)
end

--[[
函数名:discb
功能  :MQTT连接断开后的回调
参数  :无      
返回值:无
]]
local function discb()
    print("discb")
    --20秒后重新建立MQTT连接
    sys.timer_start(connect,20000)
end

--[[
函数名:disconnect
功能  :断开MQTT连接
参数  :无      
返回值:无
]]
local function disconnect()
    mqttclient:disconnect(discb)
end

--[[
函数名:connectedcb
功能  :MQTT CONNECT成功回调函数
参数  :无      
返回值:无
]]
local function connectedcb()
    print("connectedcb")
    --订阅主题
  mqttclient:subscribe({{topic="/v1/device/"..misc.getimei().."/event0",qos=0}}, subackcb, "subscribetest")   
    --注册事件的回调函数,MESSAGE事件表示收到了PUBLISH消息
    mqttclient:regevtcb({MESSAGE=rcvmessagecb})
    --发布一条qos为0的消息
    pubqos0test()
    --20秒后主动断开MQTT连接
    --sys.timer_start(disconnect,20000)
end

--[[
函数名:connecterrcb
功能  :MQTT CONNECT失败回调函数
参数  :
        r:失败原因值
            1:Connection Refused: unacceptable protocol version
            2:Connection Refused: identifier rejected
            3:Connection Refused: server unavailable
            4:Connection Refused: bad user name or password
            5:Connection Refused: not authorized
返回值:无
]]
local function connecterrcb(r)
    print("connecterrcb",r)
end

--[[
函数名:sckerrcb
功能  :SOCKET异常回调函数(注意:此处是恢复异常的一种方式,如果无法满足自己的需求,可自己进行异常处理)
参数  :
        r:string类型,失败原因值
            CONNECT:mqtt内部,socket一直连接失败,不再尝试自动重连
            SVRNODATA:mqtt内部,3倍KEEP ALIVE时间+半分钟,终端和服务器没有任何数据通信,则认为出现通信异常
返回值:无
]]
local function sckerrcb(r)
    print("sckerrcb",r)
    misc.setflymode(true)
    sys.timer_start(misc.setflymode,30000,false)
end

function connect()
    --连接mqtt服务器
    --mqtt lib中,如果socket出现异常,默认会自动重启软件
    --注意sckerrcb参数,如果打开了注释掉的sckerrcb,则mqtt lib中socket出现异常时,不再自动重启软件,而是调用sckerrcb函数
    mqttclient:connect("openluat",240,"luat","luat",connectedcb,connecterrcb--[[,sckerrcb]])
end

local function statustest()
    print("statustest",mqttclient:getstatus())
end

--[[
函数名:imeirdy
功能  :IMEI读取成功,成功后,才去创建mqtt client,连接服务器,因为用到了IMEI号
参数  :无      
返回值:无
]]
local function imeirdy()
    --创建一个mqtt client,默认使用的MQTT协议版本是3.1,如果要使用3.1.1,打开下面的注释--[[,"3.1.1"]]即可
    mqttclient = mqtt.create(PROT,ADDR,PORT--[[,"3.1.1"]])
    --配置遗嘱参数,如果有需要,打开下面一行代码,并且根据自己的需求调整will参数
    --mqttclient:configwill(1,0,0,"/willtopic","will payload")
    --配置clean session标志,如果有需要,打开下面一行代码,并且根据自己的需求配置cleansession;如果不配置,默认为1
    --mqttclient:setcleansession(0)
    --查询client状态测试
    --sys.timer_loop_start(statustest,1000)
    connect()
end

local procer =
{
    IMEI_READY = imeirdy,
}
--注册消息的处理函数
sys.regapp(procer)

3、下载lua脚本

image

Lua脚本下载教程参见Lua下载教程

image image

扫描即可显示对应内容。

上一篇 下一篇

猜你喜欢

热点阅读