diff --git a/script/main.lua b/script/main.lua index 9ab88e7..c1bad63 100644 --- a/script/main.lua +++ b/script/main.lua @@ -67,7 +67,7 @@ sms.setNewSmsCb( function(num, txt, metas) log.info("smsCallback", num, txt, metas and json.encode(metas) or "") util_netled.blink(50, 50, 5000) - util_notify.send({txt, "", "发件人号码: " .. num, "#SMS"}) + util_notify.add({txt, "", "发件人号码: " .. num, "#SMS"}) end ) @@ -80,7 +80,7 @@ sys.taskInit( -- 开机通知 if config.BOOT_NOTIFY then - util_notify.send("#BOOT") + util_notify.add("#BOOT") end -- 定时查询流量 @@ -97,7 +97,7 @@ sys.taskInit( sys.subscribe( "POWERKEY_SHORT_PRESS", function() - util_notify.send("#ALIVE") + util_notify.add("#ALIVE") end ) -- 电源键长按查询流量 diff --git a/script/util_notify.lua b/script/util_notify.lua index f062220..27d242f 100644 --- a/script/util_notify.lua +++ b/script/util_notify.lua @@ -1,5 +1,10 @@ local util_notify = {} +-- 在通知内容加入设备信息 +local is_append_more_info = true +-- 消息队列 +local msg_queue = {} + local function urlencodeTab(params) local msg = {} for k, v in pairs(params) do @@ -192,6 +197,39 @@ local function notifyToNextSmtpProxy(msg) return util_http.fetch(nil, "POST", config.NEXT_SMTP_PROXY_API, header, urlencodeTab(body)) end +local function append() + local msg = "\n" + + -- 运营商 + local oper = util_mobile.getOper(true) + if oper ~= "" then + msg = msg .. "\n运营商: " .. oper + end + + -- 信号 + local rsrp = mobile.rsrp() + if rsrp ~= 0 then + msg = msg .. "\n信号: " .. rsrp .. "dBm" + end + + -- 频段 + local band = util_mobile.getBand() + if band >= 0 then + msg = msg .. "\n频段: B" .. band + end + + -- 位置 + local _, _, map_link = util_location.get() + if map_link ~= "" then + msg = msg .. "\n位置: " .. map_link -- 这里使用 U+00a0 防止换行 + end + + return msg +end + +--- 发送通知 +-- @param msg 消息内容 +-- @return true: 发送成功 or 出错但无需重试, false: 发送失败, 需要重发 function util_notify.send(msg) log.info("util_notify.send", "发送通知", config.NOTIFY_TYPE) @@ -200,34 +238,15 @@ function util_notify.send(msg) end if type(msg) ~= "string" then log.error("util_notify.send", "发送通知失败", "参数类型错误", type(msg)) - return + return true + end + if msg == "" then + log.error("util_notify.send", "发送通知失败", "消息为空") + return true end - local model = hmeta.model() or "" - local simid = mobile.simid() - local iccid = mobile.iccid(simid) or "" - local rsrp = mobile.rsrp() - local mcc, mnc, band = util_mobile.mcc, util_mobile.mnc, util_mobile.band - local oper = util_mobile.getOper(true) - local lat, lng = util_location.getCoord() - local map_url = "https://apis.map.qq.com/uri/v1/marker?coord_type=1&marker=title:+;coord:" .. lat .. "," .. lng - - msg = msg .. "\n" - if model then - msg = msg .. "\nMODEL: " .. model - end - if iccid then - msg = msg .. "\nICCID: " .. iccid - end - if oper then - msg = msg .. "\n运营商: " .. oper - end - msg = msg .. "\n信号: " .. rsrp .. "dBm" - if band ~= "" then - msg = msg .. "\n频段: B" .. band - end - if lat ~= 0 and lng ~= 0 then - msg = msg .. "\n位置: " .. map_url + if is_append_more_info then + msg = msg .. append() end -- 判断通知类型 @@ -248,30 +267,51 @@ function util_notify.send(msg) notify = notifyToNextSmtpProxy else log.error("util_notify.send", "发送通知失败", "未配置 `config.NOTIFY_TYPE`") - return + return true end - sys.taskInit( - function() - local max_retry = 10 - local retry_count = 0 - - while retry_count < max_retry do - util_netled.blink(50, 50) - local code, headers, body = notify(msg) - util_netled.blink() - if code == 200 then - log.info("util_notify.send", "发送通知成功", "retry_count:", retry_count, "code:", code, "body:", body) - break - else - retry_count = retry_count + 1 - log.error("util_notify.send", "发送通知失败", "retry_count:", retry_count, "code:", code, "body:", body) - util_netled.blink(500, 200, 3000) - sys.wait(10000) - end - end - end - ) + local code, headers, body = notify(msg) + if code == nil then + return true + end + if code == 200 then + log.info("util_notify.send", "发送通知成功", "code:", code, "body:", body) + return true + else + log.error("util_notify.send", "发送通知失败", "code:", code, "body:", body) + return false + end end +--- 添加到消息队列 +-- @param msg 消息内容 +function util_notify.add(msg) + table.insert(msg_queue, msg) + log.debug("util_notify.add", "添加到消息队列, 当前队列长度:", #msg_queue) +end + +-- 轮询消息队列 +-- 发送成功则从消息队列中删除 +-- 发送失败则等待下次轮询 +local function poll() + local msg + while true do + -- 消息队列非空, 且网络已注册 + if #msg_queue > 0 and mobile.status() == 1 then + log.debug("util_notify.poll", "轮询消息队列中...", "当前队列长度:", #msg_queue) + msg = msg_queue[1] + if util_notify.send(msg) then + table.remove(msg_queue, 1) + sys.wait(100) + else + sys.wait(2000) + end + else + sys.wait(350) + end + end +end + +sys.taskInit(poll) + return util_notify