跳转至

短消息(sms)

一、SMS 简介

SMS(短消息服务,Short Message Service)功能主要用于在蜂窝网络中传输短消息。

移动,联通卡不需开通 VOLTE 可以支持短信功能。

在 4G 网络中,短信可以在数据传输的同时进行,不会因数据业务占用网络资源而被延迟或阻塞。

在 780E 模块中,当收到新短信后,MAIN_RI 变为低电平,持续 120ms,再变为高电平。可根据这个引脚来判断是否有新短信。

三、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

四、软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools工具

2. 内核固件文件(底层core固件文件):LuatOS-SoC_V1112_EC618_FULL.soc;参考项目使用的内核固件

3. luatos需要的脚本和资源文件

脚本和资源文件点我,下载完整压缩文件包

lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到Air780E核心板,将本篇文章中演示使用的项目文件烧录到Air780E核心板中。

4.LuatOS 工程文件:sms_20250321.luatos

5.本教程使用 api 接口为:sms-api地址

五、代码示例介绍

只需要调用 sms.send()函数,填入对方手机号和消息内容即可。

通过设置回调函数。或者订阅发送完成的系统消息,来进行发送完成的处理。

本 demo 的效果是给服务商发短信消息,查询话费信息。

6.1 发送短信

-- 发送短信, 直接调用sms.send就行, 是不是task无所谓
sys.taskInit(function()
    sys.wait(10000)
    -- 中移动卡查短信
    --  local send_result = sms.send("+8610086", "301")
    -- 联通卡查话费
    local send_result = sms.send("10010", "101")
    if send_result == true then
    log.info("信息发送成功")
    else
     log.info("信息发送失败")
end)

6.2 接收短信

接收短信后进入回调函数

-- 接收短信后的回调函数
function sms_handler(num, txt)
    -- num 手机号码
    -- txt 文本内容
    log.info("sms", num, txt, txt:toHex())
       -- 1.添加基本的安全检查
   if not number or not content then
       log.warn("sms", "收到无效短信")
       return
   end
   --2. 添加短信长度限制
   if #content > 1600 then
       log.warn("sms", "短信内容过长")
       return
   end
    -- http演示1, 发json
    local body = json.encode({phone=num, txt=txt})
    local headers = {}
    headers["Content-Type"] = "application/json"
    log.info("json", body)
    http_post("http://www.luatos.com/api/sms/blackhole", headers, body)
    -- http演示2, 发表单的
    headers = {}
    headers["Content-Type"] = "application/x-www-form-urlencoded"
    local body = string.format("phone=%s&txt=%s", num:urlEncode(), txt:urlEncode())
    log.info("params", body)
    http_post("http://www.luatos.com/api/sms/blackhole", headers, body)
    -- http演示3, 不需要headers,直接发
    http_post("http://www.luatos.com/api/sms/blackhole", nil, num .. "," .. txt)
    -- 如需发送到钉钉, 参考 demo/dingding
    -- 如需发送到飞书, 参考 demo/feishu
end

--------------------------------------------------------------------
-- 接收短信, 支持多种方式, 选一种就可以了
-- 1\. 设置回调函数
--sms.setNewSmsCb(sms_handler)
-- 2\. 订阅系统消息
--sys.subscribe("SMS_INC", sms_handler)
-- 3\. 在task里等着
sys.taskInit(function()
    while 1 do
        local ret, num, txt = sys.waitUntil("SMS_INC", 300000)
        if num then
            -- 方案1, 交给自定义函数处理
            sms_handler(num, txt)
            -- 方案2, 因为这里是task内, 可以直接调用http.request
            -- local body = json.encode({phone=num, txt=txt})
            -- local headers = {}
            -- headers["Content-Type"] = "application/json"
            -- log.info("json", body)
            -- local code, headers, body = http.request("POST", "http://www.luatos.com/api/sms/blackhole", headers, body).wait()
            -- log.info("resp", code)
        end
    end
end)

七、功能验证

成功发送短信。

八、总结

本示例介绍了如何发送短消息服务。

常见问题

1、物联网卡支持短信功能吗?

一般来说,物联网卡是不支持短信功能的,具体需要咨询物联网卡供应商。

2、支持移动、电信,联通卡的短信功能吗?

Air780E不支持电信卡的短信功能!!

如果是联通卡或者移动卡, 均可收取短信, 但实名制的卡才能发送短信。

3、是否支持彩信功能

不支持

4、短信功能发送英文短信、 中文短信,分别怎么发? 发长短信怎么发?

发送英文短信、中文短信、中英文混合短信在可在短信功能部分添加如下log.info语句:

sys.taskInit(function()
    sys.wait(10000)
    -- 中移动卡查短信
    -- sms.send("+8610086", "301")
    -- 联通卡查话费
    sms.send("10010", "101")

    log.info("英文短信",sms.send("num", "TEST"))
    sys.wait(5000)
    log.info("中文短信",sms.send("num", "你好"))
    sys.wait(5000)
    log.info("中英文混合",sms.send("num", "你好test"))

end)

发送长短信可在文本部分填入,最长可发160字节文本。