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號業務講解
- 將使用者
賬號/密碼
傳送到伺服器,驗證是否有效。- 走
61號
業務獲取EncryToken
,此時會進行EPG
的負載均衡。EncryToken
是用於後續的加密認證。
3、62/63號業務
- 帶上
驗證加密串
去獲取使用者令牌
驗證加密串
:對EncryToken、時間戳、隨機字串等
按照一定組合生成了一個字串,然後通過AES加密演算法
進行加密,對加密後的結果用Base64演算法
轉換為字串。- 其他會返回
EPG伺服器新地址、特定請求的實際地址(搜尋伺服器等)、JSESSIONID
。
擴充套件知識點
負載均衡
4、負載均衡是什麼?
負載均衡
是一種網路技術
- 將多個伺服器以等價地位的方式組成一個伺服器集合,將
伺服器的負載
分攤到所有伺服器上面。
5、EPG負載均衡
- 是指
使用者
登入EPG1
,EPG1
會將使用者資訊交給一個總控的Manager
,Manager
通過判斷進行負載均衡,然後將合適的伺服器如EPG3
的地址交給EPG1
,EPG1
將地址重定向到EPG3
.
Token和Session
6、EncryToken是什麼?
- 加密令牌 :業務管理平臺為使用者分配的臨時身份證明,只用於認證加密。
- 在62/63號業務,利用該Token去獲取UserToken
7、UserToken
- 使用者令牌:用於表明使用者的身份。
專案中多用於訂購產品包等需要驗證使用者身份的情況
。
8、Token和Session
- Session的狀態是儲存在伺服器端,客戶端只有session id;
- 而Token的狀態是儲存在客戶端
9、Token和Session的區別
Session
基於Cookie
實現,應用重啟後丟失
。Token
是為了防止Cookie
被清除。- 廣義來說一切維護使用者狀態的技術都是session,
- 一切動態生成的服務端有能力鑑別真假而本身無涵義的字串都是token
10、sessionID
Session
用於解決Http協議中不能維持狀態的問題
,只儲存於伺服器,不進行網路傳輸,相對於Cookie更安全些
- 第一次訪問伺服器會在伺服器端生成一個session,有一個sessionid和它對應。
- tomcat生成的sessionid叫做jsessionid。
轉發和重定向
11、轉發和重定向的區別
- 轉發是伺服器行為,重定向是客戶端行為
- 請求次數:
- 轉發:客戶端只進行了一次請求
- 重定向:客戶端進行了兩次請求
- 內部機制不同:
- 轉發: 服務端必須是在同一個web容器下的url,不能再轉向到其他的web路徑上。中間傳遞的是自己的容器內的request。
- 重定向: 新的location可以重定向到任何URL上,實質是客戶端發起了兩次請求,也就沒有request傳遞的概念。
12、轉發的流程和原理
- 客戶端傳送http請求
- web伺服器接受此請求
- 服務端在內部完成請求處理和轉發動作
- 將目標資源傳送給客戶端。
- 對於客戶端來說依然是第一次訪問的路徑,也就是客戶端感覺不到服務端進行了轉發。
- 轉發行為就是客戶端只進行了一次訪問請求。
13、重定向的流程
- 客戶端傳送http請求
- 服務端接受請求後傳送
302狀態碼
響應及對應新的location
給客戶端- 客戶端發現
302狀態碼
後會在發起一個新的http請求,請求的url是新的location
地址- 新的location可以重定向到任何URL上
- 客戶端可以觀察到地址的變換。
AES和Base64
14、AES(高階加密標準)
是
對稱金鑰加密
中最流行的演算法之一。
15、Base64的作用?
Base64編碼的作用:由於某些系統中只能使用ASCII字元。Base64就是用來將非ASCII字元的資料轉換成ASCII字元的一種方法。
專案中實戰
16、LoginFragment登陸頁面
- 會先初始化Preference(儲存使用者名稱、是否記住賬號)、初始化等待登陸的Dialog
- 初始化
LoginImp
。- 點選“登陸”按鈕後,會檢查網路,然後通過
LoginImpl.requestLogin()
發起登陸請求- 請求完成後,會通過EventBus呼叫到自身的
onEventMainThread()
方法- 登入失敗會彈出提示
- 登陸成功後: 會有登陸成功提示框,確認後退出登陸頁面。
17、LoginImp封裝登陸流程
- requestLogin(): 通過SDKLoginMgr.startLogin()發起登陸請求。遊客賬號和密碼是配置在配置頁面中。
- SDK發起登陸請求後,會回撥:onLoginReturn()介面,判斷返回碼
- 登陸成功: 會去設定使用者語言、使用者媒體服務型別,並且儲存使用者名稱、密碼、EPG的地址、SessiondId和FrameID(模板ID),模板涉及到服務端的jsp介面。
- 登入失敗: 將結果打包好後,傳送EventBus到登陸頁面。
- 此外登陸成功後,還會開啟後臺的服務,包括推送服務、本地直播提醒和影視預約的服務、以及定時更新使用者Token的服務。 然後傳送成功的EventBus到登陸頁面。
- 並且有一個回撥onHeartbeatReturn()介面進行心跳保活
18、SDKLoginMgr
- 封裝登陸業務的SDK
- 封裝了60/61號業務,將使用者
賬號/密碼
傳送到伺服器進行驗證,然後走61號業務獲取EncryToken
,並且會進行EPG
的負載均衡。- 封裝了62/63號業務,利用
EncryToken
加密令牌,去獲取UserToken(使用者令牌)
,此外該業務會返回EPG伺服器新地址、特定請求的實際地址(搜尋伺服器等)、JSESSIONID
。
簡訊驗證碼登陸
19、簡訊驗證碼登陸的實現
- 利用簡訊介面傳送驗證碼到使用者手機
- 走簡訊登陸介面去進行使用者的登陸。
- 簡訊登陸介面分為兩個情況:
- 一種是直接內部會走服務端的60/61-62/63業務,獲取到使用者Token、Epg地址、特殊伺服器地址、SessionbID等關鍵資料
- 另一種業務系統較老,從簡訊登陸介面獲取到該手機號對應的
密碼
,然後額外使用登陸SDK
封裝的功能去進行登入。
網路請求
1、專案網路請求的方法?
- 對
OKHttp
進行封裝。- 採用
執行緒池
-CachedThreadPool- 接收到返回資料後
切換到UI
執行緒,回撥給上層。
Cookies
用於存放JSESSIONID
2、OkHttp3提供了Cookie的自動管理
- 客戶端請求登陸後,服務端會返回帶有唯一登陸認證資訊Session的Response(存放在Cookie中),如何實現在下次請求時自動放入呢?
OkHttp3
提供了自動管理
- 也可以手動新增。
播放
播放器初始化
1. 查詢VOD/Channel/片花/時移/TVOD 播放等的URL ;
1. 播放器初始化
1. 播放器open
1. 播放器start
1. 播放器pause
1. 播放器resume
1. 播放器stop
1. 播放器seek跳轉到具體位置
- continuePlay
- playerStart()
- openPlayerToPlay
- 是否需要支援加密播放的URL
- 進行重定向
IBasePlayer.open url =
AbstractPlayer.class openInternal
升級策略
產品包訂購
我的訂購
首頁海報
專題
預約(直播、影視、連續劇)
1、直播預約
- 使用者預約該節目單,等到達節目單時間,前5分鐘的時候,服務端就會推送訊息到客戶端
- 客戶端彈窗提示。選擇進入“訊息中心”或者“直接播放”
- 直接播放就是會進入TV詳情頁面,因為暫時節目單還沒到,因此會播放當前正在播放的內容。等到了時間,就會繼續播放。
1、直播進行預約
- 呼叫預約介面,將直播的節目單的節目code,內容code, 還有電信code。媒體型別等十幾個資料。
- 預約成功:return 0
- 預約失敗:return 其他code和erro msg
訊息推送
1、後臺Service利用Socket和服務端進行長連線。
2、持續和服務端傳送心跳包
3、Socket斷線重連
- 定時傳送心跳包。
socket.connect
會有異常SocketTimeOutException
表示連線超時,因此進行重連。
4、如何和服務端通訊
- 傳送資料:獲取OutPutStream向裡面
write
資料- 讀取資料:獲取InpuSTream,從中read資料。
5、獲取到推送的訊息
- 服務端會通過該長連線向客戶端傳送訊息
- 客戶端接收,按照事先規定的格式進行解析。
DLNA
投屏
回甩
效能優化
佈局優化
移除了四層過度繪製:
1. 給Activity設定了主題,並將背景設定為null。
1. Activity中主動呼叫getWindow().setBackgroundDrawable(null);消除預設Window背景
1. 原來專案中存在一個老舊的側滑選單。該選單已經廢棄卻依然佔據了一次過度繪製。因此將該側滑選單進行了移除。
1. 將MainFragment的背景設定為透明色。
層級優化
將最多的17層佈局,優化到了7層。
1. 用約束佈局對所有頁面進行優化。
1. 一些動態欄目,在一些局點上用不到,因此使用ViewStub進行優化。
1. 用include對通用UI進行了優化
1. 用merge標籤配合include減少了佈局層級。
程式碼優化
- 移除了所有早前遺留內容裡面的Hashtable
- 用SparseArray在一定情況下替換了HashMap
記憶體優化
- 使用執行緒池進行優化,減少系統開銷。
- Bitmap優化
- listview等列表優化,在滑動時禁止載入,避免了快速滑動的效能問題。
功耗優化
- 將執行後後臺任務的Service換為IntentService
- Toast在後臺時,不會在生效。
網路優化
- 三級快取
記憶體洩露優化
- 一個第三方開源庫,控制元件儲存了Activity Context,並且在內部的靜態資料集合上儲存了控制元件,但是在Activity退出的時候,沒有將這個靜態的內部集合中的控制元件移除,最終導致了記憶體洩露10MB。