基于Air780EPM的单片机短信收发实战:从硬件连接到代码实现
本文介绍了基于合宙Air780EPM4G模组实现短信收发功能的开发方法。首先介绍了硬件准备和软件环境搭建,包括开发板、SIM卡等硬件需求,以及LuatOS操作系统和相关工具。重点讲解了短信功能的核心API,包括发送短信的sms.send()函数和接收短信的sys.waitUntil()回调机制。文章提供了完整的代码实现,涵盖短信发送、接收和运营商查询等功能,并展示了如何将短信内容转发到企业微信等应
引言
在物联网应用中,短信功能仍然扮演着不可替代的角色——无论是设备告警、远程控制,还是备用机短信转发,都离不开稳定可靠的短信收发能力。本文将基于合宙Air780EPM 4G Cat.1模组,手把手带大家实现一个完整的短信发送和接收程序。
Air780EPM作为一款低功耗4G模组,不仅支持移动和联通卡的短信功能,还提供了简洁易用的LuatOS操作系统支持,让开发者可以用几行代码就能实现复杂的通信功能。
一、硬件准备与环境搭建
1.1 硬件清单
-
Air780EPM开发板 ×1,也可以使用自己设计的单片机。
-
4G天线 ×1
-
支持短信功能的SIM卡(移动/联通,电信卡) ×1
-
USB-TypeC数据线 ×1
1.2 软件环境
-
Luatools工具:合宙官方烧录工具,用于下载固件和脚本
-
内核固件:LuatOS-SoC_V2024_Air780EPM(或更高版本)
-
脚本库:LuatOS官方lib脚本文件
二、核心API简介
LuatOS将复杂的短信功能封装为极简的API,开发者只需掌握两个核心函数:
| 功能 | API | 说明 |
|---|---|---|
| 发送短信 | sms.send(phone, msg) |
参数:手机号、短信内容 |
| 接收回调 |
sys.waitUntil("SMS_INC", 30000) |
设置新短信到达时的回调函数 |
三、代码实现:从发送到接收
功能函数:接收短信
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
-------------------------------------------------------------------
功能函数:发送短信, 直接调用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
四、进阶应用场景
4.1 短信转发到微信/钉钉
结合HTTP功能,可以将短信实时推送到企业微信,实现"短信云同步"。
大概短信猫池也是这个道理
六、测试截图
6.1 单片机运行日志

6.2 企业微信接收到短信转发内容

更多推荐

所有评论(0)