首页 > 编程知识 正文

lwip(freertos)

时间:2023-05-05 17:19:30 阅读:76800 作者:1283

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 5extern 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); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。