Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 08:04, 6 June 2008.

Web Runtime Widgetでデバイスリソースを利用する方法

From Forum Nokia Wiki


原文(英語): How to utilize device resources from a WRT widget

System Info Service APIは、Web RuntimeをサポートするS60端末上における、機能とプロパティへのアクセス手段を、ある限られた範囲で提供します。現在のWeb Runtime実装は、厳重なセキュリティサンドボックス上で実行するようになっていて、それ以外のシステム情報を公開していません。

Web Runtimeのアップデートリリースを待つ間、より多くのシステム情報へのアクセス手段を提供するため、何らかのより深いシステム統合を提供する方法の1つは、端末上でローカルにWebサーバを起動し、スクリプト言語(Python, PHP)またはネイティブのC++アプリケーションを利用し、Web Runtime Widgetと通信することです。

最も簡単なアプローチは、Mobile Web Server [1] または PAMP [2] を使用することです。これらは、作成したスクリプトをホスティングするのに適した環境をWebサーバとして提供します。

本記事における部分コードと例題は、Web Runtime Widgetをサポートするデバイス上で、Eドライブ上にhtdocsフォルダを置き、PAMPがうまくインストールされ、実行できることを想定しています。

Contents

Pythonスクリプト

次に示すMWSドキュメント中でのガイドライン[3]に従い、PAMPまたはMWS(Mobile Web Server) Apacheをインストールした上で、Pythonスクリプトをホスティング起動することができます。

S60のプラットフォームセキュリティによる制限により、Apacheインストールした上でスクリプトを実行しても、位置関連の情報にはアクセスできません。

PHPスクリプト

PHPのS60 APIドキュメント[4]は、まだ情報が不十分です。しかし、開発者にとっては良いスタートを切れるといえます。

SMSを送信する簡単なWidgetを作成する

Pythonスクリプトを作成する

下記スクリプトは、HTTPクエリー文字列から受信者の電話番号とメッセージ内容を読込み、SMSメッセージを送信します。

ここでは、コードをtest.pyとして保存しています。次のステップでht.aclファイルを作成する時に、これを念頭に置いてください。

"file test.py" 
 
def handler(req):
  from mod_python import apache, util
  import messaging
  
  req.content_type = 'text/plain'
  req.encoding = "UTF-8"
  
  request_data = util.FieldStorage(req)
    
  try:
  
    number = request_data.getfirst("number")
    message = request_data.getfirst("message")        
    
    messaging.sms_send(number, message)
        
    req.write( "succeeded" )    
  
  except KeyError:
    number = None
    message = None
    req.write("failed")    
   
  return apache.OK

mod_pythonページのハンドラ情報を定義する

以下に示すような内容で、ht.aclファイルを作成します。

AddHandler mod_python .py
PythonHandler test
PythonDebug On 
Options None
 
Order Deny,Allow
Allow from all
 
<FilesMatch "\.(pyc|psp)$">
    Deny from all
</FilesMatch>

各ファイルを、PAMPをインストールするドキュメントルートにコピーする

.pyと.aclの各ファイルを、手動で e:\Data\apache\htdocs\PAMPsmsSender\ にコピーするか、またはそれを行うためにSISパッケージを作成します。

Web Runtime Widgetを作成する

簡単な Web Runtime Widgetを作成する方法についての情報は、Forum NokiaサイトにあるWeb Runtime Widgetのドキュメント [5] をご覧ください。

上記で示したPythonスクリプトと通信するのに必要なJavaScriptコードは簡単です。

ここでは、間もなくリリースされるWRTKit(Web Runtime Kit)バンドルを使います。これは、作成するWidget UIにコンポーネントとコマンドハンドラを追加しますが、自分の好きなUIを普通に実装できます。

作成するPythonスクリプトのURLを定義する

var PY_URL = "http://127.0.0.1/PAMPsmsSender/.py?";

WRTKitのUIマネージャ、メインビュー、その他必要なUIコンポーネント用に定数を導入します。

UIを構成し、Sendボタンへのコマンドハンドラを追加します。

// Reference to the WRTKit user interface manager and main view.
var uiManager;
var mainView;
 
// Reference to controls in the main view.
var sendButton;
var numberField;
var messageField;
 
 
// Called from the onload event handler to initialize the widget.
function init() {
	
    // set tab-navigation mode and show softkeys
    // (only if we are in the WRT environment)        
    
    if (window.widget) {        
        widget.setNavigationEnabled(false);
        menu.showSoftkeys();
    }
    
    // create UI manager
    uiManager = new UIManager();
    
    // create main view
    mainView = new ListView(null, "Send an SMS");
 
    // add a text field to the view
    numberField = new TextField(null, "Recipient");
    mainView.addControl(numberField);
     
    // add a text field to the view
    messageField = new TextArea(null, "Message");
    mainView.addControl(messageField);
     
    // add a button to the view
    sendButton = new FormButton(null, "Send");
    sendButton.addEventListener("ActionPerformed", sendButtonClicked);
    mainView.addControl(sendButton);
	
    // display the main view
    uiManager.setView(mainView);
}
 
function sendButtonClicked(event){
    var number = numberField.getText();
    var msg = messageField.getText();
    if (number.length == "") {
        uiManager.showNotification(2000, "warning", "Enter recipient number!");
    }
    else if (msg.length == "") {
        uiManager.showNotification(2000, "warning", "Enter message text!");
    }
    else {
        sendMsg();
    }
}

Pythonスクリプトへリクエストを発行するコードを追加し、リクエストの進行状況を制御します。

function sendMsg() {
  uiManager.showNotification(-1, "wait", "Sending...", -1);
  var req = createXMLHttpRequest();
  if (req) {
    
    var params = "number="+numberField.getText()+"&message="+messageField.getText();
  
    var url = PY_URL + params;
        
    loadXMLDoc(req, url);
  }
}
 
 
// Creates an XMLHttpRequest object
function createXMLHttpRequest() {
  var req = null;
  try {
    req = new XMLHttpRequest();
    // Make sure that the browser supports overrideMimeType
    if (typeof req.overrideMimeType != "undefined") {
      req.overrideMimeType("text/html");
    }
  } catch (ex) {
    req = null;
  }
  
  return req;
}
 
// Loads target XML document (url) into XMLHttpRequest
function loadXMLDoc(req, url) {
 
  // Register a callback function which gets called when the request state changes
      req.onreadystatechange = function() {
      processStateChange(req);
      };
   
  req.open("GET", url, true);
  // Transmit the request
  req.send(null);
}
 
// Processes state changes of XMLHttpRequest
function processStateChange(req) {
  // Request states are 0 through 4, where 4 equals complete
   
  if (req.readyState == 4) {
        
    if (req.status == 200) {
        uiManager.hideNotification();
        showStatus();
    }
    }
  }
 
 
function showStatus(req) {
  uiManager.showNotification(3000, "info", "Message sending "+req.responseText);
}

ここで実際に行うことは、正しいクエリー文字列でPythonスクリプトにXMLHttpRequestを発行することです。

Inboxフォルダからメッセージを読込む

端末のInboxフォルダのメッセージは、PythonまたはPHPで読むことができます。 Pythonスクリプトは、上記で示したSMS送信の例と同じような形式でインストールできます。

PHPスクリプトは手動でコピーするか、SISファイルを使ったApacheのhtdocsフォルダ下の適切なフォルダへインストールすることができます。

部分コードは若干HTMLのフォーマットを行っていますが、要求により良く応えるため、レスポンスコンテンツを再作成する必要が出てくる可能性があります。

Python

"file test.py" 
 
def handler(req):
  from mod_python import apache
  import inbox
  from time import ctime
  
 
  req.content_type = 'text/html'
  req.encoding = "UTF-8"
  
  i = inbox.Inbox()
  m = i.sms_messages()  # all message ID's
  
  req.write("<div class=\"messagelist\" id=\"smslistdiv\">")
  
  for s in m:
    req.write("<p class=\"msgheader\" id=\"header_")
    req.write(str(s))
    req.write("\">")
    req.write(ctime(i.time(s)))
    req.write("  -  ")
    req.write(i.address(s))
    req.write("</p>")
    
    req.write("<p class=\"msgtext\" id=\"body_")
    req.write(str(s))
    req.write("\">")
    req.write(i.content(s).encode("utf-8"))
    req.write("</p>")
  
  req.write("</div>")
  
  return apache.OK

PHP

<?php
  print "<div class=\"messagelist\" id=\"smslistdiv\">";
 foreach (s60_inbox_get_messages() as $msg) {
         print "<p class=\"msgheader\">"; 
         print 'From: '.$msg->sender()."<br/>\n";
         print 'When: '.strftime ("%x %X", $msg->time())."<br/>\n";
         print "</p>";
         print "<p class=\"msgtext\">";
         print 'Content: '.$msg->content()."<br/>\n";
         print "</p>";
         }
  print "</div>";
?>

WidgetのHTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link rel="StyleSheet" href="styles/general.css" type="text/css" />
    <script type="text/javascript" src="scripts/scripts.js" />
    <title>Inbox messages</title>
  </head>
  <body id="body">  
  <div id="contents"></div>  
  </body>
</html>

WidgetのJavaScript

window.onload = init;
var PY_SCRIPT_URL = "http://127.0.0.1/inboxTest/.py";
var PHP_SCRIPT_URL = "http://127.0.0.1/inboxTest/inboxtest.php";
 
var PY_MENU_ITEM_ID = 993;
var PHP_MENU_ITEM_ID = 994;
 
// Initializes the widget
function init() {
  window.menu.showSoftkeys();
  window.widget.setNavigationEnabled( false );
  createMenu();
}
 
function getMsgs( id ) {
  var requrl;
  
  switch (id)
  {
    case PY_MENU_ITEM_ID:
      requrl = PY_SCRIPT_URL;
      alert("Calling Python script");
      break;
    case PHP_MENU_ITEM_ID:
      alert("Calling PHP script");
      requrl = PHP_SCRIPT_URL;
      break;
  }
      
  var req = createXMLHttpRequest();
  
  if (req) {              
    loadXMLDoc(req, requrl);
  }
}
 
 
// Creates an XMLHttpRequest object
function createXMLHttpRequest() {
  var req = null;
  try {
    req = new XMLHttpRequest();
    if (typeof req.overrideMimeType != "undefined") {
      req.overrideMimeType("text/html");
    }
  } catch (ex) {
    req = null;
  }
  
  return req;
}
 
// Loads target XML document (url) into XMLHttpRequest
function loadXMLDoc(req, url) {
 
  // Register a callback function which gets called when the request state changes
      req.onreadystatechange = function() {
      processStateChange(req);
      };
   
  req.open("GET", url, true);
  // Transmit the request
  req.send(null);
}
 
// Processes state changes of XMLHttpRequest
function processStateChange(req) {
  // Request states are 0 through 4, where 4 equals complete
  if (req.readyState == 4) {
        
    if (req.status == 200) {
      showList(req);
    }
   
    }
  }
 
 
function showList(req) {
  widget.prepareForTransition("fade");
  var mybody = document.getElementById("contents");
  mybody.innerHTML = req.responseText;
  widget.performTransition();
}
 
function createMenu(){
  var menu1 = new MenuItem("Fetch using Python", PY_MENU_ITEM_ID);    
  var menu2 = new MenuItem("Fetch using PHP", PHP_MENU_ITEM_ID);
  menu1.onSelect = getMsgs;
  menu2.onSelect = getMsgs;
  
  window.menu.append(menu1);
  window.menu.append(menu2);  
}

既知の問題、ヒント(Tips)、コツ(Tricks)、その他

変更したPythonスクリプトを実行する場合、その前にPAMPまたはMWSを再起動する必要があります。

Related Discussions
Thread Thread Starter Forum Replies Last Post
Runtime Sockets Creation ??? priya83 Symbian Networking & Messaging 3 2006-08-12 18:16
RuntimeException:for Series 60 2nd Ed SDK for Symbian OS,FP2 Rameshwari Mobile Java General 3 2006-08-11 22:40
Edit mode in AknForms akerfeldt Symbian User Interface 2 2003-10-29 09:35
Icon Library kevin1964 Mobile Java Media (Graphics & Sounds) 2 2004-06-29 20:18
Allow web access?? newmania Mobile Java General 0 2003-04-30 00:44
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX