<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    桌面應用框架 OneRing

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    框架目標

    OneRing是一個跨平臺的桌面應用框架。和Adobe AIR類似,它支持用html/js/css制作用戶界面,與之不同的是,它的應用為本地程序,可以直接訪問操作系統的數據。

    架構

    一個OneRing應用程序分為兩個部分:框架部分和應用部分。

    框架部分

    框架部分為通用框架,各應用都一樣。其提供各操作系統上的界面展現,為本地窗口內嵌一個WebKit瀏覽器,并提供一致的js接口讓應用和操作系統功能進行交互。

    框架以運行時庫的形式提供。

    框架以系統原生語言編寫,提供其他語言的綁定。

    應用部分

    應用部分為一個web server,負責應用邏輯,用html/css描述界面,用js提供用戶交互。

    運行流程

    1. 應用啟動時,會加載框架的運行時庫,注冊應用url的訪問方法(如WSGI),并調用框架的loop函數。
    2. loop函數會訪問應用的 /init URL,得到一個json數據,描述初始應用窗口的相關參數,如位置、大小、窗口屬性、初始頁面url等。
    3. 框架根據該數據創建窗口,并讓該窗口內的瀏覽器訪問初始頁面url,渲染用戶界面,然后等待UI事件。
    4. 用戶在界面上操作時,可以通過超鏈接改變整個窗口內容,也可以使用AJAX技術更新窗口內部分內容。
    5. 應用可以讓瀏覽器調用ONERING名字空間下的js函數,和操作系統進行交互,該名字空間由url onering://onering/onering.js 加載。
    6. 應用通過 bind(event, function) 函數監聽窗口更改大小、移動等操作系統UI事件。
    7. 可以使用pub/sub機制主動推送消息給瀏覽器。
    8. 調用 ONERING.exit() 可以退出應用;所有窗口都關閉后也會退出應用。

    Python應用示例

    #!/usr/bin/env python
    import json
    import web
    import onering

    urls
    =(
       
    '/init','init',
       
    '/','index',
    )

    class init:
       
    def GET(self):
            web
    .header('Content-Type','application/json')
           
    return json.dumps({'width':400,'height':300,'url':'/'})

    class index:
       
    def GET(self):
            web
    .header('Content-Type','text/html')
           
    return"""<html>
    <head><script type="
    text/javascript" src="onering://onering/onering.js"></script></head>
    <body>
    <p>Hello, world!</p>
    <button onclick="javascript:ONERING.exit()">Exit</button>
    </
    body></html>"""

    app = web.application(urls, globals())

    if __name__ == '__main__':
        onering.register_wsgi_app("
    demo", app.wsgifunc())
        onering.loop("
    demo")

    各組件之間的交互

    一個OneRing應用中,存在三個需要互相通訊的組件:

    1. 操作系統 OS ,控制窗口行為(如最小化窗口),及操作系統相關界面元素(如系統通知圖標)
    2. 運行在WebKit內的javascript,控制界面內元素(如程序界面里的按鈕)
    3. WSGI應用,控制HTML/JS的生成邏輯,以及應用相關的后臺邏輯

    js -> os

    當js需要通知os對js所在窗口做某個行為(如最小化),通過調用 onering.js 中的get_current_window()返回值(為Window對象)的相應方法實現:

    var current_window = ONERING.get_current_window();
    current_window
    .minimize();

    當js需要os執行整個應用層面的操作時(如結束應用),通過調用 onering.js 中的函數實現:

    ONERING.exit();

    當js需要os創建一個新窗口時,通過調用createWindow函數實現,并獲得新建窗體的句柄實例:

    new_window = ONERING.createWindow('/a_dialog',400,300);

    當js需要向另一個窗口做某個os行為時(如隱藏另一個窗口),通過調用窗體的句柄實例的方法實現:

    new_window.hide();

    os -> js

    js可以通過bind機制,關注操作系統發生的時間(如窗口大小改變):

    current_window.bind('resize',function(event){
       
    if(event.width <300){
            $
    ('#sidebar').hide();
       
    }
    });

    js -> app

    js可以通過類AJAX調用,從app獲取數據。

    ONERING.getJSON('/userdata.json',function(data){
       
    ...
    });

    app -> js

    app希望向窗體內的js主動推送消息時,可以采用pub/sub機制。

    首先js通知框架自己關注的事件:

    current_window.subscribe("a_file_scanned",function(fileinfo){
     
    ...
    });

    然后當app希望發送消息時,調用onering框架提供的publish方法:

    for fileinfo in scan_files():
        onering
    .publish("a_file_scanned", fileinfo);

    其中的fileinfo為可以轉化為JSON的python對象(即 json.dumps(fileinfo) 不會拋出異常)。

     

    參考:https://code.google.com/p/onering-desktop/wiki/OneRing

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全