基于Android框架的轉(zhuǎn)播車時鐘系統(tǒng)設(shè)計與應(yīng)用

摘要:本文從蘇州臺4K轉(zhuǎn)播車系統(tǒng)項目實際應(yīng)用出發(fā),通過采購帶Android系統(tǒng)的19寸長條屏顯示器,基于Android系統(tǒng)框架及SDK定向開發(fā),實現(xiàn)了多臺19寸長條屏顯示器集中控制管理、NTP授時、倒計時設(shè)、多種顯示方案實時切換的功能,目前該時鐘系統(tǒng)已經(jīng)在蘇州臺4K轉(zhuǎn)播車上順利投入使用,通過IP化的管理和授時方式,提高了時間顯示精度,滿足了多樣化的4K節(jié)目制作需求。

關(guān)鍵字:Android;NTP;倒計時控制;19寸長條屏顯示器;Socket服務(wù)。

一、 概述

????在傳統(tǒng)轉(zhuǎn)播車和演播室時鐘授時及顯示使用方案上,目前國內(nèi)主要用的是朗威和青島的時鐘顯示產(chǎn)品,主要原理是通過GPS授時,將接收下來的時間轉(zhuǎn)換成LTC時間碼,再通過分配器發(fā)送給各個時鐘顯示單元及倒計時控制器,時鐘顯示主要通過LED數(shù)碼管顯示。

????傳統(tǒng)時鐘授時及顯示方案,需要增加一堆硬件投入,使用時間長以后,會出現(xiàn)各類硬件損壞或失靈情況,屆時只能重新購買。

????在進入4K IP制作以后,轉(zhuǎn)播車系統(tǒng)內(nèi)主要使用的是PTP+BB的同步方案,同時同步機自帶NTP服務(wù),可以通過網(wǎng)絡(luò)獲得更精確的時間。因此,為了降低硬件維護成本及難度、獲取更精確的時鐘,我臺決定通過自主開始,實現(xiàn)通過NTP授時的時鐘顯示方案。

二、硬件方案選擇及系統(tǒng)架構(gòu)

????2.1、19寸長條屏顯示器介紹

????19寸長條顯示器通過采購第三方的現(xiàn)有解決方案,顯示器如下圖所示,采用窄邊框設(shè)計,分辨率1920*360,最高亮度為500cd/m2,對比度為600/1,帶1個RJ45的網(wǎng)口,1根外部WIFI天線,1路紅外輸入,不帶VGA或HDMI輸入,顯示器內(nèi)部集成了定制的Android 6.0系統(tǒng),可以通過外接鍵鼠或者紅外遙控器,對顯示界面進行操作。

????值得一提的是,19寸長條屏顯示器的Android系統(tǒng),采用的是手機和平板端的Android進行的定制,修改了分辨率和布局顯示,因此在相應(yīng)Android程序的開始時,需選擇手機或者平板端的開發(fā)框架。


圖2.1 19寸長條顯示器

????2.2、時鐘授時系統(tǒng)框架

????轉(zhuǎn)播車內(nèi)時鐘授時及顯示的框架如下圖所示,主同步機通過GPS授時,生成PTP、BB、LTC、WCLK、NTP等同步信號,4K轉(zhuǎn)播車內(nèi)的備同步機、交換機、IP設(shè)備通過PTP來鎖同步;同時主同步機作為NTP服務(wù)器,19寸長條時鐘顯示器作為NTP客戶端,共同接入控制交換機;每臺時鐘顯示器對外開放接口,倒計時控制軟件可通過這些接口,去單獨設(shè)置每臺時鐘顯示器的倒計時、欄目名、初始化顯示界面等配置信息。

????相比于傳統(tǒng)的轉(zhuǎn)播車時鐘授時及顯示系統(tǒng),新的時鐘顯示系統(tǒng),去除了時鐘主機、時碼分配、倒計時控制硬件等硬件,每臺時鐘顯示器可進行分布式管控,在操作和顯示上更具靈活性,同時通過NTP服務(wù)從同步機上獲取時鐘信息,精度更高、更穩(wěn)定。


圖2.2 轉(zhuǎn)播車時鐘系統(tǒng)框架圖

三、Android端開發(fā)設(shè)計方案

????Android端使用Android Studio進行開發(fā),Android Studio是用于開發(fā)Android應(yīng)用的官方集成開發(fā)環(huán)境,以IntelliJ IDEA為基礎(chǔ)構(gòu)建而成;得益于官方的支持,Android Studio除了提供強大的代碼編譯器和開發(fā)著工具,還提供了更多提高Android應(yīng)用構(gòu)建效率的功能,如快速且功能豐富的模擬器、統(tǒng)一的開發(fā)環(huán)境、基于Gradle的靈活構(gòu)建系統(tǒng)、大量的測試工具和框架等,開發(fā)者不需要從頭開始搭建,就可以快速的構(gòu)建自己的Android應(yīng)用程序。

????3.1、Android端時鐘顯示程序框架

? ??程序框架圖如下圖所示:

1. Android應(yīng)用程序在獲取各類權(quán)限和SDK以后,進入MainActivity主進程;

2. MainActivity下進入初始化事件onCreate,讀取時鐘顯示器本地存儲中的”countdownTime.json”和”app.config”,兩個文件都為自定義,其中第一個表示倒計時及NTP服務(wù)配置的文件,內(nèi)部存有欄目名、開始時間、結(jié)束時間、NTP服務(wù)器地址等信息,第二個表示時鐘程序初始化后的界面顯示和Socket服務(wù)地址;

3. 打開SocketService端口監(jiān)聽服務(wù),時鐘顯示器作為服務(wù)端,PC倒計時控制程序作為客戶端,當兩邊建立連接以后,倒計時控制器發(fā)送”countdownTime.json”配置文件給時鐘顯示器,時鐘顯示器對比本地和接收到的”countdownTime.json”配置文件,當文件內(nèi)容不一樣時,覆蓋掉本地的配置文件,并啟用新的倒計時配置;

4. 初始化NTP服務(wù),更新NTP服務(wù)器的IP地址,并從NTP服務(wù)端獲取時間;

5. 新建一個定時器的線程,每隔200ms去獲取以下本地的”countdownTime.json”配置文件,并更新時鐘顯示界面;

6. 時鐘顯示器支持外部紅外遙控,當按下外部紅外遙控器按鈕以后,觸發(fā)程序中“onKeyDown“事件,程序根據(jù)按下去按鈕的類型,如”前進“、”后退“,再比對現(xiàn)有的顯示界面,來切換不同的時鐘顯示界面,當切換到新的顯示界面后,將新界面中的”startPoint“保存到本地”app.config“文件中,這樣下次重啟時鐘顯示程序時,會根據(jù)”startPonit”自動進入上次保存的顯示界面。


圖3.1 Android端時鐘顯示程序框架圖

????3.2、Android端的環(huán)境搭建

? ??????3.2.1、build.gradle文件的構(gòu)建

????1. 時鐘顯示器的Android版本為6.0版本,Android版本自上而下兼容,考慮今后的兼容性和擴展性,此次開發(fā)的此次開發(fā)的Android SDK,選用了Android 10.0(Q)的版本,API等級為29,在程序構(gòu)建配置項“build.gradle”中配置如下。


圖3.2 build.gradle中內(nèi)部SDK的配置

????2. 在bulid.gradle中添加本地和第三方庫,具體如下圖所示,其中主要用到的庫有:

???\bullet ?'com.google.code.gson:gson:2.8.6'為google提供的json讀寫庫

???\bullet ?'org.greenrobot:eventbus:3.0.0'為greenrobot的多線程處理庫;

????\bullet "io.reactivex.rxjava2:rxandroid:2.0.2"為線程之間通信需要的庫

? ?\bullet ?project(path: ':library')包含了本地工程文件中,library下面的所有庫,其中主要用到NTP服務(wù)的是第三方庫“TrueTime.java“。

? ?

圖3.3 build.gradle中添加依賴項

3.1.2、AndroidManifest文件的構(gòu)建

????在AndroidManifest.xml里面,對應(yīng)用程序所要用到的權(quán)限、組件、服務(wù)信息做一些規(guī)范,如其中主要用到的規(guī)范有:

1.uses-permission”下加入允許內(nèi)部存儲的讀寫、開機自動啟動程序的權(quán)限;

圖3.4 AndroidManinfest中uses-permission設(shè)置

2.讀寫權(quán)限除了在AndroidManifest里面進行全局設(shè)置以外,還需要在初始化啟動Activity進程時,打開頁面對應(yīng)存儲的讀寫權(quán)限(新版本Android系統(tǒng)出于對系統(tǒng)文件的保護考慮),具體代碼如下;


圖3.5 Activity Oncreate中uses-permission設(shè)置

3. 在“application-receiver“下打開接收開機自動啟動的廣播類” .BootBroadcastReceiver“;

圖3.6 打開自動接收開機啟動的廣播

4.在“application-service“下打開通信端口的服務(wù)類”.SocketService“;

圖3.7 打開通信端口類的服務(wù)

5. 在“application-activity“下,規(guī)定程數(shù)啟動時啟動的Activitey頁面,已經(jīng)頁面的方向,默認我們啟動程序時是進入”MainActivity“并橫屏顯示。

????3.2、NTP授時設(shè)計

????獲取NTP時間的SDK已經(jīng)導(dǎo)入到項目的“l(fā)ibrary“庫中,調(diào)用SDK的接口通過”TrueTime“接口去實現(xiàn),NTP授時的部分代碼如下:

1. 通過異步的方式初始化NTP時間,包括通過”.build”建立TrueTime對象,”withNtpHost(ntpHost)”設(shè)置NTP服務(wù)端IP地址,“.withConnectionTimeout(3_1428)“設(shè)置連接服務(wù)的事件,”initialize()“初始化NTP服務(wù)的連接,并同時鐘顯示器步本地時鐘;

圖3.8 通過initTrueTime初始化NTP服務(wù)

2.通過Timer類定時器,每隔200ms去獲取NTP時間以及倒計時并更新顯示頁面,具體程序如下圖,其中“getCountdownData“為獲取本地倒計時配置及NTP服務(wù)器地址,”updateTime(dataList)“是將獲取到的倒計時信息,更新并顯示給程序頁面。

圖3.9 NTP及倒計時更新

????3.3、Socket服務(wù)

????Scoket服務(wù)是通過Android線程啟動的TCP端口連接服務(wù),主要用于連接Android時鐘顯示器和倒計時控制軟件,SocketService線程啟動在Android主程序中,通過Intent方法實現(xiàn),傳遞參數(shù)為IP地址和端口號,默認TCP端口號“5000“,如下圖;

圖3.10 SocketService線程啟動方式

????SocketService繼承于Service服務(wù)類,然后通過重寫“onStartCommand“、”run“、”onDestroy“三個方法:

? ?\bullet ?“onStartCommand“用于獲取主線程傳遞的參數(shù)、讀取本地配置文件以及初始化TCP接口三個功能,其中TCP接口的TCP接口初始化為服務(wù)端,當每次有客戶端連接請求時,就會新建一個線程,單獨處理客戶端的連接及通信請求;

圖3.11 onStartCommand重寫方法

? ?\bullet ?“run”用于循環(huán)接收倒計時控制客戶端發(fā)來的數(shù)據(jù),并將這些數(shù)據(jù)保存到本地“countdownTime.json”配置文件中;

圖3.12 run重寫方法

? ??\bullet “onDestroy”用于在SocketService服務(wù)斷開以后,釋放之前對應(yīng)的socket連接資源。

????3.4、開機自動啟動

????Android端時鐘顯示器的程序,要求每次開機自動啟動,并且顯示上一次關(guān)機的畫面。在Android系統(tǒng)啟動時,會發(fā)送一個字符串系統(tǒng)廣播,廣播內(nèi)容為“action.BOOT_COMPLETED”,所有只要在程序的“BroadcastReceiver”中接收到該消息,并創(chuàng)建啟用相應(yīng)的Activity,就能實現(xiàn)Android程序的開機自啟動。

實現(xiàn)程序開機自啟動的具體方法如下:

1.新建一個BootBroadcasReceiver的類,繼承于BroadcastReceiver,重寫onReceive方法,實現(xiàn)啟動程序中MainActivity主進程,代碼如下圖;

圖3.13 BootBroadcasReceiver類實現(xiàn)開機自啟

2.在AndroidManifest中打開程序開機自啟的權(quán)限,另外指定“BootBroadcasReceiver”接收廣播“action.BOOT_COMPLETED”后自動觸發(fā)執(zhí)行內(nèi)部OnReceive方法。

圖3.14 AndroidManifest中添加BootBroadcasReceiver

????3.5、顯示界面設(shè)計及切換

1. 時鐘顯示方案是通過在一個MainActivity進程中,顯示四個布局方案,分別為:

\bullet “activity_main”主顯示方案,頁面進入錨點startPoint為0,該頁面主要包含欄目名、日期、正計時時間、倒計時時間的顯示;

\bullet “activity_countdown”倒計時顯示方案,頁面進入錨點startPoint為1,該頁面主要包含倒計時時鐘顯示;

\bullet “activity_countup”倒計時顯示方案,頁面進入錨點startPoint為2,該頁面主要包含正計時時鐘顯示;

\bullet “activity_details”倒計時顯示方案,頁面進入錨點startPoint為3,該頁面主要包含一些提醒信息說明,各個時鐘顯示方案如下如所示。

圖3.15 時鐘顯示布局方案

2.為了模仿LED字體顯示的效果,時鐘顯示程序從網(wǎng)上下載了第三方LED字體庫文件“digital-7.ttf”,放入工程文件中“src/main/assets”目錄下,之后通過重寫”TextView”文本框方法,重新生成一個“DigitalTextView”的帶LED字體顯示效果的文本框,“DigitalTextView”文本框在頁面設(shè)計使用時,跟”TextView”文本框一致,重寫方法如下。

圖3.16 DigitalTextView重寫方法

3.時鐘顯示界面切換邏輯:

\bullet 在程序初始化的時候,會讀取本地存儲“app.confiig”中的startPoint值,該值為進入對應(yīng)的顯示方案的錨點;

\bullet 當使用外置紅外遙控器對程序進行操作時,如“向前翻頁”,則startPoint在原來值的基礎(chǔ)上加1,如果startPoint已經(jīng)是最大值3,則重新回到0開始,反之如“向后翻頁”,則strartPoint在原來的基礎(chǔ)上減1,不斷循環(huán);

\bullet 當startPoint錨點修改以后,會記錄到本地存儲“app.config”中,程序每次刷新時間,都會重新讀取“app.config”中startPoint的值,并通過對應(yīng)的值顯示顯示界面;

\bullet 程序每次重啟不會初始化內(nèi)部存儲中的配置文件,因此通過次方法,可以保證時鐘顯示程序每次開啟,都會顯示上一次開機時的顯示畫面。

4.“countdownTime.json”文件內(nèi)容如下圖所示,采用json文件格式。

\bullet 節(jié)點“data”表示一個欄目倒計時設(shè)計數(shù)組,可放入多個倒計時欄目,其中“pgmTime”為欄目開始時間,”Length”為欄目結(jié)束時間,“Column”為欄目名,時鐘顯示程序中,會根據(jù)NTP服務(wù)器讀取到的時間,跟“data”節(jié)點下的倒計時欄目進行比對,選擇最接近開播開始或者結(jié)束的欄目,做對應(yīng)倒計時及欄目名的顯示。

圖3.16 countdownTime.json格式

\bullet 節(jié)點“ntpHost”表示NTP服務(wù)器的地址,當設(shè)定好該地址后,會跟時鐘顯示程序中現(xiàn)有的NTP服務(wù)器地址進行比對,如果NTP服務(wù)器地址不一致,則會把新地址傳送給“initTrueTime”類,并重新初始化NTP服務(wù)。

四、時鐘集中控制端的設(shè)計方案

????4.1、Windows環(huán)境及界面設(shè)計

????時鐘顯示系統(tǒng)的倒計時控制,通過遠端Windows窗體應(yīng)用程序,去發(fā)現(xiàn)并連接局域網(wǎng)內(nèi)的每臺時鐘顯示器,然后統(tǒng)一發(fā)送倒計時控制信息。

????Windows窗體應(yīng)用程序基于.NET Framework 4.6框架進行開發(fā),程序命名為“時鐘倒計時設(shè)置器”,程序界面如下圖所示,左側(cè)“掃描”按鈕按下后,下方會顯示局域網(wǎng)中所有的時鐘顯示器,并自動建立連接;“NTP服務(wù)設(shè)置”下方,可設(shè)置NTP服務(wù)器的地址;“倒計時設(shè)置”下方,可設(shè)置欄目開始時間,結(jié)束時間及欄目名等信息;NTP的服務(wù)器地址、倒計時設(shè)置下的欄目信息,都可以通過“保存配置”按鈕保存到本地,供下次打開程序讀取,也可以直接發(fā)送給時鐘顯示器列表內(nèi)的所有時鐘顯示器。

圖4.1 時鐘倒計時設(shè)置器界面

????4.2、局域網(wǎng)內(nèi)時鐘顯示器的發(fā)現(xiàn)和接入

????當按下“時鐘倒計時設(shè)置器”程序中的“掃描按鈕時,觸發(fā)“”scanBtn_Click”按鈕控制事件,如下圖所示:

1.首先程序會清空所有跟在程序內(nèi)的TCP端口連接;

2.獲取“App.config“文件中的配置信息,如掃描的開始和截止地址、掃描的端口號,對這些地址做差值,從而得到總的需要掃描的地址數(shù)量;

3.遍歷掃描這些地址和端口號,并嘗試進行連接,當和時鐘顯示器端建立連接成功后,返回時鐘顯示器端的IP地址和socket對象;

4.每個時鐘顯示器端的連接和通信,都開通一個單獨的線程,并同步實時更新顯示到“時鐘倒計時設(shè)置器“界面中。

圖4.2 掃描按鈕控制事件

????4.3、欄目名、倒計時信息的讀取、保存和發(fā)送

????程序初始化時,會從本地配置文件中讀取之前保存的配置信息并顯示,本地配置文件名和格式與Android端時鐘顯示器上的一樣,都為“countdownTime.json“;

????在程序里面,可以對“countdownTime.json“讀取出的倒計時信息和NTP服務(wù)器地址進行修改,修改完成后,點保存配置,觸發(fā)”saveBtn_Click“按鈕事件,該事件主要用于覆蓋之前讀取的“countdownTime.json“文件;

????當在程序中點擊“發(fā)送配置”按鈕,觸發(fā)“sendBtn_Click”按鈕事件,將目前程序界面上的內(nèi)容,以json文件數(shù)據(jù)流的格式,發(fā)送給“時鐘顯示”列表里的所有時鐘顯示器,時鐘顯示器端程序收到數(shù)據(jù)流以后,更新顯示并自動覆蓋掉原先的時鐘顯示器端的”countdownTime.json”配置文件,發(fā)送倒計時配置信息的主要程序如下圖所示。

圖4.3 倒計時設(shè)置信息的發(fā)送

五、總結(jié)

????轉(zhuǎn)播車時鐘系統(tǒng)的設(shè)計與應(yīng)用,滿足了我臺現(xiàn)有4K IP轉(zhuǎn)播車上時鐘授時和顯示的應(yīng)用,不同的操作工位,可以顯示不同的時鐘監(jiān)看方案,同時基于IP化的統(tǒng)一配置管理,使得在時鐘顯示器的配置上更加簡單方便。

????基于Android框架而設(shè)計的時鐘系統(tǒng),在未來復(fù)雜的4K制作環(huán)節(jié)中,更具有靈活性和多樣性,我們隨時可以根據(jù)不同的需求來修改程序,增加新的功能,如把天氣信息、溫度濕度信息、早中晚的界面顯示顏色、時鐘倒計時蜂鳴器報警等,這些功能也將在今后的實際應(yīng)用中,慢慢完善并加入。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容