I wrote a similar project this year that runs on my router, in python. I communicates with ModemManager over dbus. I use a Quectel EC25 LTE modem, it forwards incoming SMS to an https webhook as JSON. It listens to http requests to provide an outgoing SMS gateway. It also provides automatic failover for the WAN link, for when Comcast craps out. On another machine I have python script that bridges with prosody, to provide an SMS-XMPP bridge. It works well, receives messages faster than the SMS api services that I have tried, and since it's a real mobile number it works everywhere for 2FA.
ModemManager is great, abstracting away manufacturer specific implementation details. The same script is also working on a Pi connected to The Franklin T9 hotspot that I got for free from T-Mobile, running in QMI mode.
I wish it were easier to bridge voice with asterisk, but from what I have seen it is necessary to run asterisk on the same device and communicate directly with the modem, with modem specific tweaks and custom built modules.