1. 程式人生 > >Android專案-IPTV經驗總結

Android專案-IPTV經驗總結

個人專案總結的內容,對你們沒有任何幫助。千萬不要看。

IPTV總結

版本: 20180917-2(1700)

iptv

1、IPTV是什麼?

IPTV即互動式網路電視

2、EPG伺服器是什麼?

IPTV的一個子系統,用於向用戶提供節目等各方面服務。

登陸

1、登陸流程

graph TD;
    A(登陸頁面_60號業務_密碼驗證);
    B(獲取EncryToken_61號業務_Getencrytoken.jsp_EPP負載均衡);
    C(獲取UserToken_63號業務_Moblieusertoken.jsp);
    A
-->B; B-->C;

2、60/61號業務講解

  1. 將使用者賬號/密碼傳送到伺服器,驗證是否有效。
  2. 61號業務獲取EncryToken,此時會進行EPG的負載均衡。
  3. EncryToken是用於後續的加密認證。

3、62/63號業務

  1. 帶上驗證加密串去獲取使用者令牌
  2. 驗證加密串:對EncryToken、時間戳、隨機字串等按照一定組合生成了一個字串,然後通過AES加密演算法進行加密,對加密後的結果用Base64演算法轉換為字串。
  3. 其他會返回EPG伺服器新地址、特定請求的實際地址(搜尋伺服器等)、JSESSIONID

擴充套件知識點

負載均衡

4、負載均衡是什麼?

  1. 負載均衡是一種網路技術
  2. 將多個伺服器以等價地位的方式組成一個伺服器集合,將伺服器的負載分攤到所有伺服器上面。

5、EPG負載均衡

  1. 是指使用者登入EPG1,EPG1會將使用者資訊交給一個總控的ManagerManager通過判斷進行負載均衡,然後將合適的伺服器如EPG3的地址交給EPG1,EPG1將地址重定向到EPG3.

Token和Session

6、EncryToken是什麼?

  1. 加密令牌 :業務管理平臺為使用者分配的臨時身份證明,只用於認證加密。
  2. 在62/63號業務,利用該Token去獲取UserToken

7、UserToken

  1. 使用者令牌:用於表明使用者的身份。
  2. 專案中多用於訂購產品包等需要驗證使用者身份的情況

8、Token和Session

  1. Session的狀態是儲存在伺服器端,客戶端只有session id;
  2. 而Token的狀態是儲存在客戶端

9、Token和Session的區別

  1. Session基於Cookie實現,應用重啟後丟失
  2. Token是為了防止Cookie被清除。
  3. 廣義來說一切維護使用者狀態的技術都是session,
  4. 一切動態生成的服務端有能力鑑別真假而本身無涵義的字串都是token

10、sessionID

  1. Session用於解決Http協議中不能維持狀態的問題只儲存於伺服器,不進行網路傳輸,相對於Cookie更安全些
  2. 第一次訪問伺服器會在伺服器端生成一個session,有一個sessionid和它對應。
  3. tomcat生成的sessionid叫做jsessionid。

轉發和重定向

11、轉發和重定向的區別

  1. 轉發是伺服器行為,重定向是客戶端行為
  2. 請求次數:
    1. 轉發:客戶端只進行了一次請求
    2. 重定向:客戶端進行了兩次請求
  3. 內部機制不同:
    1. 轉發: 服務端必須是在同一個web容器下的url,不能再轉向到其他的web路徑上。中間傳遞的是自己的容器內的request。
    2. 重定向: 新的location可以重定向到任何URL上,實質是客戶端發起了兩次請求,也就沒有request傳遞的概念。

12、轉發的流程和原理

  1. 客戶端傳送http請求
  2. web伺服器接受此請求
  3. 服務端在內部完成請求處理和轉發動作
  4. 將目標資源傳送給客戶端。
  5. 對於客戶端來說依然是第一次訪問的路徑,也就是客戶端感覺不到服務端進行了轉發。
  6. 轉發行為就是客戶端只進行了一次訪問請求。

13、重定向的流程

  1. 客戶端傳送http請求
  2. 服務端接受請求後傳送302狀態碼響應及對應新的location給客戶端
  3. 客戶端發現302狀態碼後會在發起一個新的http請求,請求的url是新的location地址
  4. 新的location可以重定向到任何URL上
  5. 客戶端可以觀察到地址的變換。

AES和Base64

14、AES(高階加密標準)

對稱金鑰加密中最流行的演算法之一。

15、Base64的作用?

Base64編碼的作用:由於某些系統中只能使用ASCII字元。Base64就是用來將非ASCII字元的資料轉換成ASCII字元的一種方法。

專案中實戰

16、LoginFragment登陸頁面

  1. 會先初始化Preference(儲存使用者名稱、是否記住賬號)、初始化等待登陸的Dialog
  2. 初始化LoginImp
  3. 點選“登陸”按鈕後,會檢查網路,然後通過LoginImpl.requestLogin()發起登陸請求
  4. 請求完成後,會通過EventBus呼叫到自身的onEventMainThread()方法
  5. 登入失敗會彈出提示
  6. 登陸成功後: 會有登陸成功提示框,確認後退出登陸頁面。

17、LoginImp封裝登陸流程

  1. requestLogin(): 通過SDKLoginMgr.startLogin()發起登陸請求。遊客賬號和密碼是配置在配置頁面中。
  2. SDK發起登陸請求後,會回撥:onLoginReturn()介面,判斷返回碼
  3. 登陸成功: 會去設定使用者語言、使用者媒體服務型別,並且儲存使用者名稱、密碼、EPG的地址、SessiondId和FrameID(模板ID),模板涉及到服務端的jsp介面。
  4. 登入失敗: 將結果打包好後,傳送EventBus到登陸頁面。
  5. 此外登陸成功後,還會開啟後臺的服務,包括推送服務、本地直播提醒和影視預約的服務、以及定時更新使用者Token的服務。 然後傳送成功的EventBus到登陸頁面。
  6. 並且有一個回撥onHeartbeatReturn()介面進行心跳保活

18、SDKLoginMgr

  1. 封裝登陸業務的SDK
  2. 封裝了60/61號業務,將使用者賬號/密碼傳送到伺服器進行驗證,然後走61號業務獲取EncryToken,並且會進行EPG的負載均衡。
  3. 封裝了62/63號業務,利用EncryToken加密令牌,去獲取UserToken(使用者令牌),此外該業務會返回EPG伺服器新地址、特定請求的實際地址(搜尋伺服器等)、JSESSIONID

簡訊驗證碼登陸

19、簡訊驗證碼登陸的實現

  1. 利用簡訊介面傳送驗證碼到使用者手機
  2. 走簡訊登陸介面去進行使用者的登陸。
  3. 簡訊登陸介面分為兩個情況:
    1. 一種是直接內部會走服務端的60/61-62/63業務,獲取到使用者Token、Epg地址、特殊伺服器地址、SessionbID等關鍵資料
    2. 另一種業務系統較老,從簡訊登陸介面獲取到該手機號對應的密碼,然後額外使用登陸SDK封裝的功能去進行登入。

網路請求

1、專案網路請求的方法?

  1. OKHttp進行封裝。
  2. 採用執行緒池-CachedThreadPool
  3. 接收到返回資料後切換到UI執行緒,回撥給上層。
    • Cookies用於存放JSESSIONID

2、OkHttp3提供了Cookie的自動管理

  1. 客戶端請求登陸後,服務端會返回帶有唯一登陸認證資訊Session的Response(存放在Cookie中),如何實現在下次請求時自動放入呢?
  2. OkHttp3提供了自動管理
  3. 也可以手動新增。

播放

播放器初始化
1. 查詢VOD/Channel/片花/時移/TVOD 播放等的URL ;
1. 播放器初始化
1. 播放器open
1. 播放器start
1. 播放器pause
1. 播放器resume
1. 播放器stop
1. 播放器seek跳轉到具體位置

  1. continuePlay
  2. playerStart()
  3. openPlayerToPlay
    1. 是否需要支援加密播放的URL
    2. 進行重定向
  4. IBasePlayer.open url =

  5. AbstractPlayer.class openInternal

升級策略

產品包訂購

我的訂購

首頁海報

專題

預約(直播、影視、連續劇)

1、直播預約

  1. 使用者預約該節目單,等到達節目單時間,前5分鐘的時候,服務端就會推送訊息到客戶端
  2. 客戶端彈窗提示。選擇進入“訊息中心”或者“直接播放”
  3. 直接播放就是會進入TV詳情頁面,因為暫時節目單還沒到,因此會播放當前正在播放的內容。等到了時間,就會繼續播放。

1、直播進行預約

  1. 呼叫預約介面,將直播的節目單的節目code,內容code, 還有電信code。媒體型別等十幾個資料。
  2. 預約成功:return 0
  3. 預約失敗:return 其他code和erro msg

訊息推送

1、後臺Service利用Socket和服務端進行長連線。

2、持續和服務端傳送心跳包

3、Socket斷線重連

  1. 定時傳送心跳包。
  2. socket.connect會有異常SocketTimeOutException表示連線超時,因此進行重連。

4、如何和服務端通訊

  1. 傳送資料:獲取OutPutStream向裡面write資料
  2. 讀取資料:獲取InpuSTream,從中read資料。

5、獲取到推送的訊息

  1. 服務端會通過該長連線向客戶端傳送訊息
  2. 客戶端接收,按照事先規定的格式進行解析。

DLNA

投屏

回甩

效能優化

佈局優化

移除了四層過度繪製:
1. 給Activity設定了主題,並將背景設定為null。
1. Activity中主動呼叫getWindow().setBackgroundDrawable(null);消除預設Window背景
1. 原來專案中存在一個老舊的側滑選單。該選單已經廢棄卻依然佔據了一次過度繪製。因此將該側滑選單進行了移除。
1. 將MainFragment的背景設定為透明色。

層級優化

將最多的17層佈局,優化到了7層。
1. 用約束佈局對所有頁面進行優化。
1. 一些動態欄目,在一些局點上用不到,因此使用ViewStub進行優化。
1. 用include對通用UI進行了優化
1. 用merge標籤配合include減少了佈局層級。

程式碼優化

  1. 移除了所有早前遺留內容裡面的Hashtable
  2. 用SparseArray在一定情況下替換了HashMap

記憶體優化

  1. 使用執行緒池進行優化,減少系統開銷。
  2. Bitmap優化
  3. listview等列表優化,在滑動時禁止載入,避免了快速滑動的效能問題。

功耗優化

  1. 將執行後後臺任務的Service換為IntentService
  2. Toast在後臺時,不會在生效。

網路優化

  1. 三級快取

記憶體洩露優化

  1. 一個第三方開源庫,控制元件儲存了Activity Context,並且在內部的靜態資料集合上儲存了控制元件,但是在Activity退出的時候,沒有將這個靜態的內部集合中的控制元件移除,最終導致了記憶體洩露10MB。

版本相容適配

影視頁面

即將上線、直播看什麼

播放器相關

下載

換膚

資料快取

參考資料