項目地址: Exotic-experiment
快速使用
以下所說的網(wǎng)址對應(yīng)的服務(wù)器在玉泉經(jīng)常性抽風部凑,如果連不上的話,可以嘗試著去西湖四處看看風景
(來把梯子)檀训。當前部署在exotic.lmin.me上
socket端口可以通過訪問/api/status獲得。
- 樹莓派端需要進行身份驗證后才能收發(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斑司。
- 推流使用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ù)
}
使用
- 使用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
查看配置
- 使用models.py初始化數(shù)據(jù)庫
python models.py --config=config_override.py
- 運行服務(wù)器端程序
python server.py --config=config_override.py
- 開始使用
使用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ù)器間通信
支持多樹莓派連入
支持文件上傳