NetSnmp初步(三):接收控制命令:實現SNMP的SET命令


主要是接收並處理snmp客戶端發送控制命令:啟動/停止單個節目的錄制。也就是實現snmp的SET命令。

1.還是從MIB開始。
由於只是一個簡單的起停命令,前面定義的recordStatusTable中的Status字段完全滿足要求,我們只需要給它設置一個不同的值就可以了。
之前在文件"/usr/local/share/snmp/mibs/FIGURE-IT-MIB.txt"中給它定義的訪問屬性是:“read-only”,將它改成“read-write”就OK了。

2.生成代碼,與之前完全相同,就不多說了。

3.由於包含有“read-write”屬性的IOD,生成的代碼就多了些處理動作。我們在處理函數recordStatusTable_handler()的“case MODE_SET_ACTION”如下實現:

 1 for (request = requests; request; request = request->next)
2 {
3 table_entry = (struct recordStatusTable_entry *)netsnmp_extract_iterator_context(request);
4 table_info = netsnmp_extract_table_info(request);
5 switch (table_info->colnum)
6 {
7 case COLUMN_STATUS:
8 memcpy(table_entry->old_Status,
9 table_entry->Status,
10 sizeof (table_entry->Status));
11 table_entry->old_Status_len =
12 table_entry->Status_len;
13 memset(table_entry->Status, 0,
14 sizeof (table_entry->Status));
15 memcpy(table_entry->Status,
16 request->requestvb->val.string,
17 request->requestvb->val_len);
18 table_entry->Status_len =
19 request->requestvb->val_len;
20
21 //在此響應設置命令
22 LOG(LOG_TYPE_NOTICE, "RECV SNMP CMD[SET]: rule[%ld]:%s\n", table_entry->Index, table_entry->Status);
23 if (g_pRecordCfg != NULL)
24 {
25 if(strcasecmp(table_entry->Status, "stop") == 0)
26 {
27 g_pRecordCfg->StartChannel(table_entry->Index);
28 }
29 else if(strcasecmp(table_entry->Status, "start") == 0)
30 {
31 g_pRecordCfg->StopChannel(table_entry->Index);
32 }
33 }
34 break;
35 }
36 }
37 break;

 

4.修改配置文件,/usr/local/share/snmp/Record.conf,確保里面類似有如下一行:

rwcommunity public

這個“public”可以定義成自己想要的其他名稱,但一定要是rwcommunity,表示賦予讀寫權限。

更多的,參見FAQ的“How do I configure access control?”

5.編譯程序,使用snmpset發送測試命令:
snmpset -v 1 -c public localhost FIGURE-IT-MIB::recordStatusTable.recordStatusEntry.Status.3 s stop
簡單解釋一下,-v 1:表示使用snmp v1命令
-c public localhost :表示"public"就是上面定義的名稱。
FIGURE-IT-MIB::recordStatusTable.recordStatusEntry.Status 就是OID
3:表示設置index=3的行中的Status列
s:要設置值的類型
stop:就是具體的值了。

可以看到程序輸出:

2012-03-30 14:32:26,826: NOTICE : RECV SNMP CMD[SET]: rule[3]:stop

說明就Ok了。

6.snmp到此告一段落了。一點體會:snmp雖然叫簡單網管協議,可協議本身真的不簡單! 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM