123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- PROJECT = "air780e_forwarder"
- VERSION = "1.0.0"
- log.setLevel("DEBUG")
- log.info("main", PROJECT, VERSION)
- log.info("main", "开机原因", pm.lastReson())
- sys = require "sys"
- sysplus = require "sysplus"
- -- 串口配置
- uart.setup(1, 115200, 8, 1, uart.NONE)
- -- 添加硬狗防止程序卡死
- wdt.init(9000)
- sys.timerLoopStart(wdt.feed, 3000)
- -- 设置 DNS
- socket.setDNS(nil, 1, "119.29.29.29")
- socket.setDNS(nil, 2, "223.5.5.5")
- -- 设置 SIM 自动恢复(单位: 毫秒), 搜索小区信息间隔(单位: 毫秒), 最大搜索时间(单位: 秒)
- mobile.setAuto(1000 * 10)
- -- 开启 IPv6
- mobile.ipv6(true)
- -- POWERKEY
- local button_last_press_time, button_last_release_time = 0, 0
- gpio.setup(35, function()
- local current_time = mcu.ticks()
- -- 按下
- if gpio.get(35) == 0 then
- button_last_press_time = current_time -- 记录最后一次按下时间
- return
- end
- -- 释放
- if button_last_press_time == 0 then -- 开机前已经按下, 开机后释放
- return
- end
- if current_time - button_last_release_time < 250 then -- 防止连按
- return
- end
- local duration = current_time - button_last_press_time -- 按键持续时间
- button_last_release_time = current_time -- 记录最后一次释放时间
- if duration > 2000 then
- log.debug("EVENT.POWERKEY_LONG_PRESS", duration)
- sys.publish("POWERKEY_LONG_PRESS", duration)
- elseif duration > 50 then
- log.debug("EVENT.POWERKEY_SHORT_PRESS", duration)
- sys.publish("POWERKEY_SHORT_PRESS", duration)
- end
- end, gpio.PULLUP)
- -- 加载模块
- config = require "config"
- util_http = require "util_http"
- util_netled = require "util_netled"
- util_mobile = require "util_mobile"
- util_location = require "util_location"
- util_notify = require "util_notify"
- -- 串口接收回调
- uart.on(1, "receive", function(id, len)
- local data = uart.read(id, len)
- log.info("uart read:", id, len, data)
- if config.ROLE == "MASTER" then
- -- 主机, 通过队列发送数据
- util_notify.add(data)
- else
- -- 从机, 通过串口发送数据
- uart.write(1, data)
- end
- end)
- -- 短信接收回调
- sms.setNewSmsCb(function(sender_number, sms_content, m)
- local time = string.format("%d/%02d/%02d %02d:%02d:%02d", m.year + 2000, m.mon, m.day, m.hour, m.min, m.sec)
- log.info("smsCallback", time, sender_number, sms_content)
- -- 短信控制
- local is_sms_ctrl = false
- local receiver_number, sms_content_to_be_sent = sms_content:match("^SMS,(+?%d+),(.+)$")
- receiver_number, sms_content_to_be_sent = receiver_number or "", sms_content_to_be_sent or ""
- if sms_content_to_be_sent ~= "" and receiver_number ~= "" and #receiver_number >= 5 and #receiver_number <= 20 then
- sms.send(receiver_number, sms_content_to_be_sent)
- is_sms_ctrl = true
- end
- -- 发送通知
- util_notify.add({ sms_content, "", "发件号码: " .. sender_number, "发件时间: " .. time, "#SMS" .. (is_sms_ctrl and " #CTRL" or "") })
- end)
- sys.taskInit(function()
- -- 等待网络环境准备就绪
- sys.waitUntil("IP_READY")
- util_netled.init()
- -- 开机通知
- if config.BOOT_NOTIFY then sys.timerStart(util_notify.add, 1000 * 5, "#BOOT") end
- -- 定时查询流量
- if config.QUERY_TRAFFIC_INTERVAL and config.QUERY_TRAFFIC_INTERVAL >= 1000 * 60 then
- sys.timerLoopStart(util_mobile.queryTraffic, config.QUERY_TRAFFIC_INTERVAL)
- end
- -- 定时基站定位
- if config.LOCATION_INTERVAL and config.LOCATION_INTERVAL >= 1000 * 30 then
- util_location.refresh(nil, true)
- sys.timerLoopStart(util_location.refresh, config.LOCATION_INTERVAL)
- end
- -- 电源键短按发送测试通知
- sys.subscribe("POWERKEY_SHORT_PRESS", function() util_notify.add("#ALIVE") end)
- -- 电源键长按查询流量
- sys.subscribe("POWERKEY_LONG_PRESS", util_mobile.queryTraffic)
- -- 开启低功耗模式
- if config.LOW_POWER_MODE then
- sys.wait(1000 * 15)
- log.warn("main", "即将关闭 usb 电源, 如需查看日志请在配置中关闭低功耗模式")
- sys.wait(1000 * 5)
- gpio.setup(23, nil)
- gpio.close(33)
- pm.power(pm.USB, false) -- 关闭 USB
- pm.power(pm.GPS, false)
- pm.power(pm.GPS_ANT, false)
- pm.power(pm.DAC_EN, false)
- pm.force(pm.LIGHT) -- 进入休眠
- end
- end)
- sys.run()
|