2015/03/25

Arduino SNMP溫度監控: 自訂SNMP oid

我的SNMP也是一知半解,
只知道每個訊息都需要一組oid,
類似身分證這樣唯一的識別碼;
這篇文章有詳細的說明  簡單網絡管理協議 (SNMP)

了解oid

在AgentPlus.ino的32~44行就是該訊息的oid,
這幾項的資訊都是標準格式,oid都是以1.3.6.1.2.1起頭
如果要傳自定義的資料,需要使用1.3.6.1.4.1的Private

Agentuino作者已經在49行留了arduino的oid
  .iso.org.dod.internet.private.enterprises.arduino (.1.3.6.1.4.1.36582)

這次我會使用 1.3.6.1.4.1.36582.X.Y
X: 代表Arduino的Analog Pin(A2~A5, A0~A1因為Ethernet Shield要控制SD卡不能用)
Y: 多工器的訊號來源

EX:
1.3.6.1.4.1.36582.2.0  => A2 的 MUX 0
1.3.6.1.4.1.36582.3.7  => A3 的 MUX 7
當然要怎麼編排可以自己決定,改程式就好。

在程式中只要判斷傳來的oid是不是前面18個字是"1.3.6.1.4.1.36582."
是的話在取得後方的X.Y做分析就可以知道要取得哪個溫度值

pduReceived()

這是主要處理SNMP的回應函式,如果有收到SNMP封包就會執行這個函式。
在212行多增加一個if判斷式,可以執行自己的程式碼
將原本的199~212行的程式碼由原本的
...
} else if ( strcmp_P(oid, sysServices) == 0 ) {

   ...

} else {

...

改成
...
} else if ( strcmp_P(oid, sysServices) == 0 ) {
   ...
} else if ( strncmp_P(oid, sysTempPrefix, locTempPrefix) == 0 ) {
   //code here 
} else {
...


其中 sysTempPrefix, locTempPrefix 請在變數宣告區新增
const static char sysTempPrefix[] PROGMEM   = "1.3.6.1.4.1.36582.";
static int32_t locTempPrefix          = 18;



之後程式碼會寫在這個區塊內,可以先加入
  Serial.println(oid);
來測試有沒有正確,正確的話終端機就會印出oid
請取消 setup() 第一行 Serial.begin(9600); 的注解

下圖是部分的程式碼截圖

(Serial後四行是回傳一個整數)


測試結果


下一篇 處理分析oid

[Source Code]
https://github.com/Aspertw/ArduinoSNMPTemp/blob/master/SnmpCustomOid.ino

沒有留言:

張貼留言