我这边用的是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模块板
下面附上接线图,利用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通信)