/** * Waits for particular PDU (with known command id and sequence no) for some period of time ($to). * All unmatched PDUs go to $this->pdu_inc array * @access public * @param int $cmd Command id * @param int $sqn Sequence no * @param int $to Timeout (miliseconds) * @return mixed PDU on success, FALSE on error */ public function pdu_wait_for($cmd, $sqn = null, $to = 60000) { if ($this->state != CSS_CONNECTED) { return false; } l('Will wait for ' . $this->translate_cmd($cmd) . ' with sqn no ' . $sqn); list($usec, $sec) = explode(' ', microtime()); $now = $start = $sec + $usec; while ($now - $start < $to / 1000) { if (false !== ($pdu = $this->pdu_read())) { $hdr = $this->sunpack('Nlen/Ncmd/Nstat/Nsqn', substr($pdu, 0, 16)); l('Got ' . $this->translate_cmd($hdr['cmd']) . ' (' . $hdr['cmd'] . ') with sqn no ' . $hdr['sqn']); if ($hdr['cmd'] == $cmd && ($hdr['sqn'] == $sqn || $sqn == null)) { l('Thats it. Returned.'); return $pdu; } elseif ($hdr['cmd'] == 0x15) { // Got ENQUIRELINK - replying if (!$this->send(NIMF_esme::form_pdu(ENQUIRELINK | ACK, array('sqn' => $hdr['sqn'])))) { l('Could not send ENQUIRELINK_ACK'); } } else { $this->pdu_inc[] = $pdu; } } else { if ($this->state != CSS_CONNECTED) { l('Disconnection happened.'); return false; } } list($usec, $sec) = explode(' ', microtime()); $now = $sec + $usec; } l('PDU we were waiting for didn\'t arrive.'); return false; }
$db->put('SET NAMES "' . $conf['DB']['charset'] . '"'); $db->autocommit(false); } } // checking for outgoing messages $db->commit(); // <-- This is required to see non cached outbox result if (false === ($send = $db->get_array('SELECT * FROM outbox WHERE (src IN (' . $conf['SMPP']['nums'] . ') OR src LIKE \'77%\') AND try_ts<' . (time() - 3600) . ' ORDER BY id LIMIT ' . $conf['ESME']['txlimit']))) { l('Could not read from db', L_CRIT); unset($db); continue; } if (isset($send['id'])) { // check for SMPP connect if (!isset($esme)) { $esme = new NIMF_esme($conf['SMPP']['host'], $conf['SMPP']['port'], $conf['SMPP']['login'], $conf['SMPP']['pass']); $esme->dir = 'TX'; $esme->address_range = $conf['SMPP']['addrange']; $esme->addr_ton = $conf['SMPP']['at']; $esme->addr_npi = $conf['SMPP']['an']; $esme->dbcoding = $conf['ESME']['dbcoding']; $esme->sbcoding = $conf['ESME']['sbcoding']; $esme->mbcoding = $conf['ESME']['mbcoding']; } if ($esme->state > ESS_CONNECTED && $esme->last_enquire < time() - $conf['ESME']['enquire']) { if (!$esme->enquirelink()) { $esme->sock->disconnect(); $esme->state = ESS_DISCONNECTED; } else { $esme->last_enquire = time(); }
/** * Forms PDU. * @access public * @param int $cmd Command id * @param array $pars Parameters * @return string PDU */ public function form_pdu($cmd, $pars = array()) { $pdu = null; switch ($cmd) { case BIND_TX: case BIND_RX: $pdu = pack('a' . (strlen($this->login) + 1) . 'a' . (strlen($this->pass) + 1) . 'a' . (strlen($this->system_type) + 1) . 'CCCa' . (strlen($this->address_range) + 1), $this->login, $this->pass, $this->system_type, 0x34, $this->addr_ton, $this->addr_npi, $this->address_range); $this->sqn++; break; case SUBMIT_SM: $pdu = pack('a' . (strlen($pars['stype']) + 1) . 'CCa' . (strlen($pars['src']) + 1) . 'CCa' . (strlen($pars['dst']) + 1) . 'CCCa' . (strlen($pars['sdt']) + 1) . 'a' . (strlen($pars['valid']) + 1) . 'CCCCC', $pars['stype'], $pars['st'], $pars['sn'], $pars['src'], $pars['dt'], $pars['dn'], $pars['dst'], $pars['esm'], $pars['proto'], $pars['prior'], $pars['sdt'], $pars['valid'], $pars['deliv'], $pars['repl'], $pars['dc'], $pars['msgid'], strlen($pars['text'])) . $pars['text']; break; case ENQUIRELINK: case UNBIND: $this->sqn++; break; case DELIVER_SM | ACK: $pdu = pack('a2', '0'); break; } if (isset($pars['sqn'])) { $sqn = $pars['sqn']; } else { $sqn = $this->sqn; } return NIMF_esme::form_pdu_header($cmd, strlen($pdu), $sqn) . $pdu; }
$db = new NIMF_mysqli($conf['DB']['host'], $conf['DB']['login'], $conf['DB']['pass'], $conf['DB']['db']); if (mysqli_connect_errno()) { l('Could not connect to DB: ' . mysqli_connect_error(), L_EMRG); unset($db); sleep(5); continue; } else { l('Connected to DB successfully: ' . $db->host_info); $db->put('SET NAMES "' . $conf['DB']['charset'] . '"'); $db->put('SET SESSION query_cache_type = OFF'); $db->autocommit(false); } } // check for SMPP connect if (!isset($esme)) { $esme = new NIMF_esme($conf['SMPP']['host'], $conf['SMPP']['port'], $conf['SMPP']['login'], $conf['SMPP']['pass']); $esme->dir = 'RX'; $esme->address_range = $conf['SMPP']['addrange']; $esme->addr_ton = $conf['SMPP']['at']; $esme->addr_npi = $conf['SMPP']['an']; $esme->dbcoding = $conf['ESME']['dbcoding']; $esme->sbcoding = $conf['ESME']['sbcoding']; $esme->mbcoding = $conf['ESME']['mbcoding']; } if ($esme->state > ESS_CONNECTED && $esme->last_enquire < time() - $conf['ESME']['enquire']) { if (!$esme->enquirelink()) { $esme->sock->disconnect(); $esme->state = ESS_DISCONNECTED; } else { $esme->last_enquire = time(); }