信息端口

概述

本文演示信息端口设备API的使用,此API用于WebApplication到WebApplication和WebApplication到Native Application之间的通信。 Tizen帮助链接可以得到更多关于信息端口的信息。 从这个链接https://developer.tizen.org/help/topic/org.tizen.web.device.apireference/tizen/messageport.html可以得到更多关于发信息的细节。

信息端口设备提供两种类型的端口:

LocalMessagePort

一个本地/Web应用必须要注册LocalMessagePort,才能从其他应用程序收到信息。

RemoteMessagePort

一个本地/Web应用程序使用RemoteMessagePort向其他本地/Web应用程序发送信息。

Web到Web通信

MessagePort客户端应用程序

在这个例子中,应用程序的用户可以在两个web应用程序如管道和socket编程模型之间交换信息。 对于这个客户端,应用程序注册一个端口"WEB_LOCAL_PORT"用来从其他应用程序接收信息,并且注册回调函数以接收信息。 回调API也返回一个远端端口,客户端应用程序使用这个端口来向被调用的应用程序发送信息。

var localPort = tizen.messageport.requestLocalMessagePort("WEB_LOCAL_PORT");
var localPortWatchId = localPort.addMessagePortListener(function(data, remote)
{
   data.forEach(function(item)
   {
     $("#Msgs").append('<p>' + item.value + '</p>' );
     var remotePort = tizen.messageport.requestRemoteMessagePort('ItrxfbL8qq.MessagePortApplication', remote.messagePortName);
     var MsgString = "Received "+ item.value ;
     remotePort.sendMessage(  [  {key:"Msg", value:MsgString},]);
   });
});

信息端口聊天应用程序

Html页面

该聊天应用程序包含输入,以及用于发送信息到客户端应用程序的按钮。

<table>
  <tr>
    <td>
      <input type="text" id="inputField" />
    </td>
    <td>
      <div data-role="button" onclick="sendMessage()">Send</div>
    </td>
  </tr>
</table>
Javascript代码

一旦用户输入信息并点击发送按钮时,文本输入区的内容就被发送到客户端Web应用程序。 因此,RemoteMessagePort需要知道客户端应用程序id UPgEpKpVy4.MessagePortClient和端口名字WEB_LOCAL_PORT,以使用sendMessage发送信息。

webRemoteMsgPort =  tizen.messageport.requestRemoteMessagePort('UPgEpKpVy4.MessagePortClient', 'WEB_LOCAL_PORT');
var data = [{key:'Msg', value:  $('#inputField').val()}];
document.getElementById("inputField").value='';
webRemoteMsgPort.sendMessage(data, webLocalMsgPort);

MessagePort API支持分享Web应用程序的本地端口id给客户端应用程序,以便反馈信息给服务端应用程序。 创建LocalMessagePort和注册回调函数的代码给出如下。

webLocalMsgPort = tizen.messageport.requestLocalMessagePort("WEB_PORT_RESPONSE");
webLocalMsgPort.addMessagePortListener(function(data, remote){
  data.forEach(function(item)
  {
     $("#msgs").append("<p>" + item.value + "</p>") ;
  });
})

Web到本地客户端应用程序

在这个例子中,用户可以通过一个web应用程序云修改设备的通知,媒体和铃声音量。 Tizen SDK并不支持直接访问控制系统硬件。 这样,创建混合应用程序,和使用信息端口的本地应用程序进行通信。

音量控制混合应用程序

Html页面

Web页面包含控制滑块,用于为通知,系统和铃声修改媒体音量。 控制块的代码如下.

<div data-role="content"gt;
<p>Change Volume using Hybrid Application</p>
<div>
  <h4>Notification Volume Control</h4>
  <input id="notification" data-popupenabled="false" type="range" value="0" min="0" max="15" />
</div>
<div>
  <h4>System Volume Control</h4>
  <input id="system" data-popupenabled="false" type="range" value="0" min="0" max="15" />
</div>
<div>
<h4>Ringtone Volume Control</h4>
<input id="ringtone" data-popupenabled="false" type="range" value="0" min="0" max="15" />
</div>
</div>
</divgt;
JavaScript

该应用程序注册回调函数,用于为滑块改变事件,以更新媒体音量。

$("#notification").on("change", function(val ){
	console.log("inside jquery function "+ $("#slider6").val()) ;
	updateVolume("Notification", $("#notification").val() ) ;
});
$("#system").on("change", function(val ){
	console.log("inside jquery function "+ $("#slider6").val()) ;
	updateVolume("System,", $("#system").val() ) ;
});
$("#ringtone").on("change", function(val ){
	console.log("inside jquery function "+ $("#slider6").val()) ;
	updateVolume("Ringtone", $("#ringtone").val() ) ;
});

要改变媒体控制的音量,web应用程序首先要用下面的代码启动本地服务应用,并用信息端口发送音量到本地客户端。 RemoteMessagePort和SendMessage代码如下所示。

function LaunchNativeService() {
	try {
		tizen.application.getAppsContext(onGetAppsContextSuccess, onGetAppsContextError);
	} catch (exc) {
		console.log("Get AppContext Error");
	}
}
function onGetAppsContextSuccess(contexts) {
	for (var i = 0; i < contexts.length; i++) {
		var appInfo = tizen.application.getAppInfo(contexts[i].appId);
		//console.log("appinfo"+ appInfo.id);
		if(appInfo.id == gServiceAppId){
			console.log("Running Service App found");
			ServiceAppFound=true;
			break;
		}
	}
	if (ServiceAppFound) {
		initMessagePort();
	}else{
		console.log("Service app not ready, will launch the service now");
		launchServiceApp();
	}	

}

function initMessagePort()
{
	console.log("initMessagePort");
	remoteMsgPort = tizen.messageport.requestRemoteMessagePort(gServiceAppId, 'NATIVE_LOCAL_PORT');
	localMsgPort = tizen.messageport.requestLocalMessagePort("SAMPLE_PORT_RESPONSE");
	localMsgPort.addMessagePortListener(function(data, remote){
		data.forEach(function(item)
		{
			if( item.value=="Success")
				alert("Update"+ item.key+ "Volume Successfuly" );
			else
				alert("Failed to update"+ item.key+ "Volume" );
		});		  

	} );
}
function launchServiceApp() {
	function onSuccess() {
		console.log("Service App launched successfully!");
		// Now initialize the message ports
		console.log("Initializing message ports");
		initMessagePort();
	}

	function onError(err) {
		console.log("Service Applaunch failed");
		isStarting = false;
	}

	try {
		console.log("Launching [" + gServiceAppId + "]");
		tizen.application.launch(gServiceAppId, onSuccess, onError);
	} catch (exc) {
		alert("launch exc:" + exc.message);
	}
}
function updateVolume( systemkey, volume)
{

	console.log("inside updateNotifyVolume" + systemkey + volume ) ;	

	remoteMsgPort.sendMessage(
			[
			 { key:systemkey, value:volume }
			 ], localMsgPort );	

}

本地音量控制服务

要修改媒体音量,则要使用System Info的setVolume API。 此API需要键值和数值来设置音量。 下面的表格列出通知,系统和铃声的键值。

媒体
通知 http://tizen.org/setting/sound.notification.volume
系统 http://tizen.org/setting/sound.system.volume
铃声 http://tizen.org/setting/sound.ringtone.volume

本地服务

对于本地服务要监听MessagePorts,该类要从Tizen::Io::IMessagePortListner继承,而且当Web应用程序把数组数据发送到本地服务时,OnMessageReceivedN回调函数被调用。 要修改系统数据,SystemInfo api的SetValue方法要被调用。

void
MessagePortServiceApp::OnMessageReceivedN(Tizen::Io::RemoteMessagePort* pRemoteMessagePort, Tizen::Base::Collection::IMap* pMessage)
{
	bool isExists ;
	String key;
	String *value;
	String returnKey ;
	pMessage->ContainsKey(String(L"Notification"), isExists);
	if(isExists == true )
	{
		returnKey = L"Notification" ;
		key=L"http://tizen.org/setting/sound.notification.volume";
		value = static_cast (pMessage->GetValue(String(L"Notification")));
	}
	else
	{
		AppLog("-------LakshmiElse");
		pMessage->ContainsKey(String(L"System"), isExists);
		if(isExists == false )
		{
			returnKey = L"Ringtone" ;
			key=L"http://tizen.org/setting/sound.ringtone.volume";
			value = static_cast (pMessage->GetValue(String(L"Ringtone")));
		}
		else
		{
			returnKey = L"System" ;
			key=L"http://tizen.org/setting/sound.system.volume";
			value = static_cast (pMessage->GetValue(String(L"System")));

		}
	}
	result r = setVolume( key, *value) ;
	String res;
	if(r == E_SUCCESS)
	{
		res = L"Success";
	}
	else
		res = L"Failure";

	HashMap* pMap = new HashMap(SingleObjectDeleter);
	pMap->Construct();
	pMap->Add(returnKey, res);
	pRemoteMessagePort->SendMessage( __pLocalMessagePort,  pMap);
}

result
MessagePortServiceApp::setVolume(String &key, String&value)
{
	result r = E_SUCCESS;
	int volume ;
	AppLog("Before Parsing Value");
	Tizen::Base::Integer::Parse( value,volume);
	r = SettingInfo::SetValue(key, volume);
	return r ;
}

屏幕截图