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


高老师陪您成长...

  <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第1张图片 


EE                                                  EE

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

      的架构设计与实践


By 高煥堂 於台北


1. 架构设计:家庭物联网与移动互联网的整合架构

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

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第2张图片

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

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第3张图片

    当智能电视成为移动互联网的客户端时,家人在家庭外时,其手机就成为家庭内电视的客户端了。家庭里的地毯状态,可透过智能电视而将信息推送到家人的手机(客户)端。

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第4张图片


    即使仅仅使用<通用型>客户端:浏览器(Browser);也能随时向家庭里的智能电视查询地毯的状态,或发号控制信号。

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第5张图片


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


2. 实践案例:手机与Android TV的多机整合

2.1 应用情境

  这是2012921于秦皇岛市举行的<智能电视软硬整合产业联盟会议>>开幕时,副市长(如下图)以他自己的手机上网访问会议厅中AndroidTV里的i-Jetty网页,再透过AndroidApp发出Zigbee信号,打开会议厅的主灯和电视墙。

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第6张图片


用户手机上跑浏览器(Browser),用户上网访问会议厅里Android智能电视。

其通信架构为:

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第7张图片

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


2.2 iPhone手机端的规划

在这个范例里,为了让各种移动终端皆能来访问Android TV,就不特别去开发iPhone客户端的App了。而是,直接采取通用的一般浏览器(Browser)做为这个案例的手机客户端软件了。如下图:

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第8张图片


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

<家庭物联网>与<移动互联网>衔接 的架构设计与实践_第9张图片

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


范例代码

//index.html

Inserttitle here

智能家庭移动互联网

   

         

  • 控制操作:
  •          

             

  •                 zigbeecmd=1">

  •          

             

  •                 zigbeecmd=0">

  •    


    2.3 衔接iPhone手机端的接口:Servlet

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

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第10张图片


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

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第11张图片


    其中,与手机端的浏览器对接;而则与本地App来对接。然后则透过来与衔接起来。

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第12张图片


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

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第13张图片


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


    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第14张图片


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

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第15张图片


    其通信的过程就如下图所示。

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第16张图片


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


    详细接口设计

      这EIT造形的提供Servlet接口来与手机浏览器来对接。这EIT造形的使用AndroidContext接口来与Android框架通信。

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第17张图片


    迅速落实为代码

       已经存在Android App和驱动软件,如下:

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第18张图片


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

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第19张图片


    绑定了Service之后,就能调用到AndroidApp和驱动软件,如下:

    <家庭物联网>与<移动互联网>衔接 的架构设计与实践_第20张图片


    代码范例

    // 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= 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("");

                  out.println("

    TVZigbeeStatus From i-Jetty in FamilyCoud!

                               RESULT is " +pProxy.getStatus(

                              "Text_POWERSTATUS") + "

    ");

                 out.println("");

                 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) {

                                String[] strings = {"","On"};

                                strings[0] = what;

                                strings[1] = value;

                                Parcel pc = Parcel.obtain();

                                pc.writeStringArray(strings);

                                Parcel pc_reply = Parcel.obtain();

                                try{ ib.transact(1, pc, pc_reply, 0);

                                } catch (Exception e) {  e.printStackTrace(); }

                         }

    }}


    ~ End ~

    DDD&& 參考文章(请点选) &&DDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDD

    1. 智能家庭的软硬整合段架构设计>_案例解说

    2. 智能&大数据时代,架构师思维的十个步骤和演练

    3. 基于框架(Framework)的平台开发技术_百篇文章

    4. 高焕堂的9eBooks(可下载)

    DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD