def _send_sms(self, tx_sms): # TODO handle delivery report if not self._is_network_available: err_msg = '%s: network unavailable' % tx_sms tx_sms.callback(status('ERROR', err_msg)) return try: self.modem.sendSms(tx_sms.recipient, tx_sms.text) except Exception, e: logger.error('error:', exc_info=True) tx_sms.callback(status('ERROR', '%s: %r' % (tx_sms, e)))
def _send_sms_when_stopped(self, tx_sms): assert tx_sms.sender is None if not self.sim_config.active: err_msg = '%s: modem is not active' % tx_sms tx_sms.callback(status('ERROR', err_msg)) else: self._send_sms(tx_sms)
def route(self, msg): sender = msg.sender imsi = msg.imsi sim_config = None if sender: sim_config = self.sim_config_db.route(sender) if sim_config is None and imsi in self.sim_config_db: sim_config = self.sim_config_db[imsi] if sim_config is None: err_msg = '%s: sim not known' % msg if msg.callback: msg.callback(status('ERROR', err_msg)) return worker = self.imsi2worker.get(sim_config.imsi) if worker: logger.info('%s: routing to dev %s', msg, worker.dev) worker.send(msg) else: msg.callback(status('ERROR', '%s: sim not found' % msg))
else: self._send_sms(tx_sms) def _send_sms(self, tx_sms): # TODO handle delivery report if not self._is_network_available: err_msg = '%s: network unavailable' % tx_sms tx_sms.callback(status('ERROR', err_msg)) return try: self.modem.sendSms(tx_sms.recipient, tx_sms.text) except Exception, e: logger.error('error:', exc_info=True) tx_sms.callback(status('ERROR', '%s: %r' % (tx_sms, e))) else: tx_sms.callback(status('OK', '%s: sms sent' % tx_sms)) @cached_property(ttl=30) def _is_network_available(self): try: sig_strength = self.modem.waitForNetworkCoverage(timeout=3) ret = sig_strength > 0 except (TimeoutException, InvalidStateException): ret = False except Exception: ret = False _log = logger.info if ret else logger.error _log('network check: available=%s', ret) return ret def _process_stored_sms(self):