用Arduino監測MSSQL數據庫中進程阻塞情況



有天開了個腦洞然後又把它填上了,做了一個監測公司在用的MSSQL數據庫的進程阻塞情況,用一兩杯星爸爸的價格幹一臺PC的活老闆你總開心了吧。

這個腦洞是這樣的:Arduino連着網絡模塊接入局域網,定時(暫定8秒)訪問一個網頁,這個網頁就用來檢測並返回MSSQL當時進程阻塞數。Arduino接收並解析網頁的返回結果,如果零阻塞,亮綠色LED;如果有1-5個阻塞,同時亮綠色和黃色LED;如果有大於5個的阻塞,同時亮黃燈和紅燈;如果只亮紅燈則說明這套小系統本身存在錯誤。

當然由於是定時刷新,會有一定時間的滯後。總的來說先當個概念玩具嘗試下。

所以核心問題是如何訪問網頁,當然基礎的基礎是如何訪問網絡。

某寶上搞了一塊ENC28J60網絡模塊,試着學習了一把。首先當然是接線,這個還是比較清晰的,按SPI定義來即可。
模塊 -- Arduino
SCK -- D13
SO -- D12
SI -- D11
CS -- D10*
RST -- RESET
GND -- GND
VCC -- 3.3V**

說明:
*:D10可以改其它的,因爲具體需要體現在初始化的代碼中。
**:3.3V有可能導致網絡模塊供電不足而不能工作。我的就是這樣,如果VCC接我的山寨Arduino Nano的3.3V,實測在模塊的VCC和GND之間電壓只有2.8V。可以用那個山寨nano的5V供電,但時間稍長28J60便嚴重發熱。我現在是剪了一根杜邦線,中間串了一個1N4007利用它的正向壓降稍微降點再接到VCC上。

驅動找賣家要的,好使。但我實際情況比例子稍微複雜點:網絡不是標準的C類網,而且有網關和DNS,所以查了下資料,設置IP地址時用到了以下的代碼:
static uint8_t mac[] = {0xF4, 0x8E, 0x38, 0xA4, 0x30, 0x31}; // 保證6個字節就行,隨便寫。但是第一個字節必須是偶數。
const static uint8_t ip[] = {10, 16, 39, 40};
const static uint8_t gwip [] = {10, 16, 36, 1};
const static uint8_t dns[] = {172.16.10.12};
const static uint8_t subnet[] = {255, 255, 252, 0};

調用次序是:ether.staticSetup(ip, gwip, dns, subnet)

訪問網頁的代碼參考自http://www.rogerclark.net/aurduino-ethercard-multiple-browser-request-example/。有點小複雜,但是考慮較全面並且支持一次訪問多個網頁。考慮到將來也許有這個需求所以先收了這篇。

爲了簡單方便,以及配合單位現有的ASP.NET架構,網頁採用ashx,無非就要它查詢下當前阻塞數並返回這個數字而已。原理上講用php也沒問題,反正能返回個text/plain流就行。取到ashx返回的內容之後的下一個難點就是如何解析出真正想要的結果。因爲HTTP頭還總是存在的,所以需要扔掉。我的做法是用String類的lastIndexOf函數,找出所獲得的全部字符裏最後面的“\r”的位置,從這裏開始+2的位置截取到最後。

LED顯示沒啥花頭,消耗3個IO口並根據業務邏輯digitalWrite高低電平而已。

效果就是這樣的:

這要是正兒八經的包裝下,再做它十七八個排成一堵牆應該也很壯觀吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章