freertos 基于lwip实现的snmp协议

1、snmp 应用层网络管理协议
2、基于udp实现
3、snmp协议主要功能包括
服务端发送get 读请求节点的udp数据包
客服端设备主动进行trap上报数据
4、下图是PC机作为服务端发送get请求命令,
请求命令格式如下图:
在这里插入图片描述

5、设备节点主动trap上报报警信息实现代码

#include "trap.h"
#include "delay.h"
#include "sensor.h"
#include "FreeRTOS.h"
#include "semphr.h"
#include "snmp.h"
#include "tcpip.h"
#include "minIni.h"

#include "dm9000.h"

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "camera.h"
#include "adc.h"
#include "rtc.h"

#include "lwip_comm.h"


#define NUM_PRIVATE_TRAP_LIST    5
extern struct snmp_msg_trap trap_msg;


struct trap_list trap_list_bank[NUM_PRIVATE_TRAP_LIST];
extern void vSendTrapCallback2( void * parameters );
struct trap_list * getNextFreePrivateTrapList();
extern void freePrivateTrapList(struct trap_list * list);





void trap_task(void * pvParameters)
{
	portTickType xLastWakeTime;
	static unsigned char trap_flag=1;
	u8_t snmpauthentraps_set= 2;
	static ip_addr_t trap_addr;
	char msg_vol[5],msg_cur[5];
	
	
  struct snmp_obj_id objid = {10, {1,3,6,1,4,1,1,1,1}};
	
	//struct snmp_obj_id objid[22];	
//	struct snmp_obj_id objid_vol = {10, {1,3,6,1,4,1,1,1,1}};	
//	struct snmp_obj_id objid_cur = {10, {1,3,6,1,4,1,1,1,2}};
//	struct snmp_obj_id objid_tem = {10, {1,3,6,1,4,1,1,1,3}};	
//	struct snmp_obj_id objid_hum = {10, {1,3,6,1,4,1,1,1,4}};
//	struct snmp_obj_id objid_water = {10, {1,3,6,1,4,1,1,1,5}};	
//	struct snmp_obj_id objid_door = {10, {1,3,6,1,4,1,1,1,6}};	
//	struct snmp_obj_id objid_sys12= {10, {1,3,6,1,4,1,1,1,7}};
//	struct snmp_obj_id objid_bak12 = {10, {1,3,6,1,4,1,1,1,8}};	
//	struct snmp_obj_id objid_ups= {10, {1,3,6,1,4,1,1,1,9}};
//	struct snmp_obj_id objid_ac24 = {10, {1,3,6,1,4,1,1,1,10}};	
//	struct snmp_obj_id objid_ac1= {10, {1,3,6,1,4,1,1,1,11}};
//	struct snmp_obj_id objid_ac2 = {10, {1,3,6,1,4,1,1,1,12}};	
//	struct snmp_obj_id objid_ac3= {10, {1,3,6,1,4,1,1,1,13}};	
//	
//	struct snmp_obj_id objid_fan= {10, {1,3,6,1,4,1,1,1,14}};
//	struct snmp_obj_id objid_alarm = {10, {1,3,6,1,4,1,1,1,15}};	
//	struct snmp_obj_id objid_light= {10, {1,3,6,1,4,1,1,1,16}};	
//	  
//	struct snmp_obj_id objid_heat= {10, {1,3,6,1,4,1,1,1,17}};
//	struct snmp_obj_id objid_dc1= {10, {1,3,6,1,4,1,1,1,18}};
//	struct snmp_obj_id objid_dc2 = {10, {1,3,6,1,4,1,1,1,19}};	
//	struct snmp_obj_id objid_dc3= {10, {1,3,6,1,4,1,1,1,20}};
//  struct snmp_obj_id objid_dc4= {10, {1,3,6,1,4,1,1,1,21}};


	struct snmp_varbind *vb;
	struct trap_list *vb_list;

	(void) pvParameters;
	
		
	
//	trap_addr.addr=((u32_t)((lwipdev.snmpip[3]) & 0xff) << 24) | \
//											 ((u32_t)((lwipdev.snmpip[2]) & 0xff) << 16) | \
//											 ((u32_t)((lwipdev.snmpip[1]) & 0xff) << 8)  | \
//												(u32_t)((lwipdev.snmpip[0]) & 0xff);

	trap_addr.addr=((u32_t)((210) & 0xff) << 24) | \
											 ((u32_t)((0) & 0xff) << 16) | \
											 ((u32_t)((168) & 0xff) << 8)  | \
												(u32_t)((192) & 0xff);
	snmp_trap_dst_ip_set(0,&trap_addr);
	snmp_trap_dst_enable(0,trap_flag);
	snmp_set_snmpenableauthentraps(&snmpauthentraps_set);
	

  
	for ( ;; )
	{		 
    xLastWakeTime = xTaskGetTickCount();		
		vb_list = getNextFreePrivateTrapList();
		
		vb_list->spc_trap = 12;
		
    changed_trap(&objid,SYS12_STAT);
		
//    if(sys12_stat_changed) 	
//	  {
//	   sys12_stat_changed=0;
//	   objid[6]=objid_sys12;
//		 changed_trap(&objid[6],SYS12_STAT);
//	  }
//		if(bak12_stat_changed)
//		{
//		 bak12_stat_changed=0;
//	   objid[7]=objid_bak12;
//		 changed_trap(&objid[6],BAK12_STAT);		
//		}			
//    if(ups_stat_changed)
//		{
//		 ups_stat_changed=0;
//	   objid[8]=objid_ups;
//		 changed_trap(&objid[8],UPS_STAT);	
//		}		
//    if(ac24_stat_changed)
//		{
//		 ac24_stat_changed=0;
//	   objid[9]=objid_ac24;
//		 changed_trap(&objid_ac24,AC24_STAT);	
//		}				
				
	
		// Wait for the next cycle.
		vTaskDelayUntil( &xLastWakeTime, 1000);
	}   
}

/*
 * 函数名:struct trap_list * getNextFreePrivateTrapList()
 * 描述  :发送还没发送的trap  并标记已发送
 * 输入  :无
 * 输出  :无	
 */
struct trap_list * getNextFreePrivateTrapList()
{
	u8_t index;
	struct trap_list * result = NULL;   
	for(index = 0; index < NUM_PRIVATE_TRAP_LIST; index++)
	{
		if(!trap_list_bank[index].in_use)
		{
			 trap_list_bank[index].in_use = 1;
			 result = &trap_list_bank[index];         
			 break;
		}
	}   
	return result;  
}

/*
 * 函数名:void vSendTrapCallback2( void * parameters )
 * 描述  :trap上报回调函数
 * 输入  :无
 * 输出  :无	
 */
void vSendTrapCallback2( void * parameters )
{
	struct trap_list * param;
	if( parameters != NULL )
	{
		param = (struct trap_list *) parameters;
		
		trap_msg.outvb = param->vb_root;
		
		snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC,
									 param->ent_oid,
									 param->spc_trap);
									 
		freePrivateTrapList(param);
	} 
}

/*
 * 函数名:void freePrivateTrapList(struct trap_list * list)
 * 描述  :trap上报完释放内存
 * 输入  :无
 * 输出  :无	
 */
void freePrivateTrapList(struct trap_list * list)
{
	snmp_varbind_list_free(&list->vb_root);
	list->ent_oid = NULL;
	list->spc_trap = 0;
	list->in_use = 0;
}







/*
 * 函数名:void changed_trap(struct snmp_obj_id *objid,float VOL)
 * 描述  :指定节点  上报对应的  状态量
 * 输入  :无
 * 输出  :无	
 */
void changed_trap(struct snmp_obj_id *objid,u8 data)
{
	char msg[5];
	static u8 msglen;
	struct trap_list *vb_list;
	struct snmp_varbind *vb;
	vb_list->ent_oid =objid;
	sprintf(msg, "%d", data);
	msglen=strlen(msg);
	vb = snmp_varbind_alloc(objid, 4, msglen);
	if (vb!= NULL)
	{
	 msglen=strlen(msg);
	 memcpy (vb->value, &msg, msglen);         
	 snmp_varbind_tail_add(&vb_list->vb_root,vb);
	} 					
	tcpip_callback(vSendTrapCallback2, vb_list);  
}










评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

echo-niuben

你的鼓励是我创作的巨大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值