Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、為什么會(huì)用到網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控
LZ最近在無錫買房了,雖然在上海工作,但是上海房?jī)r(jià)實(shí)在太高無法承受,所以選擇還可以接受的無錫作為安身之地。買過房的小伙伴可能知道買房的流程,買房中間有一步很重要的就是需要商品房備案,簡(jiǎn)單點(diǎn)說就是你買房時(shí)可以在政府商品房備案網(wǎng)站處查看你購(gòu)買房的備案情況,如果是已經(jīng)備案了開發(fā)商還在賣這套房子,那肯定就是一房多賣了。而且很重要一點(diǎn)就是,只有備過案,才能進(jìn)行下一步銀行貸款,在目前銀行利息越來越高的情況下,肯定是越早備案越早貸款越有利,所以以最快速度知道自己購(gòu)買房子的備案情況尤為重要。
當(dāng)然也可以每天到網(wǎng)站查詢自己的備案情況,顯然這不是程序員的做法,更不是.Net程序員的做法。程序員的做法肯定是備案一旦下來,程序老老實(shí)實(shí)的通知到手機(jī)上。順便吐槽一點(diǎn),查詢備案的網(wǎng)站真慢。
二、選擇windows服務(wù)、窗體(winform)、web還是控制臺(tái)程序?
當(dāng)然最合適的肯定是windows服務(wù),winform和web肯定也可以的,控制臺(tái)程序不一定是最合適的,但肯定開發(fā)是最快速的。綜合考慮了一下,因?yàn)槭且粋€(gè)很小的監(jiān)控項(xiàng)目而且只會(huì)用一兩個(gè)月,或者一兩天,所以沒變要搞那么復(fù)雜,而且windows服務(wù)還要安裝到服務(wù)器,最重要的是控制臺(tái)是最快開發(fā)和最容易部署的,所以最終選擇了控制臺(tái)程序。
三、分析需求
1、需要每隔幾分鐘查詢一次備案情況,所以需要System.Timers.Timer。當(dāng)然如果是非常健壯的或者是完整的項(xiàng)目,建議用Quartz.NET,當(dāng)然可以選擇Topshelf、Hangfire、FluentScheduler等等。
2、因?yàn)樾枰樵兙W(wǎng)站的備案情況,獲取備案網(wǎng)頁(yè)的html,然后判斷html中是否含有“待售”字樣即可,如果沒有就說明已經(jīng)備案了。 這時(shí)需要System.Net.WebClient。查詢網(wǎng)站.net下就更多了,最基礎(chǔ)的就是HttpWebRequst,HttpClient,或者用RestSharp,都是不錯(cuò)的選擇。
3、因?yàn)樾枰獙?shí)時(shí)通知情況,所以選擇了阿里云的短信通知,因?yàn)槠渌?xiàng)目用到,所以直接復(fù)制代碼來用。當(dāng)然也有很多通知,比如郵件,app,等等。當(dāng)然我們沒必要搞那么復(fù)雜。
四、代碼模塊
直接代碼,邏輯和代碼很簡(jiǎn)單。
1 class Program 2 { 3 static System.Timers.Timer timer=null; 4 5 static void Main(string[] args) 6 { 7 timer=new System.Timers.Timer(2 * 60 * 1000); 8 timer.Elapsed +=Timer_Elapsed; ; 9 timer.Start();10 Console.ReadKey();11 }12 13 private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)14 {15 WebClient client=new WebClient16 {17 Encoding=System.Text.Encoding.GetEncoding("utf-8")18 };19 20 var html=client.DownloadString("http://www.xxxx.com/xxxxx.html");21 Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "......" + "未簽。");22 if (html.IndexOf("待售")==-1)23 {24 if (timer !=null)25 timer.Stop();26 27 // 發(fā)送5條短信28 for (int i=0; i < 5; i++)29 {30 // 發(fā)送短信31 SmsMessage.Send("152****7178", "SMS_92310001", new { name="Emrys", status="恭喜恭喜恭喜,房子已簽售!" });32 Thread.Sleep(5 * 1000);33 }34 35 }36 }37 }
五、部署
好吧,這項(xiàng)沒啥以及意義,直接生成代碼,在bin目錄拷貝Debug文件夾直接扔到服務(wù)器,點(diǎn)擊運(yùn)行xxxxxxx.exe。部署完畢。^_^
六、總結(jié)
1、雖然當(dāng)時(shí)只是突發(fā)奇想,并沒有具體統(tǒng)計(jì)時(shí)間,拿起vs就是一頓突突。所有代碼和部署應(yīng)該不會(huì)超過5分鐘。 從這可以看出.Net在vs配合下在一些方面做的還是不錯(cuò)的。
2、現(xiàn)在.Net core開源跨平臺(tái)以及運(yùn)行速度,C#“優(yōu)美的語(yǔ)言”,vs宇宙第一IDE,其他不多說,望.Net越來越好。^_^
作者:Emrys
出處:http://www.cnblogs.com/emrys5/p/net-real-time-monitoring-web.html
著互聯(lián)網(wǎng)技術(shù)飛速發(fā)展,網(wǎng)頁(yè)錄屏技術(shù)已趨于成熟。例如可將錄屏技術(shù)運(yùn)用到在線考試中,實(shí)現(xiàn)遠(yuǎn)程監(jiān)考、屏幕共享以及錄屏等;而在我們開發(fā)人員研發(fā)過程中,對(duì)于部分偶發(fā)事件,異常監(jiān)控系統(tǒng)僅僅只能告知程序出錯(cuò),而不能清晰的告知錯(cuò)誤的復(fù)現(xiàn)路徑,而錄屏技術(shù)或許能幫我們定位并復(fù)現(xiàn)問題。那么本文將從有感錄屏和無感錄屏兩方面給讀者分享一下錄屏這項(xiàng)技術(shù),希望可以幫助你對(duì)網(wǎng)頁(yè)錄屏有一個(gè)初步認(rèn)識(shí)。
有感錄屏一般指通過獲得用戶的授權(quán)或者通知用戶接下來的操作將會(huì)被錄制成視頻,并且在錄制過程中,用戶有權(quán)關(guān)閉中斷錄屏。即無論在錄屏前還是錄屏的過程中,用戶都始終能夠決定錄屏能否進(jìn)行。
常見的有感錄屏方案主要是通過 WebRTC (https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API) 錄制。WebRTC 是一套基于音視軌的實(shí)時(shí)數(shù)據(jù)流傳播的技術(shù)方案。由瀏覽器提供的原生 API navigator.mediaDevices.getDisplayMedia 方法實(shí)現(xiàn)提示用戶選擇和授權(quán)捕獲展示的內(nèi)容或窗口,進(jìn)而將獲取 stream (錄制的屏幕音視流)。我們可以對(duì) stream 進(jìn)行轉(zhuǎn)化處理,轉(zhuǎn)成相對(duì)應(yīng)的媒體數(shù)據(jù),并將其數(shù)據(jù)存儲(chǔ)。后續(xù)需要回溯該次錄制內(nèi)容時(shí),則取出媒體數(shù)據(jù)進(jìn)行播放。
具體的有感錄屏流程如下:
使用 navigator.mediaDevices.getDisplayMedia 初始化錄屏,觸發(fā)彈窗獲取用戶授權(quán),效果圖如下所示:
實(shí)現(xiàn) WebRTC 初始化錄屏核心代碼如下:
const tracks=[]; // 媒體數(shù)據(jù)
const options={
mimeType : "video/webm; codecs=vp8", // 媒體格式
};
let mediaRecorder;
// 初始化請(qǐng)求用戶授權(quán)監(jiān)控
navigator.mediaDevices.getDisplayMedia(constraints).then((stream)=> {
// 對(duì)音視流進(jìn)行操作
startFunc(stream);
});
// 開始錄制方法
function start(stream) {
// 創(chuàng)建 MediaRecorder 的實(shí)例對(duì)象,對(duì)指定的媒體流進(jìn)行錄制
mediaRecorder=new MediaRecorder(stream, options);
// 當(dāng)生成媒體流數(shù)據(jù)時(shí)觸發(fā)該事件,回調(diào)傳參 event 指本次生成處理的媒體數(shù)據(jù)
mediaRecorder.ondataavailable=event=> {
if(event?.data?.size > 0){
tracks.push(event.data); // 存儲(chǔ)媒體數(shù)據(jù)
}
};
mediaRecorder.start();
console.log("************開始錄制************")
};
// 結(jié)束錄制方法
function stop() {
mediaRecorder.stop();
console.log("************錄制結(jié)束************")
}
// 定義constraints數(shù)據(jù)類型
interface constraints {
audio: boolean | MediaTrackConstraints, // 指定是否請(qǐng)求音軌或者約束軌道屬性值的對(duì)象
video: boolean | MediaTrackConstraints, // 指定是否請(qǐng)求視頻軌道或者約束軌道屬性值的對(duì)象
}
獲取該次錄屏的媒體數(shù)據(jù),可以將其轉(zhuǎn)成 blob 對(duì)象,并且生成 blob對(duì)象的 url 字符串,再賦值 video.src 中,便可以回放到錄制結(jié)果,回溯的視頻效果如下:
錄屏回溯方法的核心代碼如下所示:
// 回放錄制內(nèi)容
function replay() {
const video=document.getElementById("video");
const blob=new Blob(tracks, {type : "video/webm"});
video.src=window.URL.createObjectURL(blob);
video.srcObject=null;
video.controls=true;
video.play();
}
由于存儲(chǔ)的媒體數(shù)據(jù)是實(shí)時(shí)的,因此可以利用該數(shù)據(jù)實(shí)現(xiàn)直播功能。通過給 video.srcObject 賦值媒體流可以實(shí)現(xiàn)直播功能。
實(shí)現(xiàn)實(shí)時(shí)直播核心代碼如下:
// 直播
function live() {
const video=document.getElementById("video");
video.srcObject=window.stream;
video.controls=true;
video.play();
}
無感錄屏指在用戶無感知的情況,對(duì)用戶在頁(yè)面上的操作進(jìn)行錄制。實(shí)現(xiàn)上與有感錄制區(qū)別在于,無感錄制通常是利用記錄頁(yè)面的 DOM 來進(jìn)行錄制。常見的有 canvas 截圖繪制視頻和 rrweb 錄制等方案。
用戶在瀏覽頁(yè)面時(shí),可以通過 canvas 繪制多個(gè) DOM 快照截圖,再將多個(gè)截圖合并成一段錄屏視頻。但是考慮到假設(shè)視頻幀數(shù)為 30 幀,幀數(shù)代表著每秒所需的截圖數(shù)量,為了視頻的流暢和清晰,每張截圖為 400 KB ,那么當(dāng)視頻長(zhǎng)度為 1 分鐘,則需要上傳 703.125 MB 的資源,這么大的帶寬浪費(fèi)無疑會(huì)造成性能,甚至影響用戶體驗(yàn),不推薦使用,也不在此詳細(xì)介紹本方案實(shí)現(xiàn)。
rrweb (record and replay the web) 是一個(gè)對(duì)于 DOM 錄制的支持性非常好,利用現(xiàn)代瀏覽器所提供的強(qiáng)大 API 錄制并回放任意 web 界面中的用戶操作,能夠?qū)㈨?yè)面 DOM 結(jié)構(gòu)通過相應(yīng)算法高效轉(zhuǎn)換 JSON 數(shù)據(jù)的開源庫(kù)。相比較于使用 canvas 繪制錄屏,rrweb 在保證錄制不掉幀的基礎(chǔ)上,讓網(wǎng)絡(luò)傳輸數(shù)據(jù)更加快速和輕量化,極大地優(yōu)化了網(wǎng)絡(luò)性能。
rrweb 開源庫(kù)主要由 rrweb-snapshot、rrweb 和 rrweb-play 三部分組成,并且提供了動(dòng)作篩選,數(shù)據(jù)加密、數(shù)據(jù)壓縮、數(shù)據(jù)切片、屏蔽元素等功能。
rrweb-snapshot 提供 snapshot 和 rebuild 兩個(gè) API,分別實(shí)現(xiàn)生成可序列化虛擬 DOM 快照的數(shù)據(jù)結(jié)構(gòu)和將其數(shù)據(jù)結(jié)構(gòu)重建為對(duì)應(yīng) DOM 節(jié)點(diǎn)的兩個(gè)功能。
snapshot 將 DOM 及其狀態(tài)轉(zhuǎn)化為可序列化的數(shù)據(jù)結(jié)構(gòu)并添加唯一標(biāo)識(shí) id,使得一個(gè) id 映射對(duì)應(yīng)的一個(gè) DOM 節(jié)點(diǎn),方便后續(xù)以增量的方式來操作。
首先需要通過深拷貝 document 生成初始化 DOM 快照。
// 深拷貝 document 節(jié)點(diǎn)
const docEl=document.documentElement.cloneNode(true);
// 回放時(shí)再將深拷貝的節(jié)點(diǎn)掛在回去即可
document.replaceChild(docEl, document.documentElement);
由于獲取到的 DOM 對(duì)象并不是可序列化的,因此仍需要將其轉(zhuǎn)成特定的文本格式(如 JSON)進(jìn)行傳輸,否則無法做到遠(yuǎn)程錄制。在實(shí)現(xiàn) DOM 快照可序列化的過程中,還需對(duì)數(shù)據(jù)進(jìn)行特殊處理:
雖然已經(jīng)能夠獲取到全量的 DOM 對(duì)象,但是無法將增量快照中被交互的 DOM 節(jié)點(diǎn)和現(xiàn)已有的 DOM 節(jié)點(diǎn)關(guān)聯(lián)上,所以還需要給 DOM 添加一層映射關(guān)系(id=> Node),后續(xù) DOM 節(jié)點(diǎn)的更新都通過該 id 來記錄并對(duì)應(yīng)到完整的 DOM 節(jié)點(diǎn)中。
如下是初始時(shí)獲取到的 DOM 節(jié)點(diǎn):
<html>
<body>
<header>
</header>
</body>
</html>
通過遍歷整個(gè) DOM 樹,以 Node 節(jié)點(diǎn)為單位,給每個(gè)遍歷到的 Node 都添加了唯一標(biāo)識(shí) id ,生成全量序列化的 DOM 對(duì)象快照 。以下是序列化后的數(shù)據(jù)結(jié)構(gòu)示意:
{
"type": "Document",
"childNodes": [
{
"type": "Element",
"tagName": "html",
"attributes": {},
"childNodes": [
{
"type": "Element",
"tagName": "head",
"attributes": {},
"childNodes": [],
"id": 3
},
{
"type": "Element",
"tagName": "body",
"attributes": {},
"childNodes": [
{
"type": "Text",
"textContent": "\n ",
"id": 5
},
{
"type": "Element",
"tagName": "header",
"attributes": {},
"childNodes": [
{
"type": "Text",
"textContent": "\n ",
"id": 7
}
],
"id": 6
}
],
"id": 4
}
],
"id": 2
}
],
"id": 1
}
將 snapshot 記錄的初始化快照的數(shù)據(jù)結(jié)構(gòu),繼而通過遞歸給每個(gè)節(jié)點(diǎn)添加屬性來重建 DOM ,生成可序列化的 DOM 節(jié)點(diǎn)快照。
rrweb 提供 record 和 replay 兩個(gè) API,分別實(shí)現(xiàn)記錄所有增量數(shù)據(jù)和將記錄的數(shù)據(jù)按照時(shí)間戳回放的兩個(gè)功能。
通過觸發(fā)視圖的變化和 DOM 結(jié)構(gòu)的改變(如 DOM 節(jié)點(diǎn)的刪減和屬性值的變化)來劫持增量變化數(shù)據(jù)存入 JSON 對(duì)象中,每個(gè)增量數(shù)據(jù)對(duì)應(yīng)一個(gè)時(shí)間戳,這些數(shù)據(jù)稱之為 Oplog(operations log)。
視圖的變化可通過全局事件監(jiān)聽和事件代理方法收集增量數(shù)據(jù),而這些事件大多是和用戶的操作行為相關(guān),能夠觸發(fā)這類事件的動(dòng)作如 DOM 節(jié)點(diǎn)或內(nèi)容的變動(dòng)、鼠標(biāo)移動(dòng)或交互、頁(yè)面或元素滾動(dòng)、鍵盤交互和窗口大小變動(dòng)。
DOM 結(jié)構(gòu)的改變可以通過瀏覽器提供的 MutationObserver (https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver) 接口能監(jiān)視,觸發(fā)參數(shù)回調(diào),獲取到本次 DOM 的變動(dòng)的節(jié)點(diǎn)信息,進(jìn)而對(duì)數(shù)據(jù)進(jìn)行篩選重組等處理。回調(diào)參數(shù)的數(shù)據(jù)結(jié)構(gòu)如下:
let MutationRecord1: MutationRecordObject[];
interface MutationRecordObject {
/**
* 如果是屬性變化,則返回 "attributes";
* 如果是 characterData 節(jié)點(diǎn)變化,則返回 "characterData";
* 如果是子節(jié)點(diǎn)樹 childList 變化,則返回 "childList"。
*/
type: String,
// 返回被添加的節(jié)點(diǎn)。如果沒有節(jié)點(diǎn)被添加,則該屬性將是一個(gè)空的 NodeList。
addedNodes: NodeList,
// 返回被移除的節(jié)點(diǎn)。如果沒有節(jié)點(diǎn)被移除,則該屬性將是一個(gè)空的 NodeList。
removedNodes: NodeList,
// 返回被修改的屬性的屬性名,或者 null。
attributeName: String | null,
// 返回被修改屬性的命名空間,或者 null。
attributeNamespace: String | null,
// 返回被添加或移除的節(jié)點(diǎn)之前的兄弟節(jié)點(diǎn),或者 null。
previousSibling: Node | null,
// 返回被添加或移除的節(jié)點(diǎn)之后的兄弟節(jié)點(diǎn),或者 null。
nextSibling: Node | null,
/** 返回值取決于 MutationRecord.type。
* 對(duì)于屬性 attributes 變化,返回變化之前的屬性值。
* 對(duì)于 characterData 變化,返回變化之前的數(shù)據(jù)。
* 對(duì)于子節(jié)點(diǎn)樹 childList 變化,返回 null。
*/
oldValue: String | null,
}
record 收集的 Oplog 數(shù)據(jù)結(jié)構(gòu)如下圖所示:
let Oplog: OplogObject[];
interface OplogObject {
/** 返回值取決于收集的事件類型
* DomContentLoaded: 0, Load: 1,
* FullSnapshot: 2, IncrementalSnapshot: 3,
* Meta: 4, Custom: 5, Plugin: 6
*/
type: Number,
data: {
// 返回添加的節(jié)點(diǎn)數(shù)據(jù)
adds: [],
// 返回修改的節(jié)點(diǎn)屬性數(shù)據(jù)
attributes: [],
// 返回移除的節(jié)點(diǎn)屬性數(shù)據(jù)
removes: [],
/** 返回值取決于增量數(shù)據(jù)的增量類型
* Mutation: 0, MouseMove: 1,
* MouseInteraction: 2, Scroll: 3,
* ViewportResize: 4, Input: 5,
* TouchMove: 6, MediaInteraction: 7,
* StyleSheetRule: 8, CanvasMutation: 9,
* Font: 10, Log: 11,
* Drag: 12, StyleDeclaration: 13
**/
source: Number,
// 返回當(dāng)前修改的值,無則不返回
text: String | undefined,
},
// 當(dāng)前時(shí)間戳
timestamp: Number,
}
基于初始化的快照數(shù)據(jù)和增量數(shù)據(jù),將其按照對(duì)應(yīng)的時(shí)間戳一一回放。由于一開始創(chuàng)建快照時(shí)已經(jīng)禁止了腳本運(yùn)行,所以可以通過 iframe 作為容器來重建 DOM 全量快照 ,并且通過 sanbox 屬性禁止了腳本執(zhí)行、彈出窗和表單提交之類的操作。把 Oplog 放入操作隊(duì)列中,按照每個(gè)的時(shí)間戳先后進(jìn)行排序,再使用定時(shí)器 requestAnimationFrame 回放 Oplog 快照。
為 rrweb 提供一套 UI 控件,提供基于 GUI 的暫停、快進(jìn)、拖拽至任意時(shí)間點(diǎn)播放等功能。
摘要】 這篇文章介紹華為云ECS服務(wù)器的購(gòu)買、部署、登錄、使用的整體流程,在服務(wù)器部署NGINX服務(wù),搭建一個(gè)安防視頻監(jiān)控平臺(tái),本地開發(fā)了配套的RTMP流媒體推流客戶端、RTMP播放器,完成整體效果演示。 RTMP流媒體推流客戶端就是用來模擬攝像頭硬件設(shè)備,RTMP流媒體推流客戶端在筆記本電腦上運(yùn)行,將筆記本電腦上的攝像頭音視頻流實(shí)時(shí)推流到華為云服務(wù)器轉(zhuǎn)存。
1. 前言
華為云的彈性云服務(wù)器(Elastic Cloud Server)是一種可隨時(shí)自助獲取、可彈性伸縮的云服務(wù)器,幫助用戶打造可靠、安全、靈活、高效的應(yīng)用環(huán)境,確保服務(wù)持久穩(wěn)定運(yùn)行,提升運(yùn)維效率。彈性云服務(wù)器從創(chuàng)立到發(fā)動(dòng)只需幾分鐘,客戶將具有云服務(wù)器的超級(jí)管理員權(quán)限,輕松布置各種運(yùn)用。
這篇文章介紹華為云ECS服務(wù)器的購(gòu)買、部署、登錄、使用的整體流程,在服務(wù)器部署NGINX服務(wù),搭建一個(gè)安防視頻監(jiān)控平臺(tái),本地開發(fā)了配套的RTMP流媒體推流客戶端、RTMP播放器,完成整體效果演示。 RTMP流媒體推流客戶端就是用來模擬攝像頭硬件設(shè)備,RTMP流媒體推流客戶端在筆記本電腦上運(yùn)行,將筆記本電腦上的攝像頭音視頻流實(shí)時(shí)推流到華為云服務(wù)器轉(zhuǎn)存。
2. 購(gòu)買云服務(wù)器
如果之前沒有使用過華為云的ECS服務(wù)器,可以先申請(qǐng)?jiān)囉?個(gè)月,了解服務(wù)器的基本使用然后再購(gòu)買,不得不說提供這個(gè)試用服務(wù)還是非常不錯(cuò)。
產(chǎn)品試用領(lǐng)取地址: https://activity.huaweicloud.com/free_test/index.html
每天9:30開搶,每天限量100份,這個(gè)頁(yè)面不僅有云服務(wù)器可以領(lǐng)取試用,還有云數(shù)據(jù)庫(kù)、沙盒等其他產(chǎn)品。
我這里領(lǐng)取了 2核4G S6云服務(wù)器,這個(gè)服務(wù)器是配套華為自研25GE智能高速網(wǎng)卡,適用于網(wǎng)站和Web應(yīng)用等中輕載企業(yè)應(yīng)用。
選擇配置的時(shí)候發(fā)現(xiàn)S6規(guī)格的已經(jīng)沒有了,來晚了。
S6規(guī)格沒有了,就選擇了S3,2核,4GB的配置結(jié)算。
image-20220611131022494
頁(yè)面向下翻,下面選擇系統(tǒng)預(yù)裝的系統(tǒng),我這里選擇ubuntu 20.04,安裝NGINX,來搭建流媒體服務(wù)器。
頁(yè)面繼續(xù)下翻,設(shè)置云服務(wù)器名稱,設(shè)置系統(tǒng)的root密碼。
接著就可以繼續(xù)去支付了。
購(gòu)買后等待一段時(shí)間,系統(tǒng)資源就即可分配完成。
3. 登錄云服務(wù)器
云服務(wù)器的管理控制臺(tái)從這里進(jìn)入: https://www.huaweicloud.com/product/ecs.html
在官網(wǎng)主頁(yè),點(diǎn)擊產(chǎn)品,找到計(jì)算選項(xiàng),就可以看到彈性云服務(wù)器ECS,點(diǎn)擊進(jìn)去就可以看到管理控制臺(tái)的選項(xiàng)。
在彈性云服務(wù)器的選項(xiàng)頁(yè)面可以看到剛才購(gòu)買的云服務(wù)器,如果點(diǎn)擊進(jìn)去提示該區(qū)域沒有可用的服務(wù)器,說明區(qū)域選擇的不對(duì),在下面截圖紅色框框的位置可以看到可用的區(qū)域切換按鈕,切換之后就行了。
點(diǎn)擊服務(wù)器右邊的更多,可以對(duì)服務(wù)器重裝系統(tǒng)、切換操作系統(tǒng)、關(guān)機(jī)、開機(jī)、重啟、重置密碼等操作。
接下來先點(diǎn)擊登錄,了解一下登錄的流程,看看系統(tǒng)進(jìn)去的效果。
云服務(wù)器支持SSH協(xié)議遠(yuǎn)程登錄,可以在瀏覽器上直接使用CloudShell方式或者VNC方式登錄,如果本身你自己也是使用Linux系統(tǒng),可以在Linux系統(tǒng)里通過ssh命令直接登錄,如果是在windows下可以使用SecureCRT登錄。
其他登錄方式。
最方便的登錄方式,直接在控制臺(tái)使用VNC在瀏覽器里登錄,點(diǎn)擊立即登錄。
根據(jù)提示輸入用戶名,密碼后,按下回車鍵即可登錄。
用戶名直接輸入root,密碼就是剛才配置云服務(wù)器時(shí),填入的root密碼。
注意: Linux下輸入密碼默認(rèn)都是隱藏的,也就是在鍵盤上輸入密碼界面上是不會(huì)有反應(yīng)的,自己按照正確的密碼輸入即可。
用戶名、密碼輸入正確后,登錄成功。
可以點(diǎn)擊全屏模式,更好的操作。
4. 使用CloudShell登錄云服務(wù)器
在頁(yè)面上直接點(diǎn)擊CloudShell登錄按鈕。CloudShell方式比VNC方式方便、流暢多了,也支持命令的復(fù)制粘貼。
輸入密碼點(diǎn)擊連接。
登錄成功進(jìn)入終端。
5. 使用SecureCRT登錄云服務(wù)器
上面演示了兩種登錄方式,都是直接在瀏覽器里登錄,這種兩種方式比較來看,VNC方式效率最低,CloudShell相對(duì)來說要方便很多。一般我自己正常開發(fā)時(shí),都是使用第三方工具來登錄的,如果本身自己開發(fā)環(huán)境的電腦就是Linux,MAC等,可以直接使用ssh命令登錄,這種方式操作流暢方便。如果在windows下,可以使用第三方軟件登錄。
我現(xiàn)在使用的系統(tǒng)是win10,在windows系統(tǒng)下有很多遠(yuǎn)程終端軟件支持SSH登錄到Linux云服務(wù)器,我當(dāng)前采用的使用SecureCRT 6.5來作為登錄終端,登錄云服務(wù)器。
注意: SecureCRT 6.5 登錄高版本Linux系統(tǒng)會(huì)出現(xiàn)Key exchange failed問題,導(dǎo)致登錄失敗,比如: 登錄ubuntu 20.04 系統(tǒng)。 出現(xiàn)這種問題需要對(duì)系統(tǒng)ssh配置文件進(jìn)行添加配置。
添加配置的流程:
命令行輸入:
vim /etc/ssh/sshd_config
在文件最后添加:
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
保存退出。
重啟ssh服務(wù)
service ssh restart
如果不想這么麻煩的去修改配置文件,那么最簡(jiǎn)單的辦法就是: 切換操作系統(tǒng),換一個(gè)低版本的,比如:ubuntu18.04 即可。
在云服務(wù)器的控制臺(tái),找到自己的服務(wù)器,然后選擇切換操作系統(tǒng)。
根據(jù)界面上的引導(dǎo)流程,切換即可。更換新的系統(tǒng)需要1~4分鐘時(shí)間,稍微等待一下即可。
如果要使用遠(yuǎn)程SSH協(xié)議方式登錄云服務(wù)器,需要具備以下幾個(gè)前提條件。
[1]彈性云服務(wù)器狀態(tài)為“運(yùn)行中”。
[2]彈性云服務(wù)器已經(jīng)綁定彈性公網(wǎng)IP,綁定方式請(qǐng)參見綁定彈性公網(wǎng)IP。
[3]所在安全組入方向已開放22端口,配置方式請(qǐng)參見配置安全組規(guī)則。
[4]使用的登錄工具(如PuTTY,SecureCRT`)與待登錄的彈性云服務(wù)器之間網(wǎng)絡(luò)連通。例如,默認(rèn)的22端口沒有被防火墻屏蔽。
但是這些配置不用擔(dān)心,在購(gòu)買服務(wù)器后,根據(jù)引導(dǎo)一套走完,上面的這些配置都已經(jīng)默認(rèn)配置好了,不用自己再去單獨(dú)配置。
系統(tǒng)切換成功后,打開SecureCRT 6.5軟件,進(jìn)行登錄。SecureCRT 6.5整體而言還是挺好用的。
如果自己沒有``SecureCRT,自己下載一個(gè)即可。當(dāng)然,不一定非要使用SecureCRT`,其他還有很多SSH遠(yuǎn)程登錄工具,喜歡哪個(gè)使用哪個(gè)。
下面介紹``SecureCRT `登錄的流程。
選擇新建會(huì)話。
選擇SSH2協(xié)議。
主機(jī)名就填服務(wù)器的公網(wǎng)IP地址,端口號(hào)默認(rèn)是22,用戶名填root。
自己云服務(wù)器的公網(wǎng)IP地址,在控制臺(tái)可以看到。
軟件點(diǎn)擊下一步之后,可以填充描述信息,備注這個(gè)鏈接是干什么的。
選擇剛才新建的協(xié)議端口點(diǎn)擊連接。
云服務(wù)器連接上之后,軟件界面會(huì)彈出對(duì)話框填充用戶名、密碼。
登錄成功的效果如下。
軟件可以配置一些選項(xiàng),讓界面符合Linux終端配色,可以修改字體大小、字體編碼等等。
配置后的效果。
6. 安裝NFS服務(wù)器
為了方便向服務(wù)器上拷貝文件,可以采用NFS服務(wù)器、或者FTP服務(wù)器 這些方式。 我本地有一臺(tái)ubuntu 18.04 系統(tǒng)筆記本,我這里采用NFS方式拷貝文件上去。
(1)安裝NFS服務(wù)器
root@ecs-348470:~# sudo apt-get install nfs-kernel-server
(2)創(chuàng)建一個(gè)work目錄方便當(dāng)做共享目錄使用
root@ecs-348470:~# mkdir work
(3)編寫NFS配置文件
NFS 服務(wù)的配置文件為/etc/exports,如果系統(tǒng)沒有默認(rèn)值,這個(gè)文件就不一定會(huì)存在,可以使用 vim 手動(dòng)建立,然后在文件里面寫入配置內(nèi)容。
/home/work *(rw,no_root_squash,sync,no_subtree_check,insecure)
配置文件里參數(shù)的含義:
(4)NFS服務(wù)器相關(guān)指令
/etc/init.d/nfs-kernel-server start #啟動(dòng) NFS 服務(wù)
ufw disable #關(guān)閉防火墻
/etc/init.d/nfs-kernel-server restart #重啟NFS服務(wù)
exportfs -arv #共享路徑生效
(5)本地客戶機(jī)掛載服務(wù)器的目錄
wbyq@wbyq:~$ sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
(6)設(shè)置華為云服務(wù)器的安全策略
需要把華為云服務(wù)器的端口號(hào)開放出來,不然其他客戶端是無法訪問服務(wù)器的。
我這里比較粗暴直接,直接將所有端口號(hào),所有IP地址都開放出來了。
**(7)本地客戶機(jī)掛載服務(wù)器測(cè)試 **
掛載指令:
sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
image-20220611185744008
7. 安裝NGINX(配置RTMP服務(wù))
(1)下載編譯時(shí)需要依賴的一些工具
root@ecs-348470:~# sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
(2)下載NGINX編譯需要的軟件包
root@ecs-348470:~# mkdir nginx
root@ecs-348470:~# cd nginx/
root@ecs-348470:~# wget http://nginx.org/download/nginx-1.10.3.tar.gz
root@ecs-348470:~# wget http://zlib.net/zlib-1.2.11.tar.gz
root@ecs-348470:~# wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
root@ecs-348470:~# wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
root@ecs-348470:~# wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
image-20220611190538685
(3)下載后的文件全部解壓
root@ecs-348470:~# tar xvf openssl-1.0.2k.tar.gz
root@ecs-348470:~# tar xvf nginx-rtmp-module-master.tar.gz
root@ecs-348470:~# tar xvf nginx-1.8.1.tar.gz
root@ecs-348470:~# tar xvf pcre-8.40.tar.gz
root@ecs-348470:~# tar xvf zlib-1.2.11.tar.gz
image-20220611190905353
(4)配置NGINX源碼,生成Makefile文件
root@ecs-348470:~# cd nginx-1.8.1/
root@ecs-348470:~# ./configure --prefix=/usr/local/nginx --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2k --add-module=../nginx-rtmp-module-master
執(zhí)行完上一步之后,打開objs/Makefile文件,找到-Werror選項(xiàng)并刪除。
(5)編譯并安裝NGINX
root@ecs-348470:~/nginx/nginx-1.8.1# make && make install
安裝之后NGINX的配置文件存放路徑:
/usr/local/nginx/nginx:主程序
(6)查看NGINX的版本號(hào)
root@ecs-348470:/usr/local/nginx/sbin# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.8.1
(5)在配置文件里加入RTMP服務(wù)器的配置
root@ecs-348470:~# vim /usr/local/nginx/conf/nginx.conf
打開文件后,在文件最后加入以下配置:
這樣配置之后,服務(wù)器收到RTMP流會(huì)在NGINX的當(dāng)前目錄下,創(chuàng)建一個(gè)video目錄用來緩存視頻。
客戶端向服務(wù)器推流之后,服務(wù)器就會(huì)緩存視頻到設(shè)置的目錄。
(5)檢查配置文件是否正確
(6)NGINX常用的3個(gè)命令
sudo service nginx start
sudo service nginx stop
sudo service nginx restart
(7)啟動(dòng)NGINX服務(wù)器
sudo service nginx start
8. 攝像頭推流音視頻到服務(wù)器
為了模擬攝像頭實(shí)時(shí)監(jiān)控推流,我這使用QT+FFMPEG編寫了一個(gè)小軟件,在windows下運(yùn)行,推流本地筆記本電腦的數(shù)據(jù)到服務(wù)器。軟件運(yùn)行之后,將本地音頻、視頻編碼之后通過RTMP協(xié)議推流到NGINX服務(wù)器。
軟件運(yùn)行效果:
推流工具運(yùn)行過程中效果。
9. 編寫本地RTMP流播放器
在上面第8小節(jié),通過推流客戶端模擬攝像頭,已經(jīng)將本地的攝像頭數(shù)據(jù)實(shí)時(shí)推流到服務(wù)器了,那么還差一個(gè)播放器,為了方便能夠在任何有網(wǎng)的地方實(shí)時(shí)查看攝像頭的音頻和圖像,還需要編寫一個(gè)RTMP流媒體播放器。
我這里的播放器內(nèi)核是采用libvlc開發(fā)的,使用QT作為GUI框架,開發(fā)了一個(gè)流媒體播放器,可以實(shí)時(shí)拉取服務(wù)器上的流數(shù)據(jù),并且還支持回放。因?yàn)榉?wù)器上的NGINX配置了自動(dòng)保存的參數(shù),可以將推上去的流按時(shí)間段保存下來。
輸入服務(wù)器地址之后就可以拉取流進(jìn)行播放。
點(diǎn)擊獲取回放列表,可以查看服務(wù)器上保存的歷史視頻回放播放。
10. 總結(jié)
相較于傳統(tǒng)服務(wù)器,云服務(wù)器具有多方面的優(yōu)勢(shì),利用彈性計(jì)算優(yōu)勢(shì),幫助企業(yè)完成云上業(yè)務(wù)的部署與應(yīng)用,,可以根據(jù)自身需要自定義服務(wù)器配置,靈活地選擇設(shè)定所需的內(nèi)存、CPU、帶寬等配置,整體上減小了企業(yè)自己搭建服務(wù)器開發(fā)的成本,還省了服務(wù)器的一大堆維護(hù)費(fèi)用。
【華為云至簡(jiǎn)致遠(yuǎn)】有獎(jiǎng)?wù)魑幕馃徇M(jìn)行中:https://bbs.huaweicloud.com/blogs/352809
【版權(quán)聲明】本文為華為云社區(qū)用戶原創(chuàng)內(nèi)容,轉(zhuǎn)載時(shí)必須標(biāo)注文章的來源(華為云社區(qū)),文章鏈接,文章作者等基本信息,否則作者和本社區(qū)有權(quán)追究責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,歡迎發(fā)送郵件至:cloudbbs@huaweicloud.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。