init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
--[[
|
||||
@module main
|
||||
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
|
||||
@version 001.999.000
|
||||
@date 2025.10.15
|
||||
@author 王城钧
|
||||
@usage
|
||||
1. sms_app:加载短信发送+短信接收+短信转发到企业微信/钉钉/飞书平台功能模块
|
||||
2. sntp_app:启动sntp时间同步功能模块,同步网络时间
|
||||
]]
|
||||
|
||||
|
||||
--[[
|
||||
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
|
||||
PROJECT:项目名,ascii string类型
|
||||
可以随便定义,只要不使用,就行
|
||||
VERSION:项目版本号,ascii string类型
|
||||
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
|
||||
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
|
||||
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为999
|
||||
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
|
||||
]]
|
||||
PROJECT = "sms_app"
|
||||
VERSION = "001.999.000"
|
||||
|
||||
-- 在日志中打印项目名和项目版本号
|
||||
log.info("main", PROJECT, VERSION)
|
||||
|
||||
|
||||
|
||||
-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
|
||||
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
|
||||
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
|
||||
-- 启动errDump日志存储并且上传功能,600秒上传一次
|
||||
-- if errDump then
|
||||
-- errDump.config(true, 600)
|
||||
-- end
|
||||
|
||||
|
||||
-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
|
||||
-- 可以使用合宙的iot.openluat.com平台进行远程升级
|
||||
-- 也可以使用客户自己搭建的平台进行远程升级
|
||||
-- 远程升级的详细用法,可以参考fota的demo进行使用
|
||||
|
||||
|
||||
-- 启动一个循环定时器
|
||||
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
|
||||
-- 方便分析内存使用是否有异常
|
||||
-- sys.timerLoopStart(function()
|
||||
-- log.info("mem.lua", rtos.meminfo())
|
||||
-- log.info("mem.sys", rtos.meminfo("sys"))
|
||||
-- end, 3000)
|
||||
|
||||
|
||||
-- 加载sms应用功能模块
|
||||
require "sms_app"
|
||||
|
||||
-- 加载sntp时间同步应用功能模块
|
||||
require "sntp_app"
|
||||
|
||||
-- 启动系统调度(必须放在最后)
|
||||
sys.run()
|
||||
@@ -0,0 +1,161 @@
|
||||
## 功能模块介绍
|
||||
|
||||
1、main.lua:主程序入口;
|
||||
|
||||
2、sms_app.lua:短信发送+短信接收+短信转发到企业微信/钉钉/飞书平台功能模块;
|
||||
|
||||
3、sntp_app.lua:sntp时间同步功能模块
|
||||
|
||||
## 演示功能概述
|
||||
|
||||
使用Air780EPM 开发板测试sms功能
|
||||
|
||||
1、短信发送功能;
|
||||
|
||||
2、短信接收功能;
|
||||
|
||||
3、NTP时间同步
|
||||
|
||||
## 演示硬件环境
|
||||
|
||||

|
||||
|
||||
1、Air780EPM V1.3版本开发板一块+手机sim卡一张+4g天线一根:
|
||||
|
||||
- sim卡插入开发板的sim卡槽
|
||||
|
||||
- 天线装到开发板上
|
||||
|
||||
2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
|
||||
|
||||
- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
|
||||
|
||||
- TYPE-C USB数据线直接插到开发板的TYPE-C USB座子,另外一端连接电脑USB口;
|
||||
|
||||
## 演示软件环境
|
||||
|
||||
1、Luatools下载调试工具
|
||||
|
||||
2、[必须使用Air780EPM V2018或者更高版本](https://docs.openluat.com/air780epm/luatos/firmware/version/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V2018-106固件对比验证)
|
||||
|
||||
## 演示核心步骤
|
||||
|
||||
1、搭建好硬件环境
|
||||
|
||||
2、修改sms_forward.lua文件中的webhook_feishu和webhook_dingding以及webhook_weixi,如需加密也可以填写对应app的secret。
|
||||
|
||||
3、烧录内核固件和sms相关demo成功后,自动开机运行。
|
||||
|
||||
4、可以看到代码运行结果如下,基本都是如下情况:
|
||||
|
||||
以下是使用sms demo演示的日志
|
||||
|
||||
日志中如果出现以下类似打印则说明短信转发成功:
|
||||
|
||||
```
|
||||
[2025-11-13 17:06:24.610][000000007.198] I/user.现在可以收发短信
|
||||
|
||||
[2025-11-13 17:06:24.618][000000007.199] I/user.mobile.number(id) = +8617374070417
|
||||
|
||||
[2025-11-13 17:06:24.621][000000007.199] I/user.mobile.iccid(id) = 89861123045773964016
|
||||
|
||||
[2025-11-13 17:06:24.627][000000007.199] I/user.mobile.simid(id) = 0
|
||||
|
||||
[2025-11-13 17:06:24.631][000000007.200] I/user.mobile.imsi(index) = 460115188098492
|
||||
|
||||
[2025-11-13 17:06:24.636][000000007.200] D/sms pdu len 18
|
||||
|
||||
[2025-11-13 17:06:24.639][000000007.202] I/user.发送查询短信 这是第1次发送 发送结果: 成功
|
||||
|
||||
[2025-11-13 17:06:24.644][000000007.202] I/user.等待10分钟
|
||||
|
||||
[2025-11-13 17:06:24.790][000000007.384] luat_sms_proc 1239:[DIO 1239]: CMI_SMS_SEND_MSG_CNF is in
|
||||
|
||||
[2025-11-13 17:06:24.797][000000007.385] D/sms long sms callback seqNum = 1
|
||||
|
||||
[2025-11-13 17:06:24.801][000000007.386] I/user.sms send result true
|
||||
|
||||
[2025-11-13 17:06:26.549][000000009.138] luat_sms_proc 1236:[DIO 1236]: CMI_SMS_NEW_MSG_IND is in
|
||||
|
||||
[2025-11-13 17:06:26.572][000000009.138] D/sms dcs 2 | 0 | 0 | 0
|
||||
|
||||
[2025-11-13 17:06:26.587][000000009.139] I/sms long-sms, wait more frags 1/3
|
||||
|
||||
[2025-11-13 17:06:26.653][000000009.245] luat_sms_proc 1236:[DIO 1236]: CMI_SMS_NEW_MSG_IND is in
|
||||
|
||||
[2025-11-13 17:06:26.658][000000009.246] D/sms dcs 2 | 0 | 0 | 0
|
||||
|
||||
[2025-11-13 17:06:26.664][000000009.246] I/sms long-sms, wait more frags 2/3
|
||||
|
||||
[2025-11-13 17:06:26.861][000000009.455] luat_sms_proc 1236:[DIO 1236]: CMI_SMS_NEW_MSG_IND is in
|
||||
|
||||
[2025-11-13 17:06:26.889][000000009.455] D/sms dcs 2 | 0 | 0 | 0
|
||||
|
||||
[2025-11-13 17:06:26.908][000000009.455] I/sms long-sms is ok
|
||||
|
||||
[2025-11-13 17:06:26.924][000000009.457] I/user.收到来自短信: 10001
|
||||
|
||||
[2025-11-13 17:06:26.942][000000009.457] I/user.num是 10001
|
||||
|
||||
[2025-11-13 17:06:26.956][000000009.458] I/user.收到来自10001的短信:尊敬的用户:截至11月13日17时6分,您的账户使用情况如下:
|
||||
本月消费:15.60元
|
||||
可用余额:21.84元
|
||||
仅供参考,实际费用以出账账单为准。更多详情点击:http://a.189.cn/IRAYnu 进入“中国电信”APP。也可关注“浙江电信”微信公众号进行快速查询:https://qy.k189.cn/hfcx?source=dt
|
||||
|
||||
[2025-11-13 17:06:26.974][000000009.458] I/user.当前网络 true 1
|
||||
|
||||
[2025-11-13 17:06:26.987][000000009.458] I/user.转发到飞书
|
||||
|
||||
[2025-11-13 17:06:26.995][000000009.460] I/user.timestamp 1763024786
|
||||
|
||||
[2025-11-13 17:06:27.003][000000009.460] I/user.sign 5cVjGl0UHK4BZiBTdjBfjzTE8a35JEmTQK/rXf75oLg=
|
||||
|
||||
[2025-11-13 17:06:27.015][000000009.460] I/user.url https://open.feishu.cn/open-apis/bot/v2/hook/673d1e1d-0c7e-4d34-b7f0-48bdb4c4d03a
|
||||
|
||||
[2025-11-13 17:06:27.025][000000009.462] I/user.feishu
|
||||
|
||||
[2025-11-13 17:06:27.040][000000009.462] {"content":{"text":"我的id是nil,Thu Nov 13 17:06:26 2025,Air780EPM, 10001发来短信,内容是:尊敬的用户:截至11月13日17时6分,您的账户使用情况如下:\n本月消费:15.60元\n可用余额:21.84元\n仅供参考,实际费用以出账账单为准。更多详情点击:http:\/\/a.189.cn\/IRAYnu 进入“中国电信”APP。也可关注“浙江电信”微信公众号进行快速查询:https:\/\/qy.k189.cn\/hfcx?source=dt"},"sign":"5cVjGl0UHK4BZiBTdjBfjzTE8a35JEmTQK\/rXf75oLg=","msg_type":"text","timestamp":"1763024786"}
|
||||
|
||||
[2025-11-13 17:06:27.054][000000009.467] dns_run 676:open.feishu.cn state 0 id 2 ipv6 0 use dns server2, try 0
|
||||
|
||||
[2025-11-13 17:06:27.067][000000009.488] dns_run 693:dns all done ,now stop
|
||||
|
||||
[2025-11-13 17:06:27.978][000000010.568] I/user.飞书机器人 success 200
|
||||
|
||||
[2025-11-13 17:06:27.991][000000010.568] {"Request-Id":"8b2b41bb-44fb-407e-a8ec-d7227179de61","X-Lgw-Dst-Svc":"aiRj-YZHJsmNioW5sRb1upcRDZKIYZgCiYCAuFKmezjGgFkw3Oe1lIOCyvhP_Tbkq8sMeWcR51hfWhQREaNR7XZZN_6jaoXyeKbKzxpJrUso_-lOboFMGg6LjrNjJrjvrdYhVd5fvKkNKkUf-sAMG-BN_ukN8d0A5HuDZNRFu4krRWwvY3Ee1UEjwIIS9IiHAGYb7HVYNS_NasM_sSXDswFx41MqTr9m9Yl_tY5bwOh1P0-dZRPL2GI61HqmhbaL0wR3NG8_Ppr3ZtvmLstaKA_CtycSJNqyd967TLYAUGPnCt6yyCMhH5skrUex-z6yzeQBM-jA8QLlaoPYrminYmhniN8NbRk0DiUjymWP9z8vGgs=","Content-Length":"77","Via":"vcache10.cn1402[393,0]","X-Timestamp":"1763024787.823","x-tt-trace-id":"00-251113170627B62D987D40E5B056503D-528A6D0B755B43FB-00","Date":"Thu, 13 Nov 2025 09:06:27 GMT","x-tt-trace-host":"01aa075810167c68795fcfe90f58fc27e8e757cc9914653a0080ebb138fb9e2e3f9b6bc2a8693e676821e360d1544d5c7a26bf0e1b103a5e197317b89ab6e941264ec78bcf2248fb662438b17b75f606f9cf951d77da3c828cae140a86c9d631d9","X-Tt-Logid":"20251113170627B62D987D40E5B056503D","Server":"Tengine","server-timing":"cdn-cache;desc=MISS,edge;dur=0,origin;dur=393","Tt_stable":"1","x-tt-trace-tag":"id=03;cdn-cache=miss;type=dyn","Content-Type":"application\/json","X-Request-Id":"8b2b41bb-44fb-407e-a8ec-d7227179de61","Timing-Allow-Origin":"*","Connection":"keep-alive","EagleId":"65597d1e17630247874392399e"}
|
||||
|
||||
[2025-11-13 17:06:28.006][000000010.568] {"StatusCode":0,"StatusMessage":"success","code":0,"data":{},"msg":"success"}
|
||||
|
||||
[2025-11-13 17:06:28.973][000000011.569] I/user.转发到钉钉
|
||||
|
||||
[2025-11-13 17:06:28.979][000000011.570] I/user.timestamp 1763024788000
|
||||
|
||||
[2025-11-13 17:06:28.983][000000011.571] I/user.sign HOgxLj23Pl%2B3%2FMJ%2BAAyU%2FJXz7AwAMk%2BvqK0CrcxJqXA%3D
|
||||
|
||||
[2025-11-13 17:06:28.987][000000011.571] I/user.url https://oapi.dingtalk.com/robot/send?access_token=bf9fe5c74194b9556cff401b87ac5de46a92bbf15cc226b73d14c28773b86f3b×tamp=1763024788000&sign=HOgxLj23Pl%2B3%2FMJ%2BAAyU%2FJXz7AwAMk%2BvqK0CrcxJqXA%3D
|
||||
|
||||
[2025-11-13 17:06:29.005][000000011.572] I/user.dingding {"text":{"content":"我的id是nil,Thu Nov 13 17:06:28 2025,Air780EPM, 10001发来短信,内容是:尊敬的用户:截至11月13日17时6分,您的账户使用情况如下:\n本月消费:15.60元\n可用余额:21.84元\n仅供参考,实际费用以出账账单为准。更多详情点击:http:\/\/a.189.cn\/IRAYnu 进入“中国电信”APP。也可关注“浙江电信”微信公众号进行快速查询:https:\/\/qy.k189.cn\/hfcx?source=dt"},"msgtype":"text"}
|
||||
|
||||
[2025-11-13 17:06:29.023][000000011.574] dns_run 676:oapi.dingtalk.com state 0 id 3 ipv6 0 use dns server2, try 0
|
||||
|
||||
[2025-11-13 17:06:29.034][000000011.631] dns_run 693:dns all done ,now stop
|
||||
|
||||
[2025-11-13 17:06:29.767][000000012.360] I/user.钉钉机器人 success 200 {"Cache-Control":"no-cache","Date":"Thu, 13 Nov 2025 09:06:29 GMT","Connection":"keep-alive","Server":"DingTalk\/1.0.0","Content-Length":"27","Content-Type":"application\/json"} {"errcode":0,"errmsg":"ok"}
|
||||
|
||||
[2025-11-13 17:06:30.766][000000013.361] I/user.转发到微信
|
||||
|
||||
[2025-11-13 17:06:30.788][000000013.361] I/user.timestamp 1763024790000
|
||||
|
||||
[2025-11-13 17:06:30.809][000000013.362] I/user.url https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a9dec355-3e0f-45bf-a0b1-0f8813fe6b7d×tamp=1763024790000
|
||||
|
||||
[2025-11-13 17:06:30.823][000000013.363] I/user.weixin {"text":{"content":"我的id是nil,Thu Nov 13 17:06:30 2025,Air780EPM, 10001发来短信,内容是:尊敬的用户:截至11月13日17时6分,您的账户使用情况如下:\n本月消费:15.60元\n可用余额:21.84元\n仅供参考,实际费用以出账账单为准。更多详情点击:http:\/\/a.189.cn\/IRAYnu 进入“中国电信”APP。也可关注“浙江电信”微信公众号进行快速查询:https:\/\/qy.k189.cn\/hfcx?source=dt"},"msgtype":"text"}
|
||||
|
||||
[2025-11-13 17:06:30.841][000000013.365] dns_run 676:qyapi.weixin.qq.com state 0 id 4 ipv6 0 use dns server2, try 0
|
||||
|
||||
[2025-11-13 17:06:30.853][000000013.408] dns_run 693:dns all done ,now stop
|
||||
|
||||
[2025-11-13 17:06:31.647][000000014.239] I/user.企业微信机器人 success 200 {"Content-Type":"application\/json; charset=UTF-8","Server":"nginx","Error-Code":"0","Date":"Thu, 13 Nov 2025 09:06:31 GMT","Connection":"keep-alive","Content-Length":"27","Error-Msg":"ok","X-W-No":"4"} {"errcode":0,"errmsg":"ok"}
|
||||
|
||||
|
||||
|
||||
```
|
||||
@@ -0,0 +1,204 @@
|
||||
--[[
|
||||
@module sms_forward
|
||||
@summary 短信信息转发驱动模块
|
||||
@version 1.0
|
||||
@date 2025.10.15
|
||||
@author 王城钧
|
||||
@usage
|
||||
本文件为来电信息转发驱动模块,核心业务逻辑为:
|
||||
1、配置飞书,钉钉,企业微信机器人的webhook和secret(加签)。
|
||||
2、send_sms(),发送短信的功能函数,等待IP_READY消息后,手机卡可以进行收发短信。
|
||||
3、receive_sms(),接收短信处理的功能函数,收到短信后获取来信号码和短信内容,通过回调函数sms_handler(num, txt)转发到指定的机器人。
|
||||
|
||||
本文件没有对外接口,直接在main.lua中require "sms_forward"就可以加载运行;
|
||||
]]
|
||||
|
||||
-- webhook_feishu和secret_feishu要换成你自己机器人的值
|
||||
-- webhook_feishu是钉钉分配给机器人的URL
|
||||
-- secret_feishu是选取 "加签", 自动生成的密钥
|
||||
-- 下面的给一个测试群发消息, 随时可能关掉, 请换成你自己的值
|
||||
local webhook_feishu = "https://open.feishu.cn/open-apis/bot/v2/hook/673d1e1d-0c7e-4d34-b7f0-48bdb4c4d03a"
|
||||
local secret_feishu = "qlf8UXrJc7RYtJLx77jRVh"
|
||||
|
||||
local webhook_dingding =
|
||||
"https://oapi.dingtalk.com/robot/send?access_token=bf9fe5c74194b9556cff401b87ac5de46a92bbf15cc226b73d14c28773b86f3b"
|
||||
local secret_dingding = "SEC1bec4c6416b14c945806fa658840c7fbc64c3257aacd0c72f6cad5d22e3d29a4"
|
||||
|
||||
--local webhook_weixin = "https://work.weixin.qq.com/wework_admin/common/openBotProfile/24caa08b3a985454055047454d883fc98f"
|
||||
local webhook_weixin = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a9dec355-3e0f-45bf-a0b1-0f8813fe6b7d"
|
||||
-- 飞书关于机器人的文档 https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN?lang=zh-CN
|
||||
|
||||
--1.功能函数:短信转发到飞书
|
||||
local function feishu_post_sms(num, rctxt)
|
||||
local rheaders = {}
|
||||
rheaders["Content-Type"] = "application/json"
|
||||
|
||||
-- LuatOS的时间戳只到秒,飞书也只需要秒
|
||||
local timestamp = tostring(os.time())
|
||||
local sign = crypto.hmac_sha256("", timestamp .. "\n" .. secret_feishu):fromHex():toBase64()
|
||||
log.info("timestamp", timestamp)
|
||||
log.info("sign", sign)
|
||||
-- 注意, 这里的参数跟钉钉不同, 钉钉有个access_token参数, 飞书没有
|
||||
local url = webhook_feishu
|
||||
log.info("url", url)
|
||||
-- json格式也需要按飞书的来
|
||||
local data = { msg_type = "text" }
|
||||
data["timestamp"] = timestamp
|
||||
data["sign"] = sign
|
||||
-- text就是要发送的文本内容, 其他格式按飞书的要求拼接table就好了
|
||||
local text = "我的id是" ..
|
||||
tostring(device_id) .. "," .. (os.date()) .. "," .. rtos.bsp() .. ", " .. num .. "发来短信,内容是:" .. rctxt
|
||||
data["content"] = { text = text }
|
||||
local rbody = (json.encode(data))
|
||||
log.info("feishu", rbody)
|
||||
local code, headers, body = http.request("POST", url, rheaders, rbody, { timeout = 5000 }).wait()
|
||||
-- 正常会返回 200, {"errcode":0,"errmsg":"ok"}
|
||||
-- 其他错误, 一般是密钥错了, 仔细检查吧
|
||||
log.info("飞书机器人",
|
||||
code==200 and "success" or "error",
|
||||
code,
|
||||
json.encode(headers or {}),
|
||||
body and (body:len()>512 and body:len() or body) or "nil")
|
||||
end
|
||||
|
||||
--2.功能函数:短信转发到钉钉
|
||||
local function dingding_post(num, rctxt)
|
||||
local rheaders = {}
|
||||
rheaders["Content-Type"] = "application/json"
|
||||
-- LuatOS的时间戳只到秒,但钉钉需要毫秒,补3个零
|
||||
local timestamp = tostring(os.time()) .. "000"
|
||||
local sign = crypto.hmac_sha256(timestamp .. "\n" .. secret_dingding, secret_dingding):fromHex():toBase64()
|
||||
:urlEncode()
|
||||
log.info("timestamp", timestamp)
|
||||
log.info("sign", sign)
|
||||
local url = webhook_dingding .. "×tamp=" .. timestamp .. "&sign=" .. sign
|
||||
log.info("url", url)
|
||||
local data = { msgtype = "text" }
|
||||
-- content就是要发送的文本内容, 其他格式按钉钉的要求拼接table就好了
|
||||
local content = "我的id是" ..
|
||||
tostring(device_id) .. "," .. (os.date()) .. "," .. rtos.bsp() .. ", " .. num .. "发来短信,内容是:" .. rctxt
|
||||
data["text"] = { content = content }
|
||||
local rbody = (json.encode(data))
|
||||
log.info("dingding", rbody)
|
||||
local code, headers, body = http.request("POST", url, rheaders, (json.encode(data))).wait()
|
||||
-- 正常会返回 200, {"errcode":0,"errmsg":"ok"}
|
||||
-- 其他错误, 一般是密钥错了, 仔细检查吧
|
||||
log.info("钉钉机器人",
|
||||
code==200 and "success" or "error",
|
||||
code,
|
||||
json.encode(headers or {}),
|
||||
body and (body:len()>512 and body:len() or body) or "nil")
|
||||
end
|
||||
|
||||
--3.功能函数:短信转发到企业微信
|
||||
local function weixin_post(num, rctxt)
|
||||
local rheaders = {}
|
||||
rheaders["Content-Type"] = "application/json"
|
||||
|
||||
local timestamp = tostring(os.time()) .. "000"
|
||||
log.info("timestamp", timestamp)
|
||||
local url = webhook_weixin .. "×tamp=" .. timestamp
|
||||
log.info("url", url)
|
||||
local data = { msgtype = "text" }
|
||||
-- content就是要发送的文本内容, 其他格式按钉钉的要求拼接table就好了
|
||||
local content = "我的id是" ..
|
||||
tostring(device_id) .. "," .. (os.date()) .. "," .. rtos.bsp() .. ", " .. num .. "发来短信,内容是:" .. rctxt
|
||||
data["text"] = { content = content }
|
||||
local rbody = (json.encode(data))
|
||||
log.info("weixin", rbody)
|
||||
local code, headers, body = http.request("POST", url, rheaders, (json.encode(data))).wait()
|
||||
-- 正常会返回 200, {"errcode":0,"errmsg":"ok"}
|
||||
-- 其他错误, 一般是密钥错了, 仔细检查吧
|
||||
log.info("企业微信机器人",
|
||||
code==200 and "success" or "error",
|
||||
code,
|
||||
json.encode(headers or {}),
|
||||
body and (body:len()>512 and body:len() or body) or "nil")
|
||||
end
|
||||
|
||||
--4.功能函数:接收短信的回调函数
|
||||
local function sms_handler(num, txt)
|
||||
-- num 给我发短信的手机号码
|
||||
-- txt 收到的短信文本内容
|
||||
|
||||
log.info("转发到飞书")
|
||||
feishu_post_sms(num, txt)
|
||||
|
||||
--等待1秒, 非必须
|
||||
sys.wait(1000)
|
||||
log.info("转发到钉钉")
|
||||
dingding_post(num, txt)
|
||||
|
||||
--等待1秒, 非必须
|
||||
sys.wait(1000)
|
||||
log.info("转发到微信")
|
||||
weixin_post(num, txt)
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------
|
||||
--5. 功能函数:接收短信
|
||||
local function receive_sms()
|
||||
while 1 do
|
||||
local ret, num, txt = sys.waitUntil("SMS_INC", 30000)
|
||||
log.info("收到来自短信:", num)
|
||||
if num then
|
||||
log.info("num是", num)
|
||||
log.info("收到来自" .. num .. "的短信:" .. txt)
|
||||
|
||||
--local isReady1, index1 = socket.adapter()
|
||||
log.info("当前网络", socket.adapter())
|
||||
|
||||
sms_handler(num, txt)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------
|
||||
-- 6.功能函数:发送短信, 直接调用sms.send就行, 是不是task无所谓
|
||||
local function send_sms()
|
||||
--按照规范的做法,这里应该等待"SMS_READY"消息,
|
||||
--目前内核固件正在开发支持"SMS_READY"消息功能,
|
||||
--等开发好了之后,再使用"SMS_READY"消息,
|
||||
--当前阶段,先使用"IP_READY"替代
|
||||
sys.waitUntil("IP_READY")
|
||||
sys.wait(5000)
|
||||
-- 当前阶段等待5s,使得sms准备就绪,待"SMS_READY"消息开发完成后,删除如上两行代码使用sys.waitUntil("SMS_READY")替代
|
||||
log.info("发送短信准备就绪")
|
||||
local cont = 1
|
||||
log.info("开始发短信")
|
||||
while 1 do
|
||||
log.info("现在可以收发短信")
|
||||
|
||||
--获取本机号码,如果卡商没写入会返回nil
|
||||
log.info("mobile.number(id) = ", mobile.number())
|
||||
--获取本机iccid,如果卡商没写入会返回nil
|
||||
log.info("mobile.iccid(id) = ", mobile.iccid())
|
||||
--获取本机simid,如果卡商没写入会返回nil
|
||||
log.info("mobile.simid(id) = ", mobile.simid())
|
||||
--获取本机imsi,如果卡商没写入会返回nil
|
||||
log.info("mobile.imsi(index) = ", mobile.imsi())
|
||||
-- 注意:以下查话费的三行代码只需根据自己卡的运营商打开其一即可,其余两行关闭,不要全部打开
|
||||
-- 电信卡查话费
|
||||
local result = sms.send("10001", "102")
|
||||
-- 中移动卡查短信
|
||||
-- local result = sms.send("10086", "301")
|
||||
-- 联通卡查话费
|
||||
-- local result = sms.send("10010", "101")
|
||||
-- 注意:V2018及更高版本固件才有"SMS_SENT"系统消息
|
||||
if result then
|
||||
local wait_msg, success = sys.waitUntil("SMS_SENT", 10000)
|
||||
log.info("发送查询短信", "这是第" .. cont .. "次发送", " 发送结果:", wait_msg and (success and "成功" or "失败") or "超时")
|
||||
else
|
||||
log.info("发送查询短信", "这是第" .. cont .. "次发送", " 发送结果:同步发送失败")
|
||||
end
|
||||
log.info("等待10分钟")
|
||||
cont = cont + 1
|
||||
sys.wait(10 * 60 * 1000)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--发送短信
|
||||
sys.taskInit(send_sms)
|
||||
--接收短信
|
||||
sys.taskInit(receive_sms)
|
||||
@@ -0,0 +1,66 @@
|
||||
--[[
|
||||
@module sntp_app
|
||||
@summary sntp时间同步应用功能模块
|
||||
@version 1.0
|
||||
@date 2025.10.29
|
||||
@author 王城钧
|
||||
@usage
|
||||
本文件为sntp时间同步应用功能模块,核心业务逻辑为:
|
||||
1、连接ntp服务器进行时间同步;
|
||||
2、如果同步成功,1小时之后重新发起同步动作;
|
||||
3、如果同步失败,10秒钟之后重新发起同步动作;
|
||||
|
||||
本文件没有对外接口,直接在其他应用功能模块中require "sntp_app"就可以加载运行;
|
||||
]]
|
||||
|
||||
-- sntp时间同步的任务处理函数
|
||||
local function sntp_task_func()
|
||||
|
||||
while true do
|
||||
-- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
|
||||
while not socket.adapter(socket.dft()) do
|
||||
log.warn("sntp_task_func", "wait IP_READY", socket.dft())
|
||||
-- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
|
||||
-- 或者等待1秒超时退出阻塞等待状态;
|
||||
-- 注意:此处的1000毫秒超时不要修改的更长;
|
||||
-- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
|
||||
-- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
|
||||
-- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
|
||||
sys.waitUntil("IP_READY", 1000)
|
||||
end
|
||||
|
||||
-- 检测到了IP_READY消息
|
||||
log.warn("sntp_task_func", "recv IP_READY")
|
||||
|
||||
-- 发起ntp时间同步动作
|
||||
socket.sntp()
|
||||
|
||||
-- 等待ntp时间同步结果,30秒超时失败,通常只需要几百毫秒就能成功
|
||||
local ret = sys.waitUntil("NTP_UPDATE", 30000)
|
||||
|
||||
--同步成功
|
||||
if ret then
|
||||
-- 以下是获取/打印时间的演示,注意时区问题
|
||||
log.info("sntp_task_func", "时间同步成功", "本地时间", os.date())
|
||||
log.info("sntp_task_func", "时间同步成功", "UTC时间", os.date("!%c"))
|
||||
log.info("sntp_task_func", "时间同步成功", "RTC时钟(UTC时间)", json.encode(rtc.get()))
|
||||
log.info("sntp_task_func", "时间同步成功", "本地时间戳", os.time())
|
||||
local t = os.date("*t")
|
||||
log.info("sntp_task_func", "时间同步成功", "本地时间os.date() json格式", json.encode(t))
|
||||
log.info("sntp_task_func", "时间同步成功", "本地时间os.date(os.time())", os.time(t))
|
||||
|
||||
-- 正常使用, 一小时一次, 已经足够了, 甚至1天一次也可以
|
||||
sys.wait(3600000)
|
||||
--同步失败
|
||||
else
|
||||
log.info("sntp_task_func", "时间同步失败")
|
||||
-- 10秒后重新发起同步动作
|
||||
sys.wait(10000)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--创建并且启动一个task
|
||||
--运行这个task的主函数sntp_task_func
|
||||
sys.taskInit(sntp_task_func)
|
||||
|
||||
Reference in New Issue
Block a user