Lua Socket通信给继电器发送指令(Air202)

Raizel ·
更新时间:2024-09-20
· 507 次阅读

我这边用的是Air202的2G模块,利用socket通信给GPIO发送指令,给到外接的继电器控制蜂鸣器:
之前看了很多网上的例子,这次我把Socket通信和GPIO控制继电器集合到一起,下面创建两个.lua文件,第一个main.lua,其中存放一些需要导入的包,根据需要导入自己要用的,代码如下:

PROJECT = "SOCKET-TEST" VERSION = "1.0.0" require "log" LOG_LEVEL = log.LOGLEVEL_TRACE require "sys" --每1分钟查询一次GSM信号强度,每1分钟查询一次基站信息 require "net" net.startQueryAll(60000, 60000) --加载硬件看门狗功能模块 require "wdt" wdt.setup(pio.P0_30, pio.P0_31) --加载网络指示灯功能模块 require "netLed" netLed.setup(true, moduleType == 2 and pio.P1_1 or pio.P2_0, moduleType == 2 and nil or pio.P2_1) require "socketGpio" require "ntp" require "errDump" errDump.request("udp://ota.airm2m.com:9072") --require "ledtest" --led ntp.timeSync() --启动系统框架 sys.init(0, 0) sys.run()

第二个文件为socketGpio.lua,里面存放方法及处理操作,代码如下:

module(..., package.seeall) require "pins" --用到了pin库,该库为luatask专用库,需要进行引用 -- if moduleType == 2 then -- pmd.ldoset(5, pmd.LDO_VMMC)--使用某些GPIO时,必须在脚本中写代码打开GPIO所属的电压域,配置电压输出输入等级,这些GPIO才能正常工作 -- end --设置继电器的GPIO口 local gpio1 = pins.setup(7, 0,pio.PULLDOWN) require "socket" --测试用的服务器信息 local testip, testport = "180.97.81.180", "54580" --数据发送的消息队列 local msgQuene = {} local function insertMsg(data) table.insert(msgQuene, data) end function waitForSend() return #msgQuene > 0 end function outMsgprocess(socketClient) --队列中有消息 while #msgQuene > 0 do --获取消息,并从队列中删除 local outMsg = table.remove(msgQuene, 1) --发送这条消息,并获取发送结果 local result = socketClient:send(outMsg) --发送失败的话立刻返回nil(等同于false) if not result then return end end return true end function inMsgProcess(socketClient) local result, data while true do result, data = socketClient:recv(2000) --接收到数据 if result then --接收成功 log.info("--------------inMsgProcess------------", data) --处理data数据 -- if data:sub(1, 4) == "back" then --收到back开头的数据要回复相同的数据 -- insertMsg(data) -- elseif if data == "open" then --打开继电器操作 insertMsg("Opened") gpio1(1)--操作GPIO给高电平信号 log.info("-----------------gpio is open----------------", data) elseif data == "close" then --关闭继电器操作 insertMsg("Closed") gpio1(0)--操作GPIO给低电平信号 log.info("-----------------gpio is close----------------", data) elseif data == "bin" then --收到bin要回复二进制数组0x11 0x22 0x33 insertMsg(string.fromHex("112233")) elseif data == "time" then --收到time要回复当前时间的时间戳字符串 insertMsg(tostring(os.time())) end --如果msgQuene中有等待发送的数据,则立即退出本循环 if waitForSend() then return true end else --接收失败 log.info("-----------------gpio break----------------", data) break end end --返回结果,处理成功返回true,处理出错返回false return result or data == "timeout" end --启动socket客户端任务 sys.taskInit( function() local retryConnectCnt = 0 --失败次数统计 while true do --是否获取到了分配的ip(是否连上网) if socket.isReady() then --新建一个socket对象,如果是udp只需要把tcp改成udp即可 local socketClient = socket.tcp() --尝试连接指定服务器 if socketClient:connect(testip, testport) then --连接成功 log.info("socketClient已成功连接", "connect success") retryConnectCnt = 0 --失败次数清零 --循环处理接收和发送的数据 while true do if not inMsgProcess(socketClient) then --接收消息处理函数 log.error("longlink.inMsgProcess error") break end if not outMsgprocess(socketClient) then --发送消息处理函数 log.error("longlink.outMsgprocess error") break end end else log.info("socketClient连接失败了", "connect fail") --连接失败 retryConnectCnt = retryConnectCnt + 1 --失败次数加一 end socketClient:close()--断开socket连接 if retryConnectCnt >= 5 then --失败次数大于五次了 link.shut()--强制断开TCP/UDP连接 retryConnectCnt = 0 --失败次数清零 end sys.wait(5000) else retryConnectCnt = 0 --没连上网,失败次数清零 --没连上网 --等待网络环境准备就绪,超时时间是5分钟 sys.waitUntil("IP_READY_IND", 300000) --等完了还没连上? if not socket.isReady() then --进入飞行模式,20秒之后,退出飞行模式 net.switchFly(true) sys.wait(20000) net.switchFly(false) end end end end) --启动心跳包任务 sys.taskInit( function() while true do if socket.isReady() then --连上网再开始运行 insertMsg("heart beat")--队列里塞个消息 sys.wait(10000)--等待10秒 else --没连上网别忘了延时!不然会陷入while true死循环,导致模块无法运行其他代码 sys.wait(1000)--等待1秒 end end end)

PS:代码经过测试,保证没问题~~~~

Air202的2G模块
这是Air202的2G模块板
下面附上接线图,利用usb转TTL线接

在这里插入图片描述
上面是Air202接线图,接HOST_RX和HOST_TX用于连接LuaTools的
下图是自购的2路继电器接线方式和蜂鸣器接线方式
在这里插入图片描述
准备工作做好之后打开LuaTools软件,烧录之前写好的两个lua文件和lib包
在这里插入图片描述
将Air202的板子lib包加载进去,我这边的路径是E:\LuaTools 1.6.4\LuaTools 1.6.4\script\script_LuaTask_V2.3.5\lib,这个是Air202的lib包路径,最新版本的V2.3.5可以在网上下载

在这里插入图片描述
一切准备好之后点击下载按钮,烧录板子,烧录完成后退出,如果有自己写的socket通信地址就用自己写的,如果没有就用下面这个网址测试:
在这里插入图片描述
在这里插入图片描述
右边服务器端已经返回了心跳,左边的LuaTools也连接上,发送open指令打开继电器蜂鸣器响,发送close指令关闭继电器蜂鸣器闭。
下面附上视频连接:

Luat远程控制蜂鸣器(socket通信)


作者:Roger丶Yu



电器 继电器 Lua socket通信 socket

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章