myConfig.lua
myConfig={
App={
Version="v1.0.0_2021_05_15",
Name="雷达物位计采集",
Description="雷达物位计采集,http上报"
},
server={--服务器参数设置
channel="mqtt",
mqtt={
Subscribe_Topic="cfiot/LevelMeter/cmd_channel",--订阅主题名,接收后台下发命令
Publish_Topic="cfiot/LevelMeter/data_channel"--发布主题名,上报数据
},
http={
url=""
}
},
Serial={--串口参数
portName="Serial1",
Baud=9600,
DataBits=8,
Parity="None",
StopBits=1,
SendDelay=100
},
Collection={
interval=20000,--采集间隔
cmdArray={--采集数据列表
{0x01,0x03,0x00,0x00,0x00,0x02,0xc4,0x0b},
{0x01,0x03,0x00,0x01,0x00,0x02,0x95,0xcb},
{0x01,0x03,0x00,0x02,0x00,0x02,0x65,0xcb},
{0x01,0x03,0x00,0x03,0x00,0x02,0x34,0x0b}
}
}
}
return myConfig
main.lua
cf_iot=require("cf_iot")
common=require("common")
json=require("json")
mqtt=require("mqtt")
http=require("http")
hardware=require("hardware")
PackagePath=this().PackagePath--当前虚拟机加载用户自定义模块的根目录
LuaLibPath=this().LuaLibPath--当前虚拟机加载用户自定义模块的根目录
package.path = PackagePath .. [[/?/init.lua;]] .. PackagePath .. [[/?.lua;]] .. package.path
package.path = LuaLibPath .. [[/?/init.lua;]] .. LuaLibPath .. [[/?.lua;]] .. package.path
require "General_Function"
require "myConfig"
local FirmwareInfo=json.decode(cf_iot.GetFirmwareInfo())
local hexArray={}--数据返回列表
local hexArray_index=0
function main()
Debug=true
LuaVMName=this().LuaVMName--当前虚拟机的名称
cf_iot.SetDebug(LuaVMName,Debug)
cf_iot.SetWatchdogTimeout(LuaVMName,300)
if myConfig.server.channel=="mqtt" then
mqtt_init()
end
hardware_init()
--看门狗定时器
cf_iot.AddTimer(LuaVMName,"MainTimer",5000,function()
cf_iot.Watchdog(LuaVMName,1)--发送看门狗信号
end)
--信号采集定时器
cf_iot.AddTimer(LuaVMName,"SignalAcquisitionTimer",myConfig.Collection.interval,function()
clearHexArray()
for i,cmd in pairs(myConfig.Collection.cmdArray) do
hardware.SerialWriteDataByte(myConfig.Serial.portName,cmd)
end
--等待数据
local waitTime=myConfig.Serial.SendDelay * (table.getn(myConfig.Collection.cmdArray)+2)
cf_iot.AddTimer(LuaVMName,"WaitingDataTimer",2000,function()
cf_iot.DeleteTimer(LuaVMName,"WaitingDataTimer")
if hexArray_index ~= 0 then
local data={
MsgType="data",
IMEI=FirmwareInfo.ModuleState.IMEI,
CCID=FirmwareInfo.ModuleState.CCID,
Msg=hexArray
}
UploadData(json.encode(data))
clearHexArray()
end
end)
end)
end
function UploadData(jsonstr)
--数据上传
if jsonstr~=nil then
if myConfig.server.channel=="mqtt" then
mqtt.Publish(myConfig.server.mqtt.Publish_Topic,0,false,jsonstr)
end
if myConfig.server.channel=="http" then
http.Post(myConfig.server.http.url,"data=" .. jsonstr)
end
end
end
function clearHexArray()
--清空缓存数据
hexArray_index=0
for i,v in pairs(hexArray) do
hexArray[i]=""
end
end
function hardware_init()
--串口初始化
hardware.SetSerialDataRoute(1)--设置串口数据路由,0:服务器,1:lua虚拟机
local Hardware_OnEvent= function(data)--硬件事件回调函数
local portName=data.portName
local EventName=data.EventName
local Message=portName ..":".. EventName .. ":" .. data.Message
local data={
MsgType="Hardware_OnEvent",
IMEI=FirmwareInfo.ModuleState.IMEI,
CCID=FirmwareInfo.ModuleState.CCID,
Msg=Message
}
UploadData(json.encode(data))
end
hardware.SetHardwareOnEvent(LuaVMName,Hardware_OnEvent)
local Serial1_OnData= function(data)--串口1数据处理函数
--16进程字符数组 data.hexArray
--byte数组data.byteArray
--print(data.hexArray,data.byteArray)
local cmdID=data.hexArray[2]--功能码
local Node_Address=data.byteArray[1]--获取该数据的节点地址
if Node_Address==1 and cmdID=="03" then
hexArray_index=hexArray_index+1
if hexArray_index>=1 and hexArray_index<=table.getn(myConfig.Collection.cmdArray) then
hexArray[hexArray_index]=table.concat(data.hexArray)
end
end
end
hardware.SetSerialWriteDataSleep(myConfig.Serial.portName,myConfig.Serial.SendDelay)--设置串口发送数据包后延迟时间,单位毫秒,延时是在CFIOT固件中执行,防止粘包
hardware.SetSerialOnDataHandler(LuaVMName,myConfig.Serial.portName,Serial1_OnData)
hardware.SerialOpen(myConfig.Serial.portName,myConfig.Serial.Baud,myConfig.Serial.DataBits,myConfig.Serial.Parity,myConfig.Serial.StopBits)--打开串口1
end
function mqtt_init()
mqtt.WaitMQTTClientReady()--等待mqtt主通道准备好
end