--- ykm_rtu 串口驱动 -- @module -- @author lcg -- @release 2018.09.10 require 'utils' -- 设置本文件被全体可见: module(..., package.seeall) require "ril" require "misc" require "audio" module(..., package.seeall) local uid = 2 -- rtu的参数: rtu_para = { id = "00000001", -- server = "yfzhwlw.com", server = "120.27.222.26", port = 9999, user = "ftpbzytest", pwd = "123456", pix = "0" -- 默认高分辨率 } -- 获取rtu所有参数 local rtu_all_para = { id = "", imei = "", server = "", user = "", res = "0" } -- 注意:读rtu所有参数时,都要等到开机,初始化rtu结果通过mqtt上报回传后,才可以读; local imei = "" local imei_id = "" -- 主机下发指令集合 local order = { ReadId = '#READID;', ReadImei = '#READIMEI;', ReadFtpAddr = '#READFTPSERVER;', ReadFtpUser = '#READFTPUSER;', ReadRes = '#READPICRESOLUTION;', ReadLog = '#READLOG;', SetId = "", SeRes = 'PicResolution#', SetFtpServer = 'FTPServer#' .. rtu_para.server .. '#' .. rtu_para.port .. '#*', SetFtpUser = 'FTPUser#' .. rtu_para.user .. '#*', SetFtpPwd = 'FTPPassword#' .. rtu_para.pwd .. '#*', -- WriteImei = SetImei = '#SETIMEI,', -- 重启依科曼rtu: Reboot = '#SYSRESET;', YF_RTU_Reboot = '#RESET;', -- 取消摄像头时间间隔拍照的指令 Cancel_Time_Takephoto = '#SETPICSHOOTINTERVAL,0;', -- 取消摄像头定时刻拍照的指令 Cancel_At_Time_Takephoto = 'PictureTime#24:00:00#*', Cancel_At_Time_Takephoto2 = '#SETFTPPICSENDTIMEPOINT,FFFFFF;', -- 拍照指令: TakePhoto = 'SendPicture#*', --升级指令 Update = '#UPDATE;' } --- console.setup -- @param id 串口id -- @param baudrate 串口波特率 -- @return 无 -- @usage console.setup(1, 115200) function setup(id, baudrate) -- 默认串口2 uart_id = id or 2 -- 默认波特率115200 baudrate = baudrate or 115200 -- -- 初始化串口 uart.setup(uart_id, baudrate, 8, uart.PAR_NONE, uart.STOP_1) end -- 清空串口的接收缓冲区: local function flush_uart_tmp() local clear_uart_tmp = uart.read(uid,'*l') log.error("****************************clear_uart_tmp:",clear_uart_tmp) end -- 设置RTU的ID: local function setid() flush_uart_tmp() uart.write(uid, '*' .. rtu_para.id .. '*(12,XXX=' .. imei_id .. ')*') sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) while tmp:find("Config") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(1000) local cnt = 0 cnt = cnt + 1 if cnt > 5 then cnt = 0 rtu_init_res = "setid timeout!!!" sys.wait(10000) break end end end -- 设置RTU的IMEI: local function setimei() order.SetImei = order.SetImei .. imei ..';' flush_uart_tmp() uart.write(uid, order.SetImei) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp:find("SETOK") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(1000) cnt = cnt + 1 if cnt > 5 then cnt = 0 rtu_init_res = "setimei timeout!!!" sys.wait(10000) break end end end -- function get_rtuinfo() flush_uart_tmp() uart.write(uid, "#READRTUINFO;") sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp:find("RTUINFO") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(1000) cnt = cnt + 1 if cnt > 20 then cnt = 0 rtu_init_res = "read rtu info timeout!!!" sys.wait(10000) break end end return tmp end -- 设置RTU的ftp: local function setftp() order.SetFtpServer = '*' .. rtu_para.id .. '*' .. order.SetFtpServer order.SetFtpUser = '*' .. rtu_para.id .. '*' .. order.SetFtpUser order.SetFtpPwd = '*' .. rtu_para.id .. '*' .. order.SetFtpPwd flush_uart_tmp() uart.write(uid, order.SetFtpServer) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp:find("FTPServer") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(1000) cnt = cnt + 1 if cnt > 5 then cnt = 0 rtu_init_res = "set FTPServer timeout!!!" sys.wait(10000) break end end cnt = 0 flush_uart_tmp() uart.write(uid, order.SetFtpUser) sys.wait(100) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) while tmp:find("FTPUser") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(1000) cnt = cnt + 1 if cnt > 5 then cnt = 0 rtu_init_res = "set FTPUser timeout!!!" sys.wait(10000) break end end cnt = 0 flush_uart_tmp() uart.write(uid, order.SetFtpPwd) sys.wait(100) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) while tmp:find("FTPPassword") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(1000) cnt = cnt + 1 if cnt > 5 then cnt = 0 rtu_init_res = "set FTPPassword timeout!!!" sys.wait(10000) break end end end -- 开机配置图片分辨率: local function setres(res) res = res or 0 order.PicResolution = '*' .. rtu_para.id .. '*' .. 'PicResolution#' .. res .. '#*' flush_uart_tmp() uart.write(uid, order.PicResolution) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) while tmp:find("Set PicResolution") == nil or tmp:find("SendPicture") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(1000) end end -- 屏幕、平台下发配置图片分辨率: function control_setres(res) res = res or 0 order.SeRes = '*' .. imei_id .. '*' .. 'PicResolution#' .. res .. '#*' flush_uart_tmp() uart.write(uid, order.SeRes) log.info("order.SeRes:",order.SeRes) -- sys.wait(100) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) -- while tmp:find("OK") == nil do -- local cnt = 0 -- tmp = uart.read(uid,'*l') -- log.info("tmp:",tmp) -- cnt = cnt + 1 -- -- 如果超过500*10ms = 5s,跳出循环 -- if cnt >= 10 then -- break -- end -- sys.wait(500) -- end end -- 配置RTU参数: local function RtuConfig() -- 设置Imei: setimei() sys.wait(1000) -- 设置FTP服务器: setftp() sys.wait(1000) -- 设置默认分辨率:高 -- setres(9) -- sys.wait(1000) -- 设置ID: setid() sys.wait(1000) -- 重启:rtu flush_uart_tmp() -- uart.write(uid,order.Reboot) uart.write(uid,order.YF_RTU_Reboot) end -- 重启依科曼rtu: function RtuReboot() flush_uart_tmp() uart.write(uid,order.Reboot) end -- 升级云飞rtu: function YF_RtuUpdate() local u_cnt = 0 flush_uart_tmp() uart.write(uid,order.Update) local temp = uart.read(uid,'*l') while temp == nil or temp == "" do temp = uart.read(uid,'*l') u_cnt = u_cnt + 1 if u_cnt == 100 then temp = -1 u_cnt = 0 break end sys.wait(100) end log.warn("return data is=============================:",temp) return temp end -- 重启云飞rtu: function YF_RTU_Reboot() flush_uart_tmp() uart.write(uid,order.YF_RTU_Reboot) end --上传RTU-LOG function UploadLog() local u_cnt = 0 flush_uart_tmp() uart.write(uid,order.ReadLog) local temp = uart.read(uid,'*l') while temp == nil or temp == "" do temp = uart.read(uid,'*l') u_cnt = u_cnt + 1 if u_cnt == 100 then u_cnt = 0 temp = -1 break end sys.wait(100) end log.warn("return log status=============================:",temp) return temp end -- 取消rtu的定时间间隔拍照: function Rtu_Cancel_Time() flush_uart_tmp() uart.write(uid,order.Cancel_Time_Takephoto) end -- 取消rtu的定时刻拍照: function Rtu_Cancel_AtTime() flush_uart_tmp() uart.write(uid,'*' .. imei_id .. '*' .. order.Cancel_At_Time_Takephoto) sys.wait(2000) flush_uart_tmp() -- uart.write(uid,order.Cancel_At_Time_Takephoto2) -- flush_uart_tmp() end -- 拍照: function takephoto() local take_err_flag,cnt = 0,0 flush_uart_tmp() uart.write(uid,order.TakePhoto) sys.wait(2000) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) while tmp:find("ok") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(200) cnt = cnt + 1 -- 如果超过100*100ms = 10s,跳出循环 if cnt >= 25 then cnt = 0 flush_uart_tmp() --uart.write(uid,order.TakePhoto) sys.wait(2000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) while tmp:find("ok") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(200) cnt = cnt + 1 -- 如果超过100*100ms = 10s,跳出循环 if cnt >= 25 then cnt = 0 flush_uart_tmp() --uart.write(uid,order.TakePhoto) sys.wait(2000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) while tmp:find("ok") == nil do tmp = uart.read(uid,'*l') log.info("tmp:",tmp) sys.wait(200) cnt = cnt + 1 -- 如果超过100*100ms = 10s,跳出循环 if cnt >= 25 then take_err_flag = 1 break end end break end end break end end if take_err_flag == 0 then -- 接收到拍照指令的响应后,播放快门声音 audio.play('/ldata/kuaimen.mp3') log.warn("===================takephoto is ok!!!") else -- 播放音效标识拍照失败 audio.play('/ldata/ykmrtuok.mp3') log.warn("===================takephoto is fail!!!") end return tmp end -- rtu初始化的结果: rtu_init_res = "" sys.taskInit( function() setup(uid, 9600) -- 上点开机15s后,开始设置rtu: sys.wait(30000) imei = misc.getimei() imei_id = string.sub(imei, -8, -1) -- 注意:防止imei的后八位的前几位连续位0:要进行8位格式化: imei_id = string.format("%08d",imei_id) -- 拼接拍照的命令格式: order.TakePhoto = '*' .. imei_id .. '*' .. order.TakePhoto log.info("----------------------------imei_id:",imei_id) -- 读取rtu信息: -- 1、读取rtu的id,判断是否需要重新设置;同时id发送命令用到; flush_uart_tmp() uart.write(uid, order.ReadId) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while true do while tmp:match("#RTUID,(.+);") == nil or tmp == "" do flush_uart_tmp() uart.write(uid, order.ReadId) sys.wait(1000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) cnt = cnt +1 if cnt >= 60 then log.warn("rtu has no reponse!!!") rtu_init_res = "rtu has no reponse!!!" sys.wait(1000) -- rtu配置完成,播放提示音: audio.play('/ldata/button.mp3') sys.wait(300) audio.play('/ldata/button.mp3') sys.wait(300) audio.play('/ldata/button.mp3') sys.wait(300) audio.play('/ldata/button.mp3') sys.wait(300) return rtu_init_res end end local test = tmp:match("#RTUID,(.+);") log.warn("type(test):",type(test),test) if type(test) == "string" then log.warn(" is string") break end end rtu_para.id = tmp:match("#RTUID,(.+);") -- rtu_para.id = string.format("%08d",rtu_para.id) -- 得到:#RTUID,0000 0001; log.info("rtu_para.id:", rtu_para.id) -- 判断:如果不是imei的后八位,则重新设置rtu参数: -- uart.write(uid, '*' .. rtu_para.id .. '*(12,XXX=' .. '00000001' .. ')*') -- local addr = read_rtu_ftpaddr() -- log.error("read_rtu_ftpaddr:",addr) rtu_init_res = "read rtu id is:" .. rtu_para.id if rtu_para.id == 1 or rtu_para.id == '1' then log.warn("rtu_init_res is 1!!!") rtu_para.id = "00000001" end sys.wait(10000) -- if rtu_para.id ~= string.sub(misc.getimei(), -8, -1) or string.match(addr,"yfzhwlw") == "yfzhwlw" then if rtu_para.id ~= imei_id then -- Rtu_Cancel_Time() -- sys.wait(2000) -- Rtu_Cancel_AtTime() sys.wait(5000) rtu_init_res = "start to set rtu para!" sys.wait(2000) RtuConfig() log.info("restart rtu here!") rtu_init_res = "rtu match ok and restarting!" sys.wait(30000) -- 30s后,等rtu重启的时间后,再播放成功的声音; -- rtu配置完成,播放提示音: audio.play('/ldata/ykmrtuok.mp3') sys.wait(1000) audio.play('/ldata/ykmrtuok.mp3') sys.wait(1000) audio.play('/ldata/ykmrtuok.mp3') sys.wait(1000) return rtu_init_res else -- Rtu_Cancel_Time() -- sys.wait(2000) -- Rtu_Cancel_AtTime() sys.wait(5000) log.info("rtu has matched and need not config!") rtu_init_res = "rtu has matched and need not config!!" sys.wait(10000) -- rtu配置完成,播放提示音: audio.play('/ldata/ykmrtuok.mp3') sys.wait(1000) audio.play('/ldata/ykmrtuok.mp3') sys.wait(1000) audio.play('/ldata/ykmrtuok.mp3') sys.wait(1000) return rtu_init_res end end ) function read_rtu_id() -- 读取rtu的id flush_uart_tmp() uart.write(uid, order.ReadId) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp == nil or tmp == "" do flush_uart_tmp() uart.write(uid, order.ReadId) sys.wait(1000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) cnt = cnt +1 if cnt >= 6 then log.warn("read rtu id has no reponse") rtu_init_res = "read rtu id has no reponse" return rtu_init_res end end rtu_all_para.id = tmp:match("#RTUID,(.+);") rtu_all_para.id = string.format("%08d",rtu_all_para.id) log.info("rtu_all_para.id:", rtu_all_para.id) return rtu_all_para.id end function read_rtu_imei() -- 读取rtu imei flush_uart_tmp() uart.write(uid, order.ReadImei) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp == nil or tmp == "" do flush_uart_tmp() uart.write(uid, order.ReadImei) sys.wait(1000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) cnt = cnt +1 if cnt >= 6 then log.warn("read rtu imei has no reponse") rtu_init_res = "read rtu imei has no reponse" return rtu_init_res end end rtu_all_para.imei = tmp:match("#IMEI,(.+);") -- rtu_all_para.imei = string.format("%015d",rtu_all_para.imei) log.info("rtu_all_para.imei:", rtu_all_para.imei) return rtu_all_para.imei end function read_rtu_ftpaddr() -- 读取rtu ftpaddr flush_uart_tmp() uart.write(uid, order.ReadFtpAddr) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp == nil or tmp == "" do flush_uart_tmp() uart.write(uid, order.ReadFtpAddr) sys.wait(1000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) cnt = cnt +1 if cnt >= 6 then log.warn("read rtu ftpaddr has no reponse") rtu_init_res = "read rtu ftpaddr has no reponse" return rtu_init_res end end rtu_all_para.server = tmp:match("#FTPSERVERINF,(.+);") log.info("rtu_all_para.server:", rtu_all_para.server) return rtu_all_para.server end function read_rtu_ftpuser() -- 读取rtu ftpuser flush_uart_tmp() uart.write(uid, order.ReadFtpUser) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp == nil or tmp == "" do flush_uart_tmp() uart.write(uid, order.ReadFtpUser) sys.wait(1000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) cnt = cnt +1 if cnt >= 6 then log.warn("read rtu ftpuser has no reponse") rtu_init_res = "read rtu ftpuser has no reponse" return rtu_init_res end end rtu_all_para.user = tmp:match("#FTPUSERINF,(.+);") log.info("rtu_all_para.user:", rtu_all_para.user) return rtu_all_para.user end function read_rtu_res() -- 读取rtu res flush_uart_tmp() uart.write(uid, order.ReadRes) sys.wait(100) local tmp = uart.read(uid,'*l') log.info("tmp:",tmp) local cnt = 0 while tmp == nil or tmp == "" do flush_uart_tmp() uart.write(uid, order.ReadRes) sys.wait(1000) tmp = uart.read(uid,'*l') log.info("tmp:",tmp) cnt = cnt +1 if cnt >= 6 then log.warn("read rtu res has no reponse") rtu_init_res = "read rtu res has no reponse" return rtu_init_res end end rtu_all_para.res = tmp:match("#PICRESOLUTIONINF,(.+);") log.info("rtu_all_para.res:", rtu_all_para.res) return rtu_all_para.res end -- 注意:读rtu所有参数时,都要等到开机,初始化rtu结果通过mqtt上报回传后,才可以读; function read_rtu_para() rtu_all_para.id = read_rtu_id() rtu_all_para.imei = read_rtu_imei() rtu_all_para.server = read_rtu_ftpaddr() rtu_all_para.user = read_rtu_ftpuser() rtu_all_para.res = read_rtu_res() local dat = json.encode(rtu_all_para) log.info("upload read_rtu_para:", dat) return dat end function Rtu_Set_Ftp(host,port,user,pwd) log.error("%%%%%%%%%%%%%%%%%%%%%%%%%%Rtu_Set_Ftp is running:") -- *00000001*FTPServer#yfzhwlw.com#21#* local set_ftpserver = '*' .. rtu_para.id .. '*FTPServer#' .. host .. '#' .. port .. '#*' local set_ftpuser = '*' .. rtu_para.id .. '*FTPUser#' .. user .. '#*' local set_ftppwd = '*' .. rtu_para.id .. '*FTPPassword#' .. pwd .. '#*' log.error("set_ftpserver will set:",set_ftpserver) log.error("set_ftpuser will set:",set_ftpuser) log.error("set_ftppwd will set:",set_ftppwd) flush_uart_tmp() uart.write(uid, set_ftpserver) sys.wait(100) local set_ftpserver_tmp = uart.read(uid,'*l') log.info("set_ftpserver_tmp:",set_ftpserver_tmp) while set_ftpserver_tmp:find("Set FTPServer OK") == nil do set_ftpserver_tmp = uart.read(uid,'*l') log.info("set_ftpserver_tmp:",set_ftpserver_tmp) sys.wait(1000) end flush_uart_tmp() uart.write(uid, set_ftpuser) sys.wait(100) local set_ftpuser_tmp = uart.read(uid,'*l') log.info("set_ftpuser_tmp:",set_ftpuser_tmp) while set_ftpuser_tmp:find("Set FTPUser OK") == nil do set_ftpuser_tmp = uart.read(uid,'*l') log.info("set_ftpuser_tmp:",set_ftpuser_tmp) sys.wait(1000) end flush_uart_tmp() uart.write(uid, set_ftppwd) sys.wait(100) local set_ftppwd_tmp = uart.read(uid,'*l') log.info("set_ftppwd_tmp:",set_ftppwd_tmp) while set_ftppwd_tmp:find("Set FTPPassword OK") == nil do set_ftppwd_tmp = uart.read(uid,'*l') log.info("set_ftppwd_tmp:",set_ftppwd_tmp) sys.wait(1000) end return set_ftpserver_tmp,set_ftpuser_tmp,set_ftppwd_tmp end