前言

网络安全法要求各个互联网平台存储用户的手机号,而将自己的主力手机号暴露给一些杂七杂八的网站是是非常不安全的。正因如此,我们需要有一张或几张小号卡用于绑定一些不常用的平台。

多的手机卡插入旧手机使用无疑是最好的解决方案。使用Tasker令其在接收到短信时自动转发到服务器上(如Server酱转其他等等),即可获得一个无需额外花费的短信转发器。

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

Air724UG的问题是,它不能连接WiFi,所以通知必须走流量。不过这样也好,可以在没有WiFi的情况下也能正确设置。

当然,使用USB 4G 上网卡也是一个不错的选择,然而它们的价格较贵且需要一个主机处理数据,故我认为没有这个方案方便。

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透传模块并修改固件使用。因为官方USB下载工具和下载器,所以不必担心无法修改固件。在模块的选择上,我推荐使用引出了BOOT引脚或有BOOT按钮的模块,这样你就可以在刷坏整个模块的情况下救砖。


0 条评论

发表评论

Avatar placeholder

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