Skip to content

Commit

Permalink
Added support for receiving flash SMS
Browse files Browse the repository at this point in the history
  • Loading branch information
nitram2342 committed Dec 14, 2024
1 parent 8ad2475 commit 0a766b9
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 13 deletions.
73 changes: 60 additions & 13 deletions server/modem.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,14 @@
CmsError,
)
from gsmmodem.modem import GsmModem, SerialComms, SentSms, ReceivedSms
from gsmmodem.pdu import decodeSmsPdu

import modemconfig
import sms
import serialportmapper



class Modem(threading.Thread):
def __init__(self, identifier: str, modem_config: modemconfig.ModemConfig, serial_ports_hint_file: str) -> None:
assert identifier is not None
Expand Down Expand Up @@ -288,11 +290,27 @@ def get_stats_received_sms(self) -> int:
"""
return self.stats_received_sms

def _handle_sms(self, _sms: ReceivedSms) -> None:
def _handle_incoming_gsmmodem_sms(self, _sms: ReceivedSms) -> None:
"""
Handle incoming SMS from the python-gsmmodem-new layer.
The _sms parameter is a gsmmodem.modem.ReceivedSms.
"""
new_sms = sms.SMS(
sms_id=None,
recipient=self.modem_config.phone_number,
text=_sms.text,
sender=_sms.number,
timestamp=_sms.time,
receiving_modem=self,
)

self._handle_incoming_sms(new_sms)

def _handle_incoming_sms(self, _sms: sms.SMS) -> None:
"""
Handle incoming SMS.
The _sms parameter is a sms.SMS object.
"""

self.l.info("== SMS message received ==")

Expand All @@ -308,20 +326,12 @@ def _handle_sms(self, _sms: ReceivedSms) -> None:
# clear value
self.health_check_expected_token = None

new_sms = sms.SMS(
sms_id=None,
recipient=self.modem_config.phone_number,
text=_sms.text,
sender=_sms.number,
timestamp=_sms.time,
receiving_modem=self,
)

# Only log SMS in debug mode and then without content
self.l.debug(new_sms.to_string(content=False))
self.l.debug(_sms.to_string(content=False))

self.l.info(f"Put SMS in queue.")
self.sms_receiver_queue.put(new_sms)
self.sms_receiver_queue.put(_sms)
self.event_available.set()

def get_sms(self) -> sms.SMS:
Expand Down Expand Up @@ -613,10 +623,11 @@ def _init_modem(self) -> bool:

self.status = f"Finally initializing port {self.current_port}."
time.sleep(10)
self.modem = GsmModem(
self.modem = MyGsmModem(
self,
self.current_port,
self.modem_config.baud,
smsReceivedCallbackFunc=self._handle_sms,
smsReceivedCallbackFunc=self._handle_incoming_gsmmodem_sms,
exclusive=True,
) # was True
self.modem.log = logging.getLogger(f"Modem [{self.identifier}]")
Expand Down Expand Up @@ -1030,3 +1041,39 @@ def run(self) -> None:
self.close()

self._do_health_check(do_now=True)


class MyGsmModem(GsmModem):

def __init__(self, gw_modem: Modem, port, baudrate=115200, incomingCallCallbackFunc=None,
smsReceivedCallbackFunc=None, smsStatusReportCallback=None, requestDelivery=True, AT_CNMI="", *a,
**kw):
super().__init__(port, baudrate, incomingCallCallbackFunc, smsReceivedCallbackFunc, smsStatusReportCallback,
requestDelivery, AT_CNMI, *a, **kw)
self.gw_modem = gw_modem
self.l = logging.getLogger("MyGsmModem")

def _handleModemNotification(self, lines):

for i in range(0, len(lines)):
self.l.info(f"++++++++++++ Received line: [{lines[i]}]")
if lines[i].startswith('+CMT') and i + 1 < len(lines):
m = re.search('^\+CMT: "([^\"]+)"', lines[i])
if m:
self.l.debug(f"From: {m.group(1)}")
self.l.debug(f"PDU: {lines[i + 1]}")
_sms = decodeSmsPdu(lines[i + 1])
self.l.debug(str(_sms))

new_sms = sms.SMS(
sms_id=None,
recipient=self.gw_modem.get_phone_number(),
text=_sms['text'] if 'text' in _sms else None,
sender=_sms['number'] if 'number' in _sms else None,
timestamp=_sms['time'] if 'time' in _sms else None,
receiving_modem=self.gw_modem,
flash=_sms['protocol_id']==0 if 'protocol_id' in _sms else False
)
self.gw_modem._handle_incoming_sms(new_sms)

return super()._handleModemNotification(lines)
1 change: 1 addition & 0 deletions server/sms.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ def to_string(self, content=True) -> str:
+ f"Recipient : {self.recipient}\n"
+ f"Message timestamp : {self.timestamp.strftime(ts_fmt)}\n"
+ f"Created timestamp : {self.created_timestamp.strftime(ts_fmt)}\n"
+ f"Flash message : {self.flash}\n"
)
if self.receiving_modem:
text += f"Receiving modem : {self.receiving_modem.get_identifier()}\n"
Expand Down

0 comments on commit 0a766b9

Please sign in to comment.