大作業(yè) - 6 文檔

項目地址: Exotic-experiment

快速使用

  1. 以下所說的網(wǎng)址對應(yīng)的服務(wù)器在玉泉經(jīng)常性抽風部凑,如果連不上的話,可以嘗試著去西湖四處看看風景(來把梯子)檀训。

  2. 當前部署在exotic.lmin.me

socket端口可以通過訪問/api/status獲得。

  1. 樹莓派端需要進行身份驗證后才能收發(fā)信息

驗證方式為使用socket發(fā)送驗證包,需要兩個字段設(shè)備id及其驗證碼幅慌。

在client.py中為了簡便宋欺,可以使用命令行3轰豆、4號參數(shù)指定device_id以及auth_key,并輸入auth發(fā)送驗證包齿诞。

當前默認有一個設(shè)備id為fpga的設(shè)備存儲于數(shù)據(jù)庫中酸休,使用有管理員權(quán)限的賬號登錄/api/admin/query?device_id=fpga即可獲取。同時祷杈,使用管理員權(quán)限訪問/api/admin/add可以添加新的設(shè)備id斑司。

  1. 推流使用rtmp協(xié)議

推流命令與地址后續(xù)有詳細介紹。

如果要本地測試但汞,需要自己搭建RTMP服務(wù)器宿刮,具體方法參考大作業(yè) - 2 rtmp服務(wù)器配置。server.py只作為信息中轉(zhuǎn)站私蕾,目前沒有處理RTMP流的能力僵缺。

梯子轉(zhuǎn)發(fā)ffmpeg的流似乎會出很多問題,不推薦通過梯子推流踩叭。

消息格式

通信使用json格式磕潮,消息分為控制消息、狀態(tài)消息容贝,操作消息自脯,信息消息以及其他。

服務(wù)器接受控制消息并返回狀態(tài)消息斤富,同時在某些情況下會發(fā)出信息消息膏潮。

除去一些特殊情況,服務(wù)器默認廣播所有從樹莓派端發(fā)送來的消息满力,同時屏蔽所有非操作者發(fā)送來的消息焕参。操作者發(fā)送的消息將會被發(fā)往樹莓派端屋谭。廣播的范圍是當前連入設(shè)備界面的所有瀏覽器端。

控制消息

控制消息為含有type且為0的json對象龟糕,而另一個字段action表明所需要干的事情桐磁。

其中服務(wù)器有響應(yīng)的action字段,有如下幾種值:

  • acquire

    瀏覽器端發(fā)出讲岁,獲取所連接的莓派的操作權(quán)限

    操作成功后服務(wù)器會發(fā)出操作者變化的信息消息

  • release

    瀏覽器端發(fā)出我擂,釋放所連接的樹莓派的操作權(quán)限

    操作成功后服務(wù)器會發(fā)出操作者變化的信息消息

  • broadcast

    瀏覽器端發(fā)出,表示這條消息將會被廣播至所有瀏覽器端缓艳。

    服務(wù)器接受到這種消息的時候校摩,會將其轉(zhuǎn)變?yōu)樾畔⑾⒉⑦M行全瀏覽器廣播。消息格式參見信息消息的broadcast字段阶淘。

  • authorize

    樹莓派端發(fā)出衙吩,用于驗證連接的身份。

    必須含有兩個字段:

    • device_id溪窒,樹莓派的設(shè)備id
    • auth_key坤塞,與設(shè)備id對應(yīng)的識別碼

    服務(wù)器返回一個狀態(tài)消息,表示驗證成功或失敗澈蚌。

值得一提的是摹芙,不論是從樹莓派端還是瀏覽器端發(fā)送來的其余的所有type為0的json對象也都會被攔截,既不會被發(fā)送到樹莓派端宛瞄,也不會被廣播至其他的瀏覽器端浮禾。

狀態(tài)消息

狀態(tài)消息是type為1的消息,有字段status表示狀態(tài)份汗。

status字段有如下的值:

  • authorized

    服務(wù)器發(fā)出盈电,樹莓派端接收。表示樹莓派身份驗證成功杯活。此時匆帚,除了type,status字段轩猩,在json對象中還會有幾個字段:

    • index卷扮,當前樹莓派分配的索引號
    • filelink,樹莓派下載文件時所用的url
    • webport均践, 服務(wù)器所使用的web端口號
    • rtmp_host晤锹,rtmp服務(wù)器位置
    • rtmp_push_port,rtmp服務(wù)器的推流端口
    • stream_name彤委,推流的流名字
  • auth_fail

    服務(wù)器發(fā)出鞭铆,樹莓派端接收。表示樹莓派身份驗證失敗。

  • file_upload

    服務(wù)器端發(fā)出车遂,瀏覽器端樹莓派端接收封断,表明文件成功上傳。

    附屬字段file舶担,為一個關(guān)于文件信息的json對象坡疼。

    在這個對象中,有三個字段衣陶,valid表明文件是否可用柄瑰,name表示上傳的文件名,size表示上傳的文件大小

操作消息

操作消息是type為2的消息剪况,含有operation字段教沾。服務(wù)器不會主動發(fā)出這類消息。

信息消息

信息消息是type為3的消息译断,含有字段info授翻。

服務(wù)器會發(fā)出兩種信息消息,其info字段分別為:

  • user_changed

    服務(wù)器發(fā)出孙咪,瀏覽器端樹莓派端接收堪唐,表示當前樹莓派操作者變化。

    帶有字段user该贾,表示當前樹莓派的操作者羔杨,可為空(null),表示無人操作杨蛋。

  • fpga_disconnected

    服務(wù)器發(fā)出,瀏覽器端接收理澎,表示相關(guān)聯(lián)的樹莓派端斷開連接逞力。

  • broadcast

    服務(wù)器發(fā)出,瀏覽器端接收糠爬,表示一條來自瀏覽器端的廣播寇荧。

    該消息除了保留發(fā)送過來的所有信息外,服務(wù)器會添加兩個字段:

    • nickname执隧,表示發(fā)送人的昵稱
    • timestamp揩抡,表示服務(wù)器端接收的時間戳

樹莓派端demo使用

該demo程序接收5個命令行參數(shù):

  • argv[1],host镀琉,表示目標服務(wù)器的地址
  • argv[2]峦嗤,port,表明socket連接的端口
  • argv[3]屋摔,device_id烁设,表明設(shè)備ID
  • argv[4],auth_key钓试,表示設(shè)備識別碼
  • argv[5]装黑,separator副瀑,表示socket消息分隔符

1、2用于定位服務(wù)器位置恋谭,3糠睡、4用于身份驗證,5用于消息發(fā)送疚颊。

在樹莓派連入服務(wù)器之后铜幽,需要一次身份驗證命令將身份信息發(fā)往服務(wù)器端進行驗證。處于無身份的狀態(tài)在服務(wù)器鏈接過多的時候會被優(yōu)先斷開串稀。

在身份驗證成功后除抛,服務(wù)器會發(fā)送一個json對象,表示當前連入的相關(guān)信息母截,下方就是一個例子到忽。

{
    "status": 0, 
    "index": 0, 
    "rtmp_host": "localhost", 
    "rtmp_push_port": 6666, 
    "stream_name": "0", 
    "webport": 8080, 
    "filelink": "/live/0/file/download"
}
  • status表示此次的身份驗證成功
  • index表示當前樹莓派在服務(wù)器的索引值
  • rtmp_host, rtmp_push_port, stream_name 在下文服務(wù)器配置處詳細敘述,與rtmp推流有關(guān)
  • webport為web服務(wù)器的端口號清寇,用于下載文件
  • filelink為web文件下載的url

在連接上服務(wù)器并驗證身份之后喘漏,可以在命令行下輸入命令即可。部分格式的命令會被轉(zhuǎn)義华烟,大部分的命令會直接發(fā)送至服務(wù)器翩迈。

轉(zhuǎn)義命令格式如下:

  • auth

    發(fā)送身份驗證包至所連接的服務(wù)器

  • keypress keycode

    會發(fā)送一個按下keycode所代表按鍵的信息至服務(wù)器(鍵碼(KeyCode))

  • switchon id

    發(fā)送一個開關(guān)打開的消息

  • switchoff id

    發(fā)送一個開關(guān)關(guān)閉的消息

  • buttonpress id

    發(fā)送一個按鈕按下的消息

  • buttonrelease id

    發(fā)送一個按鈕彈起的消息

  • exit

    退出client.py

服務(wù)器使用

在使用之前,需要確保含有tornado的包盔夜「核牵可以使用pip命令安裝所有的依賴。

pip install -r requirement.txt

配置

配置調(diào)試

使用命令

python config.py

可以獲取到所有服務(wù)器的配置參數(shù)喂链,與直接運行服務(wù)器時的參數(shù)一致返十。可以使用該文件進行配置調(diào)整椭微。

可調(diào)整參數(shù)及其默認值如下:

options =  {
    "config": null, 

    "_user": "user", 
    "_identity": "identity", 
    "_password": "password", 
    "_nickname": "nickname", 

    "webport": 8080, 
    "filesize": 1048576, 
    "cookie_secret": "XmuwPAt8wHdnik4Xvc3GXmbXLifVmPZYhoc9Tx4x1iZ", 
    "database": "exotic.db", 
    "messageInterval": 2, 

    "socketport": 8081, 
    "unauthsize": 32, 
    "separator": "\n", 

    "rtmpHost": "localhost", 
    "rtmpPushPort": 6666,
    "rtmpPullPort": 1935,
    "rtmpAppName": "live",

    "userCountSend": false, 
    "sendPeriod": 5000, 
    "sendHost": "localhost", 
    "sendPort": 8080, 
    "sendURL": "/api/report", 
    "device_id": 10000, 
    "auth_key": "None", 
}

配置解析

本工程使用Tornado的options.parse_command_line()解析洞坑。該函數(shù)有一些特性在此先說明。

在命令行的解析過程中蝇率,命令行參數(shù)允許重復(fù)出現(xiàn)迟杂,同時后續(xù)出現(xiàn)的參數(shù)會覆蓋先前輸入的同名參數(shù)。

而如同config這樣指定配置文件的參數(shù)本慕,會在遇到的那一刻將配置文件內(nèi)的所有項目執(zhí)行完畢并賦值排拷。后續(xù)的命令行參數(shù)會在此后繼續(xù)進行解析。當然间狂,依然是后續(xù)的覆蓋先行的攻泼。

配置文件

  • config

    配置覆蓋文件,在命令行下指定--config=xx.py 會直接運行目標文件中的命令并使用內(nèi)部定義的所有數(shù)據(jù)。而后續(xù)再寫入的所有配置信息會覆蓋重復(fù)出現(xiàn)的字段忙菠。

    可以重復(fù)出現(xiàn)多次--config何鸡,每次遇到都會執(zhí)行一次目標文件,取最新的結(jié)果作為最終配置牛欢。

服務(wù)器自身配置

  • _user, _nickname, _password, _identity

    對應(yīng)cookie的名字

  • webport

    瀏覽器端口骡男,瀏覽器通過這個端口訪問web服務(wù)器,websocket也是這個端口

  • cookie_secret

    cookie加密鍵傍睹,tornado用于加密cookie的字符串

  • filesize

    文件大小隔盛,表明客戶端所能上傳的最大文件大小,大于這個數(shù)目的會被服務(wù)器拒絕

  • database

    數(shù)據(jù)庫文件拾稳,指定所使用的sqlite3數(shù)據(jù)庫文件

  • messageInterval

    每個用戶發(fā)送消息的冷卻時間

Socket 相關(guān)配置

  • socketport

    socket端口吮炕,樹莓派通過這個端口與服務(wù)器進行通信

  • unauthsize

    未授權(quán)客戶端的個數(shù),多于這個個數(shù)访得,服務(wù)器會主動將最早連入的設(shè)備連接斷開

  • separator

    socket下交流所用的信息間分隔符龙亲,以分隔符分割信息。

RTMP 相關(guān)配置

  • rtmpHost

    RTMP服務(wù)器的地址悍抑,瀏覽器端及樹莓派端均需求鳄炉,可以是網(wǎng)址或者IP

  • rtmpPushPort

    RTMP服務(wù)器推流的端口,用于樹莓派端推流搜骡。

  • rtmpPullPort

    RTMP服務(wù)器拉流的端口拂盯,用戶瀏覽器端拉流。

  • rtmpAppName

    RTMP服務(wù)器所使用的appname记靡,用于組成拉流的URL谈竿。

對于瀏覽器端,拉流的URI為

rtmp://rtmpHost:rtmpPullPort/rtmpAppName/streamName

其中簸呈,所有項均會由服務(wù)器給出榕订。streamName由服務(wù)器根據(jù)某些規(guī)則計算得到,其余項均為配置蜕便。

對于樹莓派端,推流的命令為

ffmpeg -i ... -f flv -metadata streamName="streamName" tcp://rtmpHost:rtmpPushPort

其中贩幻,所有項均會由服務(wù)器給出轿腺。streamName由服務(wù)器根據(jù)某些規(guī)則計算得到,其余項均為配置丛楚。

中心服務(wù)器相關(guān)配置

  • userCountSend

    是否發(fā)送當前在線用戶數(shù)據(jù)到指定url

  • sendPeriod

    發(fā)送頻率族壳,單位為ms

  • sendHost, sendPort, sendURL

    發(fā)送的主機、端口及URL趣些,默認發(fā)送給自己

  • device_id, auth_key

    發(fā)送時附帶上的身份識別信息

以上信息結(jié)合起來就是仿荆,如果設(shè)置了userCountSend字段為真,服務(wù)器會以sendPeriod為間隔向 http://sendHost:sendPort/sendURL 這個地址發(fā)送數(shù)據(jù)包,數(shù)據(jù)包如下:

{
    "auth_id" : "auth_id",
    "auth_key" : "auth_key",
    "device_id" : "auth_id",
    "userCount" : 在線人數(shù)
}

使用

  1. 使用config_override.py

config_override.py主要用法是覆蓋默認配置拢操。當然在命令行下輸入也是可以的锦亦,但是每次都輸入不僅煩還有可能出錯,所以推薦還是使用配置文件寫入令境。

配置文件所用的就是python語法杠园,將某個字段直接賦值即可。

exotic.lmin.me所用的配置文件節(jié)選如下

socketport = 9007
webport = 8007
unauthsize = 4
rtmpHost = "lmin.me"
rtmpPushPort = 6666
rtmpPullPort = 1935
rtmpAppName = "live"

此時可以使用

python config.py --config=config_override.py

查看配置

  1. 使用models.py初始化數(shù)據(jù)庫
python models.py --config=config_override.py
  1. 運行服務(wù)器端程序
python server.py --config=config_override.py
  1. 開始使用

使用client.py連入服務(wù)器并通過身份驗證后舔庶,使用瀏覽器連入服務(wù)器即可抛蚁。

url詳解

下方所有的$1均表示連入設(shè)備的索引值,為驗證成功后由服務(wù)器發(fā)送的index值

  • /

    用戶主頁的位置惕橙,只接受get請求瞧甩。主頁上顯示當前連入的設(shè)備及其信息。

  • /live/($1)/

    每個連入設(shè)備所獨有的界面弥鹦,用于與設(shè)備進行交互肚逸。

  • /live/($1)/file

    查看對應(yīng)設(shè)備的文件狀況。

  • /live/($1)/file/($2)

    下載該設(shè)備所屬的文件中類型為$2的文件惶凝。

  • /socket/live/($1)

    對應(yīng)每個設(shè)備的websocket連接地址

  • /api/livelist

    與主頁上的所有信息對應(yīng)吼虎,為json格式

  • /api/status

    服務(wù)器暴露的一些信息,當前僅為socketport即socket端口

  • /api/report

    用以接受在線用戶數(shù)據(jù)的url苍鲜,對于用戶無用思灰,只是以此測試發(fā)送成功與否

  • /api/admin/query

    需要管理員權(quán)限,接受get請求混滔,在請求參數(shù)中指明device_id則返回對應(yīng)的auth_key

  • /api/admin/add, /admin/add

    需要管理員權(quán)限洒疚,接受post以及get請求。

    • get請求下顯示一個瀏覽器端的請求頁面坯屿,并在點擊提交后轉(zhuǎn)入post頁面油湖。
    • post請求下根據(jù)傳入的device_id生成auth_key。
  • /register

    接受post以及get請求

    • get請求顯示注冊頁面领跛,按要求填寫字段后提交轉(zhuǎn)入post頁面乏德。
    • post請求對傳入的參數(shù)進行驗證,如果合法則存入數(shù)據(jù)庫并設(shè)置相關(guān)cookie
  • /login

    接受post以及get請求

    • get請求顯示登錄頁面吠昭,填寫對應(yīng)字段后提交轉(zhuǎn)入post頁面喊括。
    • post請求對傳入的參數(shù)進行驗證,合法則設(shè)置cookie
  • /logout

    接受get請求

    請求之后頁面上所有的cookie被清除矢棚,用戶登出郑什。

版本更新

todo list

斷線重連
save slot

server_v0.4

修改通信協(xié)議
增加多類型文件上傳功能

server_v0.3

添加瀏覽器端非權(quán)限用戶廣播功能
添加在線用戶數(shù)報告功能
服務(wù)器在樹莓派端及瀏覽器端連入時返回RTMP地址
添加了socket傳輸下信息之間的間隔符
添加requirements.txt
上傳時存儲文件至指定位置

server_v0.2

修改了樹莓派文件傳輸?shù)姆绞?br> 添加用戶登錄身份驗證
添加樹莓派連入身份驗證
添加管理員權(quán)限賬戶
添加README.md

server_v0.1

支持瀏覽器與服務(wù)器間通信
支持樹莓派與服務(wù)器間通信
支持多樹莓派連入
支持文件上傳

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蒲肋,隨后出現(xiàn)的幾起案子蘑拯,更是在濱河造成了極大的恐慌钝满,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件申窘,死亡現(xiàn)場離奇詭異弯蚜,居然都是意外死亡,警方通過查閱死者的電腦和手機偶洋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門熟吏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玄窝,你說我怎么就攤上這事牵寺。” “怎么了恩脂?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵帽氓,是天一觀的道長。 經(jīng)常有香客問我俩块,道長朴爬,這世上最難降的妖魔是什么抖僵? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上周蹭,老公的妹妹穿的比我還像新娘姻氨。我一直安慰自己夕玩,他們只是感情好坤按,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盲厌,像睡著了一般署照。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吗浩,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天建芙,我揣著相機與錄音,去河邊找鬼懂扼。 笑死禁荸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的阀湿。 我是一名探鬼主播屡限,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炕倘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翰撑,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罩旋,失蹤者是張志新(化名)和其女友劉穎啊央,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涨醋,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡瓜饥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浴骂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓土。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溯警,靈堂內(nèi)的尸體忽然破棺而出趣苏,到底是詐尸還是另有隱情,我是刑警寧澤梯轻,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布食磕,位于F島的核電站,受9級特大地震影響喳挑,放射性物質(zhì)發(fā)生泄漏彬伦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一伊诵、第九天 我趴在偏房一處隱蔽的房頂上張望单绑。 院中可真熱鬧,春花似錦曹宴、人聲如沸搂橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽份氧。三九已至,卻和暖如春弯屈,著一層夾襖步出監(jiān)牢的瞬間蜗帜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工资厉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厅缺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓宴偿,卻偏偏與公主長得像湘捎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窄刘,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理窥妇,服務(wù)發(fā)現(xiàn),斷路器娩践,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 實時消息協(xié)議---流的分塊 版權(quán)聲明: 版權(quán)(c)2009 Adobe系統(tǒng)有限公司活翩。全權(quán)所有烹骨。 摘要: 本備忘錄描...
    一個人zy閱讀 1,905評論 0 9
  • 個人翻譯,轉(zhuǎn)載請注明出處材泄,謝謝沮焕! Adobe's Real Time Messaging Protocol 摘要 ...
    SniperPan閱讀 2,738評論 1 17
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,768評論 0 15
  • 轉(zhuǎn)發(fā)自 2016-10-27李智文騰訊Bugly 概要 分享內(nèi)容: 互聯(lián)網(wǎng)內(nèi)容載體變遷歷程,文字——圖片/聲音——...
    樹懶啊樹懶閱讀 12,005評論 3 123