前言

随着网络安全法的实施,越来越多的互联网平台要求获得用户的手机号,而将自己的主力手机号暴露给一些杂七杂八的网站是非常不安全的。正因如此,我们需要有一个或几个小号用于绑定一些不常用的平台。

使用旧手机作为转发器无疑是最好的解决方案。使用 Tasker 可以令手机在接收到短信后,自动转发到指定的服务器上(如Server酱等等)。此方案并没有什么额外的成本,你只需要将旧手机插上电后放置在一边即可。

然而我手边没有旧手机,只能使用其他的方案。在这里我想到的是之前薅羊毛薅的Air724UG模块,它可以连接VoLTE,实现4G的物联网应用。它现在还算比较便宜,仅需50左右即可买到一个核心板。

需要注意的是,Air724UG 虽然有 WiFi,但它只能用于 Wifi 扫描做辅助定位。因此,发送消息通知就必须要走流量。不过这样也好,使用流量可以在没有 WiFi 的情况下也能正确工作。

当然,使用 USB 4G 上网卡也是一个不错的选择,然而它们的价格较贵且需要一个主机处理数据,故我认为没有这个方案方便。 市面上有许多基于骁龙 210 的 4G 上网卡,刷入通常的安卓软件包即可像旧手机那样使用 Tasker 做短信转发了。

Air724UG的设置

基本上,跟着官方教程写LUA就没有什么问题了。在这里我给出一个我正在用的示范例子,你可以根据这个改动,将其改成适合你的服务器的版本。

我在这里实现了短信的转发、流量定时查询以及电话自动接通播放语音。注意电话TTS这个功能需要固件支持,在这里我刷的是LuatOS-Air_Vxxxx_RDA8910_TTS_NOLVGL_FLOAT这个固件。

PROJECT = "SMS_Forwarder"
VERSION = "1.0.0"
PUSH_ID = "1234567890"

require "sys"
require "http"
require "sms"
require "common"
require "cc"
require "audio"
require "net"

-- HTTP 回调,显示调试信息用
function httpCallback(result, prompt, head, body)
    if result then
        print("HTTP", prompt, body)
    else
        print("HTTP Request Failed. ", prompt)
    end
end

-- 将消息发送到你的平台
function notifyPushPlatform(id, msg)
    http.request(
        "POST", -- POST 发送数据
        "https://example.org/push", -- POST 地址,改成你自己的
        nil, -- 不指定证书
        {["Content-Type"]="application/x-www-form-urlencoded"}, -- 设置数据头Type,使用Form提交数据
        "id="..id.."&text="..string.urlEncode(msg), -- 数据内容,改成你自己的
        2000, -- 发送超时,ms
        httpCallback, -- 回调
        nil
    )
end

--[[
num:短信号码,ASCII码字符串格式
data:短信内容,字符串格式
datetime:短信日期和时间,ASCII码字符串格式
]]
function smsCallback(num, data, datetime)
    print("SMS FROM ", num, " IN ", datetime)
    print(data)

    data = common.gb2312ToUtf8(data) -- 短信编码要转换为目标平台支持的UTF-8
    data = string.gsub(data, "*", "\\*") -- Telegram 特殊字符转义
    data = string.gsub(data, "_", "\\_") -- Telegram 特殊字符转义
    notifyPushPlatform(PUSH_ID, num.." ("..datetime.."):\r\n"..data)
end

call_in = false

-- 电话拨入回调,在这里发送通知并接通电话
function call_incoming(num)
    print("CALL FROM ", num)
    if not call_in then
        call_in = true
        notifyPushPlatform(PUSH_ID, num.." 给您来电")
        cc.accept(num)
    end
end

-- 电话接通回调,这里播放TTS通知对方
function call_connected(num)
    print("CALL CONNECTED")
    call_in = false
    --通话中向对方播放TTS
    audio.play(7,"TTS","您好,机主无法接听您的来电,请使用短信联系机主。",7,nil,true,2000)
    --30秒之后主动结束通话
    sys.timerStart(cc.hangUp,30000,num)
end

-- 电话挂断回调,停止TTS
function call_disconnected(discReason)
    print("CALL DISCONNECTED")
    call_in = false
    sys.timerStopAll(cc.hangUp)
    audio.stop()
end

-- 定时任务:每天发送短信到10001查询流量
sys.timerLoopStart(
    function()
        sms.send("10001", "108", nil, nil)
    end
, 24*60*60*1000
)

--加载网络指示灯和LTE指示灯功能模块
--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
require "netLed"
pmd.ldoset(2,pmd.LDO_VLCD)
netLed.setup(true,pio.P0_1,pio.P0_4)

--设置短信回调
sms.setNewSmsCb(smsCallback)

--禁用RNDIS,防止跑流量
ril.request("AT+RNDISCALL=0,1")

--注册电话回调
sys.subscribe("CALL_INCOMING", call_incoming)
sys.subscribe("CALL_CONNECTED", call_connected)
sys.subscribe("CALL_DISCONNECTED", call_disconnected)

--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)

-- 系统初始化
sys.init(0, 0)
sys.run()

购买建议

由于 Air724UG 它没有 WiFi 只能走流量,所以我们需要一张带有流量套餐的卡。我在这里用的是中国电信的最便宜的套餐,5 元一个月带 200M 流量。这点流量虽然不多,但是能够满足转发用的流量需求需求。

如果你不想使用Air724UG的官方开发板(毕竟贵也用不上),也不想自己画板用模块的话(也麻烦),我建议你购买淘宝上的DTU透传模块并修改固件使用。Air724UG 官方使用的是 USB 做下载,所以不必担心无法修改固件。在模块的选择上,我推荐使用引出了 BOOT 引脚或有 BOOT 按钮的模块,这样你就可以在刷坏整个模块的情况下救砖。


3 条评论

huai · 2022 年 8 月 22 日 下午 12:28

固件在哪里下载啊, 我有个收短信的卡,现在用gammu进行转发,不太稳妥,不知道这个开发板好用不

    Jim · 2022 年 8 月 24 日 上午 9:15

    固件用官方的,然后把上面的代码修改一下烧进去就行了。稳定性还ok,暂时还没出现过问题

      huai · 2022 年 8 月 25 日 下午 4:35

      ok, 我已经买了,回头烧录进去试试,看看稳定性如何

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注