【Geek】基于 Air724UG 模块的多设备短信推送方案
编辑需求
实现低功耗、高可靠性的短信转发服务,能够方便扩展、二次开发
前期调研
市面上类似需求的解决方案,大概分为 4 类
旧手机,一般推荐安卓 ROOT ,有现成的转发软件,参考项目: sms_forword
开发板,用的比较多的有合宙家的 Air724UG/Air780E 系列,参考项目: air780E+ESP32、air780E、air724ug
树莓派+3G/4G 网卡+gammu, 参考项目: 基于 Raspberry Pi 的短信网关设计
基于 Linux 的随身 wifi 二次开发,参考项目: 基于随身 WiFi 的低成本短信转发、随身 WIFI 刷机入门
旧手机方案成本高、扩展性差,功耗不低不说,长期运行还有电池包鼓包的风险,排除
树莓派、随身 wifi 成本高,排除
最终选则了基于开发板的方案来做,在 780E 和 724UG 之间最终选择了 724UG。具体原因有两个,一个是成本差不多的基础上,724UG 的功能比 780E 要强一些,第二个是市面上有很多基于 724UG 开发的 DTU 模组,壳子天线都有,省去我很多后期工作。最终选择的设备是这一套,金属壳子的,散热效果好一些。
整体架构
之前并没有做过物联网相关的开发工作,所以整体方案本来打算参考上面的 air724ug 方案开发,但是在仔细阅读了项目源码之后发现,虽然项目功能很多,但是短信部分的功能,只有收信转发和收到指定类型的短信,发送短信。每次想发短信得手动给设备发送一条短信,很麻烦, 而且扩展起来不是很方便管理。
于是在查询了一番资料后,打算重新开发,目前的整体架构如下
所有的设备接入一台公共的 MQTT 协议服务器(目前采用的是开源的 EMQX 项目),订阅相关主题,根据主题推送的数据,每个设备进行不同的匹配/认证工作,通过的执行对应的操作。
比如发送短信、查看当前设备信息、查询流量、查询余额等
设备所有的收信、发信、设备信息等内容统一推送到 API 服务器并入库,方便后续的查询、推送通知等操作。
API 服务器同样接入 MQTT 协议服务器,这样可以通过接口,给 MQTT 服务器的相关主题,推送消息。
MQTT 协议介绍
MQTT旨在提供一个轻量级的协议,能够使设备间的通信在网络带宽较低和不可靠的环境下也能保持稳定。适合用在需要电池供电的小型设备和在带宽受限的情况下。
工作原理
基于发布/订阅模型:不同于常见的点对点通信模型,MQTT使用发布/订阅模型,客户端发布消息到主题,其他客户端订阅这些主题以接收消息。
代理(Broker):MQTT协议中,消息的交换是通过一个中间节点完成的,称为代理(Broker)。代理接受来自发布者的消息,并将这些消息转发给订阅了相应主题的客户端。
特性
轻量级协议:MQTT的消息头非常小,最小化了数据包的大小,这对于带宽有限的场景非常有利。
支持QoS(服务质量):MQTT支持三种服务质量等级,分别是:
QoS 0:消息最多发送一次,不保证消息到达。
QoS 1:消息至少发送一次,确保消息到达,但可能会有重复。
QoS 2:确保每条消息只被接收一次,提供最高级别的服务质量。
保持连接(Keep Alive):客户端和代理之间定期发送消息以保持连接活跃,以防止连接由于长时间的空闲而被关闭。
遗嘱消息(Will Message):客户端在连接到代理时可以指定一个“遗嘱消息”,如果连接异常断开,则代理会将这个消息发布出去,通知其他客户端。
EMQX 服务器搭建
首先复制出来容器里面的配置,方便后续的持久化
mkdir -p /home/emqx && docker run --rm emqx:5.6.0 sh -c 'cd /opt/emqx && tar -c etc' | tar -C /home/emqx -x
创建 data
、log
文件夹
mkdir -p /home/emqx/data && chmod 777 /home/emqx/data && mkdir -p /home/emqx/log && chmod 777 /home/emqx/log
需要注意的地方是,EMQX 是根据 node_name 来生成节点配置文件(在 /opt/emqx/data/mnesia 目录下),所以要在环境变量中固定 EMQX_NODE_NAME 的值,才可以在 重启/重构容器的时候,持久化数据
services:
emqx:
image: emqx:5.6.0
volumes:
- /home/emqx/etc:/opt/emqx/etc
- /home/emqx/data:/opt/emqx/data
- /home/emqx/log:/opt/emqx/log
restart: always
container_name: emqx
environment:
- EMQX_NODE_NAME=emqx@node
- TZ=Asia/Shanghai
ports:
- "1883:1883"
- "18083:18083"
默认创建好的 EMQX 服务器是允许任何连接的,为了安全性着想,可以在 访问控制 - 客户端认证 里面添加认证方式,这样就只有通过认证的设备才能接入 MQTT 协议服务器,进行主题的订阅、公告。
Air724UG 模块开发
设备介绍
需要注意的是,该 DTU 设备的 USB 接口,只能用来给模块升级固件、下载程序、查看运行日志,是不支持给电源供电的。
供电我们需要从 UART 接口或者 RS485 接口接入,具体各个引脚的作用如下
UART 串口接口管脚介绍
VIN: 电源正: 5-36V (10W)
GND: 电源地: GND
RXD: [3.3V电平] UART 数据接收
CTS: [3.3V电平] 用户允许模块发送数据
RTS: [3.3V电平] 模块请求用户发送数据
RS485接口管脚介绍
VIN: 电源正: 5V2A / 12V1A
GND: 电源地: GND
A: RS485 RXD+接收数据
B: RS485 RXD-接收数据
所以在开发之前我们需要先搞一个电源,不然的话接入电脑是没反应的,这里我选择的是下面这一款,主打一个便宜够用。
我们把 DTU 送的两根排线,拿出其中一根插在 UART 接口上,然后从排线的另一端引出两根引脚,VIN 和 GND, 分别插在电源的 +12V 和 GND 上,就可以正常上电了。
驱动安装
在接入电源后,我们将 DTU 设备通过 micro-usb 线与电脑相连,还并不能成功连接设备。我们需要先安装驱动 银尔达-串口驱动-CP2102,根据操作系统的版本号选择 64位 还是 32 位进行安装既可,安装成功后,设备连接电脑,可以在电脑的设备管理器中,发现端口。
参考资料1: 银尔达-DTU硬件通用连接和工具使用方法手册(必看).pdf
参考资料2: 银尔达-Air724系列DTU固件功能用户手册必读).pdf
参考资料3: Air724UG_模块产品规格书-v3.0.pdf
参考资料4: 银尔达-YED-D724X_DTU_规格书.pdf
固件、脚本刷机
上文所采购的 DTU 设备可以刷入两套固件,一套是 DTU 厂商的固件,一套是 Air724UG 模块的 Luat OS - Air 固件,因为本项目主要是利用 Air724UG 的短信功能,所以需要刷入 Luaos 固件,关于这套固件和 Luat OS SDK 的详细介绍可见: Luat OS SDK
首先下载官方提供的 LuaTools 安装运行后,接入设备,勾选 4G模块USB打印,选择串口日志波特率: 115200,一切正常会在 LuaTools 中看到日
刷入固件,这里我们选择的是 AT 固件 (AirM2M_720U_V401863_LTE_AT.pac)
刷入脚本,刷入脚本之前首先要选择要刷入的底层 core,这里我们选择的是 LuatOS-Air_V4028_RDA8910_TTS_NOLVGL_FLOAT.pac (注意这个跟刚刚的固件并不一样,如果有不明白的地方可以参考: Luatools工具篇)
项目代码
项目代码整体分为两部分,一部分是烧录进 DTU 设备的,基于Luat OS 二次开发的 lua 脚本,一部分是 API 服务器运行接口的部分。代码暂没有开源打算,不过整体思路可以讲一下。
基于 LuatOS 二次开发
主要是利用的 Luat OS 的 SMS 模块 和 MQTT 模块,WIKI 文档可见: SMS ,MQTT
不过 WIKI 文档并不全面,具体的用例、用法可以下载它的上层软件包自行查看(包括 lib 库和 demo): 上层软件包
大概的过程是,
基于 LuatOS 的 http 模块实现一个 lua 版本的 get/post 请求函数,然后覆写 smsCallback 函数,实现收到短信后进行接口转发。
基于 MQTT 服务来做 短信发送、设备控制部分的代码。短信发送过程分为两个部分,首先是发送,然后发送完毕后会触发回调函数来传递发送结果(是否发送成功)。为了能在 API 服务器上,记录短信发送和是否成功,需要设备在短信发送、和发送完毕时分别与 API 服务器进行通信。这个过程可能会需要修改 sms 底层库的代码,以便传递信息,能够区分结果来自哪条短信。
底层库对各种功能的实现,是通过 AT 命令来实现的。短信控制部分扩展功能的实现(删除/读取/短信数量/存储空间等),需要自己根据需求,查询 AT 命令自行开发。(AT 命令的执行部分可以见 底层库的
ril.request
),AT 命令可以见: 上海合宙Cat.1模组(展锐8910平台系列)AT命令手册V1.1.1
API 服务器代码开发思路
根据功能按需开发就好,做好消息的分类、隔离、鉴权等,以及 MQTT 服务器的连接和发布消息。
全部资料
- 2
- 1
-
赞助
微信 -
分享