ElfBoard的“自創(chuàng)一派”共創(chuàng)社由19名來(lái)自各大高校的共創(chuàng)官組成,在不到一個(gè)月的時(shí)間里已經(jīng)建立起濃厚的學(xué)習(xí)氛圍,在這里每位共創(chuàng)官跨越不同的學(xué)科背景,交融思想、共享資源,迅速提升自身在嵌入式技術(shù)領(lǐng)域的專業(yè)素養(yǎng)。
值得一提的是,社群內(nèi)部已經(jīng)涌現(xiàn)出許多富有創(chuàng)意的產(chǎn)品設(shè)計(jì)理念與技術(shù)解決方案,今天就跟大家分享一名共創(chuàng)官完成的項(xiàng)目報(bào)告“基于ElfBoard的遠(yuǎn)程監(jiān)測(cè)系統(tǒng)”。
一、項(xiàng)目介紹
1.1 項(xiàng)目目標(biāo)
基于i.MX6ULL構(gòu)建一個(gè)功能強(qiáng)大的遠(yuǎn)程檢測(cè)系統(tǒng)。系統(tǒng)能夠自動(dòng)采集各種傳感器數(shù)據(jù),包括溫度、濕度、電壓等,并實(shí)時(shí)上傳至云端服務(wù)器,并且能夠根據(jù)采集到的傳感器數(shù)據(jù)對(duì)設(shè)備進(jìn)行自動(dòng)化控制,如設(shè)置電壓閾值,當(dāng)采集到的電壓大于閾值時(shí),開啟LED1。
在用戶端,實(shí)現(xiàn)對(duì)采集到的傳感器數(shù)據(jù)進(jìn)行處理、分析和可視化,便于用戶遠(yuǎn)程監(jiān)控和管理,還可以實(shí)現(xiàn)對(duì)設(shè)備的遠(yuǎn)程控制。集成高清攝像頭,將采集到的視頻數(shù)據(jù)傳輸至客戶端,實(shí)現(xiàn)對(duì)設(shè)備的遠(yuǎn)程實(shí)時(shí)監(jiān)控。
1.2 項(xiàng)目硬件
1、ElfBoard ELF 1 開發(fā)板
2、WiFi網(wǎng)絡(luò)
3、USB免驅(qū)攝像頭
4、Linux服務(wù)器
1.3 軟件環(huán)境
1、阿里云物聯(lián)網(wǎng)平臺(tái)
2、Nginx
3、Python
4、Flask
二、項(xiàng)目方案
2.1 遠(yuǎn)程監(jiān)控
采用RTMP協(xié)議,設(shè)備端使用FFmpeg采集攝像頭數(shù)據(jù)并推流至云端,云端使用Nginx提供Web服務(wù),并使用nginx-http-flv-module提供RTMP服務(wù),用戶端采用Web界面,并使用flv.js進(jìn)行拉流播放。
2.2 數(shù)據(jù)檢測(cè)與設(shè)備控制
傳感器數(shù)據(jù)傳輸以及設(shè)備的遠(yuǎn)程控制通過(guò)阿里云物聯(lián)網(wǎng)平臺(tái),采用MQTT協(xié)議。
三、數(shù)據(jù)檢測(cè)與設(shè)備控制
MQTT云平臺(tái)配置
參考 ElfBoard學(xué)習(xí)(九):MQTT
傳感器數(shù)據(jù)采集與上傳
基于Linux SDK中的data_model_basic_demo.c進(jìn)行修改。
溫濕度數(shù)據(jù)采集
電壓數(shù)據(jù)采集
LED狀態(tài)采集與控制
自動(dòng)化控制
當(dāng)ADC采集的電壓大于閾值2.5V時(shí)自動(dòng)開啟LED1,低于時(shí)自動(dòng)關(guān)閉LED1。
if(adc>2.5){ set_led(1,'1'); }else{ set_led(1,'0'); }
數(shù)據(jù)上傳
在main函數(shù)的while(1)中
云端指令響應(yīng)
由于云端傳輸?shù)臄?shù)據(jù)為JSON格式,因此需要使用cJSON進(jìn)行解析。
添加cJSON
在components文件夾下添加cJSON相關(guān)文件
修改Makefile
在74行和78行后面要添加-lm,否則在編譯的時(shí)候會(huì)報(bào)錯(cuò)。
實(shí)現(xiàn)代碼
四、視頻監(jiān)控
RTMP服務(wù)器搭建
云端服務(wù)器使用Nginx,但Nginx本身并不支持RTMP,需要使用相關(guān)的插件使其支持RTMP。此外由于網(wǎng)頁(yè)端播放RTMP流需要Flash插件的支持,而目前Flash插件許多瀏覽器已不再支持,因此需要使用支持 HTTPS-FLV的nginx-http-flv-module,并通過(guò)flv.js實(shí)現(xiàn)RTMP流的播放。這里首先需要下載Nginx和nginx-http-flv-module的源碼,并采用編譯的方式安裝Nginx,具體步驟如下:
./configure --add-module=/usr/local/nginx/nginx-http-flv-module make&&make install
安裝完成后,需要進(jìn)入Nginx安裝目錄(默認(rèn)為/usr/local/nginx/),并在conf文件夾下對(duì)nginx.conf文件進(jìn)行修改,增加rtmp功能(注意需要打開服務(wù)器的1935端口):
最后啟動(dòng)Nginx服務(wù),即可完成RTMP服務(wù)器的搭建:
cd /usr/local/nginx/sbin ./nginx
本地推流
FFmpeg的編譯配置參考:攝像頭采用的是USB免驅(qū)攝像頭,將攝像頭插入ElfBoard的USB口即可正常識(shí)別及工作,設(shè)備節(jié)點(diǎn)為/dev/video2。之后可以使用v4l2-ctl工具查看并配置攝像頭信息最后使用命令就能夠?qū)崿F(xiàn)推流:
ffmpeg -f video4linux2 -r 5 -s 320x240 -i /dev/video2 -c:v libx264 -preset ultrafast -tune zerolatency -r 5 -f flv rtmp://xxx.xxxxxx.xxx/live/test
五、用戶端設(shè)計(jì)
框架
使用Python編程,采用Web界面,并通過(guò)Flask提供Web服務(wù)以及后端數(shù)據(jù)處理能力??梢圆渴鹪谠贫?,也可以在本地運(yùn)行。界面如下所示:
視頻拉流
Web用戶端的視頻拉流通過(guò)flv.js實(shí)現(xiàn),首先需要在html文件中導(dǎo)入flv.js:
之后設(shè)計(jì)Web頁(yè)面播放器,具體代碼如下:
var player = document.getElementById('videoElement'); if (flvjs.isSupported()) { var flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://xxx.xxxxx.xx/live?port=1935&app=myapp&stream=test', "isLive": true, hasAudio: false, hasVideo: true, //withCredentials: false, //cors: true }, { enableWorker: true, enableStashBuffer: false, lazyLoad: false, lazyLoadMaxDuration: 0, lazyLoadRecoverDuration: 0, deferLoadAfterSourceOpen: false, fixAudioTimestampGap: true, autoCleanupSourceBuffer: true, }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); //加載 flv_start(); } function flv_start() { player.play(); } function flv_pause() { player.pause(); }
遠(yuǎn)程數(shù)據(jù)的讀取與指令下發(fā)
這一部分通過(guò)后端python編程實(shí)現(xiàn),并提供相應(yīng)的web接口。前后端的交互通過(guò)ajax請(qǐng)求實(shí)現(xiàn)。
-
嵌入式
+關(guān)注
關(guān)注
5054文章
18917瀏覽量
300974 -
監(jiān)測(cè)系統(tǒng)
+關(guān)注
關(guān)注
8文章
2645瀏覽量
81181 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4846瀏覽量
96887 -
Linux應(yīng)用
+關(guān)注
關(guān)注
0文章
4瀏覽量
5194
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論