<家庭物联网;与<移动互联网;衔接 的架构设计与实践

【< 家庭物联网; 与< 移动互联网; 衔接 的架构设计与实践】少年乘勇气,百战过乌孙。这篇文章主要讲述< 家庭物联网; 与< 移动互联网; 衔接 的架构设计与实践相关的知识,希望能为你提供帮助。


前言:当智能电视成为移动互联网(如微信等)的客户端时,就形成双层的树状结构了。当智能电视成为移动互联网的客户端时,家人在家庭外时,其手机就成为家庭内电视的客户端了。家庭里的地毯状态,可透过智能电视而将信息推送到家人的手机(客户)端。


高老师陪您成长...
   

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片
 


EE                                                   EE
< 家庭物联网> 与< 移动互联网> 衔接

      的架构设计与实践


By 高煥堂 於台北



1. 架构设计:家庭物联网与移动互联网的整合架构
    就通信层而言,家庭物联网是网状结构的,在软件架构上可以设计成为树状结构。如下图:

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片


    当智能电视成为移动互联网(如微信等)的客户端时,就形成双层的树状结构了。

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片


    当智能电视成为移动互联网的客户端时,家人在家庭外时,其手机就成为家庭内电视的客户端了。家庭里的地毯状态,可透过智能电视而将信息推送到家人的手机(客户)端。
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



    即使仅仅使用< 通用型> 客户端:浏览器(Browser);也能随时向家庭里的智能电视查询地毯的状态,或发号控制信号。
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



    这就典型的< 手机与androidTV> 的多机整合、多屏互动的软硬整合系统(或产品)了。


2. 实践案例:手机与Android TV的多机整合
2.1 应用情境
  这是2012年9月21日于秦皇岛市举行的< 智能电视软硬整合产业联盟会议> > 开幕时,副市长(如下图)以他自己的手机上网访问会议厅中AndroidTV里的i-Jetty网页,再透过AndroidApp发出Zigbee信号,打开会议厅的主灯和电视墙。
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



用户手机上跑浏览器(Browser),用户上网访问会议厅里Android智能电视。
其通信架构为:

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片


    Android智能电视里有App软件和相关的Zigbee设备驱动,能控制会议厅里的主灯和电视墙。


2.2 iPhone手机端的规划
在这个范例里,为了让各种移动终端皆能来访问Android TV,就不特别去开发iPhone客户端的App了。而是,直接采取通用的一般浏览器(Browser)做为这个案例的手机客户端软件了。如下图:
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



如上图所示,从手机上网联机之后,手机浏览器出现首页画面如下:

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片


这首页的网页html代码如下:


范例代码
//index.html
< !DOCTYPEhtml PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
< html>
< head>
< metahttp-equiv="Content-Type" content="text/html; charset=gbk">
< title> Inserttitle here< /title>
< /head>
< body>
< h1> 智能家庭 – 移动互联网< /h1>
    < div >
          < li> 控制操作:< /li>
          < p>
          < li > < center> < ahref="https://www.songbingjia.com/android/ZigbeeDemo?
                zigbeecmd=1"> < img src="https://www.songbingjia.com/android/RED.jpg"border="0"> < /a> < /center> < /li>
          < p>
          < li> < center> < ahref="https://www.songbingjia.com/android/ZigbeeDemo?
                zigbeecmd=0"> < img src="https://www.songbingjia.com/android/BLUE.JPG"border="0"> < /a> < /center> < /li>
    < /div>
< /body>
< /html>


2.3 衔接iPhone手机端的接口:Servlet
    刚才说过了,Android智能电视里有App软件和相关的Zigbee设备驱动,能控制会议厅里的主灯和电视墙。亦即,手机的浏览器软件要与Android框架通信,进而调用到其App软件。

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



iPhone手机与AndroidTV是两个相互竞争的平台,也是各自发展的。那么,又如何将两个平台整合起来呢? 答案是:运用EIT造形,如下图:

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



其中,< E> 与手机端的浏览器对接;而< T> 则与本地App来对接。然后< E> 则透过< I> 来与< T> 衔接起来。
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片




< E> 接受来自手机浏览器的信息(如标准HTTP信息格式),透过< I> 接口来调用< T> ,而< T> 则将信息转化为App可理解的信息格式。

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



  当我们心怀EIT造形时,就常常会发现身边早已存在形形***的EIT造形了,不一定都要自己来开发EIT造形的代码。例如,想如上图的规划来整合iPhone手机与Android电视;就会发现i-Jetty是一个现成的EIT造形的代码。于是,我们找到现成的< E& I> 平台,就是:i-Jetty框架。


&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



    这i-Jetty本身是以Android应用程序形式嵌入(运行)于Android平台里,它可以透过Android框架的API与其它应用程序沟通。因而,在i-Jetty里执行的Servlet程序也能透过该AndroidAPI而与其它应用程序沟通、分享数据。例如,在家庭的AndroidTV里,加入一个i-Jetty插件,来容纳HTML网页和Servlet程序。数千公里外的家庭成员,透过手机Browser解析HTML,与家里的TV沟通,形成大小屏互动、多机整合的架构设计了。
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



其通信的过程就如下图所示。
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



    秦皇岛副市长以他自己的手机上网访问会议厅中AndroidTV里的i-Jetty网页,再透过AndroidApp发出Zigbee信号,打开会议厅的主灯和电视墙。


详细接口< I> 设计
  这EIT造形的< E> 提供Servlet接口来与手机浏览器来对接。这EIT造形的< T> 使用Android的Context接口来与Android框架通信。
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



迅速落实为代码
    已经存在Android App和驱动软件,如下:

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



    由开发者来撰写Servlet代码,透过Context接口来绑定(Bind)了Android的Service服务。如下:

&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



绑定了Service之后,就能调用到AndroidApp和驱动软件,如下:
&lt;家庭物联网;与&lt;移动互联网;衔接 的架构设计与实践

文章图片



代码范例
// myBinder
packagecom.google.android.ZigbeeApp;
importandroid.content.Context;
import android.os.Binder;
import android.os.Parcel;


public class myBinderextends Binder {
private ZigbeeAppData mZigbeeAppData ;
        privateContext context ;
        publicmyBinder(Context ctx){
                context= ctx ;
                mZigbeeAppData= https://www.songbingjia.com/android/new ZigbeeAppData();
}      
@Override
      public boolean onTransact( int code,Parcel data, Parcel reply, int flags)
          throws android.os.RemoteException {
            if (code == 1)
      reply.writeString(
                  mZigbeeAppData.getAppData(data.readString()) );
            else if (code == 2)
            {   String [] strings = {};
                data.readStringArray(strings) ;
                mZigbeeAppData.setAppdata(strings[0], strings[1]) ;
            }
            return true ;
  }}


// myService
packagecom.google.android.ZigbeeApp;
import android.app.Service;
importandroid.content.Intent;
import android.os.IBinder;


public class myService extends Service{
        private IBinder mBinder = null ;
        @Override public void onCreate() {
              mBinder = newmyBinder(getApplicationContext());
        }
        @Override public IBinder onBind(Intent intent){   return mBinder ;   }
}


// myTVServlet
package org.mortbay.ijetty;
importjava.io.IOException;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
import android.content.ComponentName;
import android.content.Intent;
importandroid.content.ServiceConnection;
import android.os.IBinder;
import android.os.Parcel;
import android.util.Log;


public class myTVServlet extends HttpServlet{
      private static final longserialVersionUID = 1L;
      private String proofOfLife ;
      private myTVProxy pProxy = null ;


      public void init(ServletConfig config)throws ServletException {
            super.init(config);
android.content.ContextandroidContext =
                  (android.content.Context)config.getServletContext().
                  getAttribute("org.mortbay.ijetty.context");
            proofOfLife=
                  androidContext.getApplicationInfo().packageName;
            androidContext.bindService ( newIntent(
                  "com.google.android.ZigbeeApp.REMOTE_SERVICE"),
                  mConnection,
                  android.content.Context.BIND_AUTO_CREATE);
          }
private ServiceConnection mConnection =
            new ServiceConnection() {
                    public voidonServiceConnected(
                        ComponentName className,IBinder ibinder)
                          {   pProxy = newmyTVProxy(ibinder);   }
                    public voidonServiceDisconnected(
                                  ComponentName className) {}
            };
protected void doGet( HttpServletRequest request,
                              HttpServletResponseresponse)
          throws ServletException,IOException {
              response.setContentType("text/html");
              ServletOutputStream out =response.getOutputStream();
              out.println("< html> ");
              out.println("< h1> TVZigbeeStatus From i-Jetty in FamilyCoud!
                            RESULT is " +pProxy.getStatus(
                          "Text_POWERSTATUS") + "< /h1> ");
              out.println("< /html> ");
              out.flush();
            }
      protected void doPost(HttpServletRequest request,
                            HttpServletResponseresponse)
            throws ServletException,IOException { }
          private class myTVProxy   {
                      private IBinder ib ;
                      private String mStatus ;
                      myTVProxy(IBinder ibinder)   { ib = ibinder ; }
                      public String getStatus(String what) {
                            Parcelpc = Parcel.obtain();
                            Parcelpc_reply = Parcel.obtain();
                            pc.writeString(what);
                            try{
                              ib.transact(1, pc, pc_reply, 0);
                              mStatus = pc_reply.readString();
                            } catch (Exception e) {   e.printStackTrace();   }
                            returnm Status ;                  
                        }
                    public void refreshStatus(String what, String value) {
           

    推荐阅读