引言

在物联网应用中,短信功能仍然扮演着不可替代的角色——无论是设备告警、远程控制,还是备用机短信转发,都离不开稳定可靠的短信收发能力。本文将基于合宙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 企业微信接收到短信转发内容

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐