X-Git-Url: https://git.cweiske.de/linksys-wrt3g-tools.git/blobdiff_plain/ee05c3a28ae30f6b30b559715eef017e8fa47f5a..6a5bf4c36f788ac0eb8112ccec0bbd371d5bbd94:/Wrt3g/HtmlParser.php diff --git a/Wrt3g/HtmlParser.php b/Wrt3g/HtmlParser.php index 03ac574..bd613ac 100644 --- a/Wrt3g/HtmlParser.php +++ b/Wrt3g/HtmlParser.php @@ -1,15 +1,15 @@ -* @license AGPL v3 -* @link http://cweiske.de/linksys-wrt3g-tools.htm -*/ + * HTML parsing for the linksys router HTML pages + * + * PHP version 5 + * + * @category Tools + * @package linksys-wrt3g-tools + * @author Christian Weiske + * @license AGPL v3 + * @link http://cweiske.de/linksys-wrt3g-tools.htm + */ class Wrt3g_HtmlParser { protected static $arTranslations = array( @@ -19,35 +19,78 @@ class Wrt3g_HtmlParser 'GPRS_MSG.ACQUIRING' => 'aquiring', 'GPRS_MSG.WWBEAR_GPRS' => 'GPRS', 'GPRS_MSG.WWBEAR_UMTS' => 'UMTS', + 'GPRS_MSG.None' => null, + 'GPRS_MSG.FAIR' => 'fair', + 'GPRS_MSG.GOOD' => 'good', + 'GPRS_MSG.EXCELLENT' => 'excellent', + 'GPRS_MSG.NOSIGNAL' => 'no signal', + 'GPRS_MSG.CTIME' => 'connection time', + 'GPRS_MSG.CFW' => 'card firmware', + 'GPRS_MSG.CMOD' => 'card model', + 'GPRS_MSG.CREV' => 'card revision', + 'GPRS_MSG.IMSI' => 'IMSI', + 'GPRS_MSG.SESSIONUSAGE' => 'session usage', ); /** - * Parses the body of /index_wstatus1.asp and returns extracted values. - * - * @param string $body HTML document to parse - * - * @return array Array of key-value pairs - */ + * Parses the body of /index_wstatus1.asp and returns extracted values. + * If no connection is established, the values are NULL. + * + * @param string $body HTML document to parse + * + * @return array Array of key-value pairs, probably with + * - "type" - i.e. "GPRS" + * - "network" - Carrier network name, i.e. "BASE DE" + * - "signal strength" - good, excellent, poor + */ public function index_wstatus1($body) { - $arRetval = array(); + $doc = new DomDocument(); + $doc->loadHtml($body); + $xpath = new DOMXPath($doc); + $entries = $xpath->query('//table/tr/td'); + $arMatches = array(); - preg_match_all('#>Capture\(([^)]+)\)saveXML($entry); + $s = str_replace( + array(''), + '', $s + ); + $s = strip_tags($s); + //some strange utf8 space char + $s = str_replace("\xC2\xA0", ' ', $s); + $s = trim($s); + $s = str_replace( + array('Capture(', ') :'), + '', $s + ); + if (substr($s, -1) == ')') { + $s = substr($s, 0, -1); + } + $arMatches[] = $s; + } + + + $arRetval = array(); $arData = array(); - reset($arMatches[1]); - while (current($arMatches[1])) { - $key = current($arMatches[1]); - $value = next($arMatches[1]); + reset($arMatches); + while (current($arMatches)) { + $key = current($arMatches); + $value = next($arMatches); if (isset(self::$arTranslations[$key])) { $key = self::$arTranslations[$key]; } if (isset(self::$arTranslations[$value])) { $value = self::$arTranslations[$value]; } + if ($value == 'aquiring') { + $value = null; + } $arRetval[$key] = $value; - next($arMatches[1]); + next($arMatches); } return $arRetval; @@ -56,16 +99,19 @@ class Wrt3g_HtmlParser /** - * Parses the body of /index_wstatus2.asp and returns extracted values. - * - * @param string $body HTML document to parse - * - * @return array Array with "connection" as key and one of "connecting", - * "connected" or "disconnected" as value. - */ + * Parses the body of /index_wstatus2.asp and returns extracted values. + * + * @param string $body HTML document to parse + * + * @return array Array with "connection" as key and one of "connecting", + * "connected" or "disconnected" as value. + */ public function index_wstatus2($body) { preg_match('/var status2 = "(.+)"/', $body, $arMatches); + if (!isset($arMatches[1])) { + return array(); + } $strStatus = $arMatches[1]; //Connecting @@ -73,4 +119,101 @@ class Wrt3g_HtmlParser //Connected return array('connection' => strtolower($strStatus)); } + + + + /** + * Parses the HTML body of /Status_NoAuth.asp and returns the extracted + * values. + * + * @param string $body HTML document to parse + * + * @return array Array of key-value pairs with the following keys: + * - type + * - network + * - signal strength + * - connection time + * - session usage (array) + * - card model + * - card revision + * - card firmware + * - IMSI + */ + public function status_noauth($body) + { + $body = str_replace( + array(' ', '', ''), + '', $body + ); + + $doc = new DomDocument(); + libxml_use_internal_errors(true);//html is broken + $doc->loadHtml($body); + $xpath = new DOMXPath($doc); + $trs = $xpath->query('//table//table/tbody/tr'); + $arRaw = array('connection' => null); + $bAquiring = false; + foreach ($trs as $tr) { + $titleItems = $xpath->query('td[@width=125]/text()', $tr); + $valueItems = $xpath->query('td[@width=296]/*[1]', $tr); + if ($titleItems->length && $valueItems->length) { + $title = substr($doc->saveXML($titleItems->item(0)), 8, -2); + $value = $doc->saveXML($valueItems->item(0)); + $arRaw[self::$arTranslations[$title]] = $value; + } + } + + foreach ($arRaw as $key => &$value) { + $value = trim(strip_tags($value)); + if (substr($value, 0, 8) == 'Capture(') { + $value = self::$arTranslations[substr($value, 8, -1)]; + if ($value == 'aquiring') { + $bAquiring = true; + $value = null; + } + } + } + unset($value); + + if ($bAquiring) { + $arRaw['connection'] = 'connecting'; + } else if ($arRaw['type'] != null) { + $arRaw['connection'] = 'connected'; + } else { + $arRaw['connection'] = 'disconnected'; + } + + if (isset($arRaw['connection time'])) { + $arRaw['connection time'] = str_replace( + array( + ' Capture(GPRS_MSG.HOURS)', + ' Capture(GPRS_MSG.MINUTE)', + ' Capture(GPRS_MSG.SECOND)', + ), + array( + 'h', 'm', 's' + ), + $arRaw['connection time'] + ); + } + + if (isset($arRaw['session usage'])) { + $arS = explode( + 'TX = ', + str_replace('RX = ', '', $arRaw['session usage']) + ); + if (count($arS) > 1) { + $arRaw['session usage'] = array( + 'received' => $arS[0], + 'sent' => $arS[1] + ); + } + } + + if (preg_match('/Capture\\(share.firmwarever\\):(.+?)