SNMP Trap的session问题

2023-05-16

1、前言

最近遇到了个问题,SNMPv3 Trap上报,在snmp agent侧修改了用户密码,管理站mibbroswer上没有修改trap用户的密码,仍然可接收到trap上报消息。通过Wireshark抓包,(编辑–首选项–Protocols–SNMP–Users Table编辑填写Engine ID、Username、Authentication model、Password、Privacy protocol、Privacy password),可以在抓包的时候将SNMP包解析出来,发现使用旧密码可以解析,但是新密码却无法解析,说明上报的trap消息SNMP报文是用旧密码加密的。<–c语言开发发送trap–>分析trap消息组包过程,可以发现用户信息及加密密钥是填写在session中,说明在用户配置改变时,会清理掉之前session然后重新打开一个新session(在项目中的方式)的流程没有生效,也即是旧session没有关掉仍然在使用。

以上就是遇到问题的简单分析过程,记录此文主要是想梳理一下snmp agent trap上报的过程,是怎么把trap消息发送出去的,以及接收端如何解包接收。(查询了很多文档,算是一点归纳记录)

2、SNMPv3安全传输机制

相关博客:
SNMP开发过程中的一些积累:https://blog.csdn.net/yyw794/article/details/78091545
SNMPv3的加密和认证:https://www.lmlphp.com/user/57883/article/item/600007/

3、SNMP Trap发送

3.1、使用 snmptrap 发送 SNMP Trap

本部分内容为摘自其他博客,本人并没有亲自测试,主要目的是表达如何利用snmptrap发送和接收trap报文,大致知道原理即可,如果要用snmptrap来进行trap发收,可以在查查其他博客详细学习。

(1)一台机器接收trap
利用 Net-snmp 提供的 snmptrapd 应用程序作为后台 SNMP Trap 服务器,负责接收被管理设备发送过来的 Trap 消息。
命令行窗口中输入以下命令:

 snmptrapd – c mysnmptrad.conf udp:162

该命令启动了一个 snmptrapd 进程,守候在 UDP 端口 162上,侦听 SNMP Trap 消息。-c 命令行指定了名为 mysnmptrapd.conf 的配置文件。文件内容如下:

$cat mysnmptrapd.conf 
 traphandle default lognotify IBM-DW-SAMPLE::nodeDown 
 authCommunity log,execute,net public

其中,以 traphandle 开头的一行定义了 snmptrapd 进程接收到 Trap 消息后应该执行的动作。在本例中,lognotify 是一个 shell 脚本,功能是将接收到的 Trap 信息写入文件 checkfile。
以 authCommunity 开头的一行配置了 snmptrapd 的安全设置,表示可以接收 community 为”public”的 SNMP Trap,并且本进程可以有 log,net 和 execute 的权限。

Log 权限表明收到 Trap 之后 snmptrapd 可以记录日志;execute 表明收到 Trap 之后可以执行 traphandle 中所指定的操作。Net 表示 snmptrapd 可以将接收到的 Trap 信息转发到其他的 Receiver 去。(假如需要转发,还需要对给定的 OID 指定以 forward 为开始的处理细节:forward OID|default DESTINATION)

Lognotify 脚本

 $cat lognotify 
 #!/bin/sh 
 
 read host 
 read ip 
 vars= 
 
 while read oid val 
 do 
   if [ "$vars" = "" ] 
   then 
     vars="$oid = $val"
   else 
     vars="$vars, $oid = $val"
   fi 
 done 
 
 echo trap: $1 $host $ip $vars >checkfile

————————————————
原文链接:https://blog.csdn.net/LANGGUANGCHENG/article/details/88948727

(2)另一台机器发送trap
假定 Trap 定义在文件 sample-trap.mib 中,可以使用命令行:

snmptrap -m ./sample- trap.mib  -v 2c -c public 16.157.76.227:1622 \ 
"" IBM-DW-SAMPLE::nodeDown     IBM-DW-SAMPLE::nodeDown.1 s "M1"

定义了一个 Trap 消息:nodeDown

Trap nodeDown 的 MIB 定义:
 nodeDown NOTIFICATION-TYPE 
    STATUS          current 
    DESCRIPTION     "node down notification"
 ::= { notification 1 }

nodeDown 被定义为 Notification 类型,即 SNMPv2 类型的 Trap。NodeDown 对象位于 notification 节点下,子 OID 为 1。字母 s 表示该 OID 的类型为 string。“M1”为该 OID 变量的值。

打开文件 checkfile,应该能够看到如下信息:
Trap: IBM-DW-SAMPLE::nodeDown UDP: [16.157.76.221]:
54329->[16.157.76.227]:1622 DISMAN-EVENT-MIB::sysUpTimeInstance=
5:2:22:26.99, SNMPv2-MIB::snmpTrapOID.0 = SNMPv2-SMI::
enterprises.10234.100.1 SNMPv2-SMI::enterprises.10234.100.1.1 =
“M1”
表示已经能够用 snmptrap 发送 Trap;并且能够使用 snmptrapd 来接收 Trap 消息了。此例虽然简单,但却是 SNMP Trap 的典型应用。实际生产环境中的 SNMP Trap 应用的基本模型和本例是类似的。

snmptrapd使用类似博客:
SNMP Trap (V1,V2, V3)总结:https://blog.csdn.net/Java_Vicky/article/details/120518497

3.2、C语言 SNMP Trap开发

有时可能不仅需要 net-snmp 所提供的现成工具,还需要在自己开发的应用程序中编码发送 Trap。Net-snmp 不仅提供了现成的工具,也提供了开发库,下面看看如何在 C 程序中调用 net-snmp 的库函数进行 SNMP Trap 的开发。
一次trap消息上报大致的流程为: 包含必要的netsnmp库头文件、初始化(主要是session)、创建pdu(填充信息内容)、发送trap、结束清理。
Note:项目中遇到的bug,就在于trap发送线程作为订阅者,while一直等待观察者是否有消息需要上报,如果有就组包发送。trap发送线程会去检查snmpv3 trap用户配置(包括用户名、鉴权加密算法、密码、EngineID等)是否改变,如果有改变则需要关闭之前的session,新建session。正是这个过程没有使新session生效,才导致开头提到的问题出现。

3.2.1 头文件

C 语言直接调用 API 进行 SNMP Trap 处理,所需要的头文件为了使用 netsnmp 的 API,必须 include 以下这些头文件:

#include <net-snmp/net-snmp-config.h> 
#include <net-snmp/net-snmp-includes.h>

3.2.2 初始化

在使用 netsnmp 库之前,先要做一些必要的初始化工作。函数 init_snmp 初始化 SNMP Library。假如在调用 init_snmp 函数时指定了文件名,init_snmp 函数将读取配置文件,设置诸如 Access Control 等具体配置。否则会使用默认的 /etc 下面的配置文件。

– init_snmp(“snmpapp”);没有太理解初始化SNMP Library的实质是啥,反正snmp_close(session)没有解决清除旧session的问题,就使用了snmp_shutdown( “snmpapp” );关闭之前的初始化, 然后使用新session之前再重新init_snmp(“snmpapp”);。有时间再研究一下…
//对 snmp 协议栈进行初始化,init_snmp();

初始化 SNMP 库之后,就可以打开一个会话 session。此后所有和 NMS 的信息交互都在该 session 内进行,因为可能在同一台机器上运行多个 SNMP 进程,每个进程都需要自己独立的 session 来和 NMS 进行信息交互。

调用函数 snmp_sess_init 成功后将返回一个 session 数据结构。用该数据结构来设置 session 的属性,比如 peer 的 IP 信息。还可以设置其它的必要信息,比如 Community,即用于 SNMP 安全的社区设置,前面 snmptrapd 设置为 public,因此这里也设置为 public。这类似于通行密码,不过安全性的确比较弱。(snmpv3 初始化session过程,可参考另一篇博客:https://blog.csdn.net/chengwenyao18/article/details/7319732)
Session 属性设置好之后便可以使用函数 snmp_open 打开 session。示例代码如下:

init_snmp("myexample");
struct snmp_session session;
snmp_sess_init(&session);

session.version = SNMP_VERSION_2c;
strcpy(peername,"16.157.76.227:1622");
strcpy(commu,"public");
session.peername = peername;
session.community = (unsigned char*)commu;
session.community_len = strlen(commu);
ss = snmp_open(&session);

打开一个会话之后,程序可以通过该会话发送 Trap 给 NMS,也可以从 NMS 接受 SNMP get/set 操作。

3.2.3 创建pdu报文

每个 Trap 都由 PDU 承载,PDU 有固定的格式。 为了简化描述,本文只描述 SNMPv2 的 Trap 发送方法。SNMP v2c 和 v1 、v3的 Trap 有所不同。
SNMPv2 的 Trap PDU 定义如下:
在这里插入图片描述
详情见“TCP/IP详解 卷一 --------SNMP”:https://blog.csdn.net/yao_fairy/article/details/51325698

各个组成部分的解释如下: sysUpTime– 被管理设备上一次初始化网络到本 Trap 发送以来的累积时间。 snmpTrapOID– 表示本 PDU 是一个 Trap,有固定的值。对于一般的 Trap,RFC1907 给出了通用的定义。用户自定义的 Trap 通常是由以下几个部分连接而成:SNMPv1 Enterprise parameter + ‘0’ + SNMPv1 Specific trap code。 VarBindList– 变量列表,所谓变量就是 Trap 消息中所携带的信息单元。

//下面的代码片断用来填充如图三所示的一个 PDU。
  oid objid_sysuptime[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 }; 
  oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; 
  netsnmp_pdu * pdu = NULL; 
  oid tmpOID[MAX_OID_LEN]; 
  size_t tmpOID_len; 
  in_addr_t addr; 

  pdu = snmp_pdu_create(SNMP_MSG_TRAP2); 
  long sysuptime; 
  char tempbuf[128]; 
  memset(tempbuf,128,0); 
  sprintf(tempbuf,"%ld",sysuptime); 
  sysuptime = get_uptime(); 
  oid tmpOID[MAX_OID_LEN]; 
  size_t tmpOID_len; 
  tmpOID_len = MAX_OID_LEN; 
  if(!snmp_parse_oid(TRAP_NAME_1, tmpOID, &tmpOID_len)) 
 snmp_error(“snmp_parse_oid”); 
  snmp_add_var(pdu, objid_sysuptime, sizeof(objid_sysuptime)/sizeof(oid), 't', tempbuf); 
  snmp_add_var(pdu, objid_snmptrap, sizeof(objid_snmptrap)/sizeof(oid),'o', 
               “IBM-DW-SAMPLE::nodeDown”);

首先调用函数 snmp_pdu_create 创建一个 SNMPv2 的 Trap PDU。然后调用 snmp_add_var 向该 PDU 中添加图三所示的三个部分。 sysUpTime 在 SNMPv2-MIB 中定义,其 OID 为”1.3.6.1.2.1.1.3.0”。我们只需要通过 get_uptime() 函数获得该值,然后调用 snmp_add_var 将该变量加入刚才创建的 PDU 中。

同理,snmpTrapOID 也是固定的 :” 1.3.6.1.6.3.1.1.4.1.0”。同样利用 snmp_add_var 函数将我们定义的 OID 为“IBM-DW-SAMPLE::nodeDown”的 Trap 加入该 PDU。稍稍留意一下,您应该可以发现,sysUpTime 的类型为’t’,即 timestamp;而 snmpTrapOID 的类型为’ o ’,即 OID 类型。PDU 内的每一个元素都拥有自己的类型。在该 Trap 中,我们还打算携带两个变量:IBM-DW-SAMPLE::host 和 IBM-DW-SAMPLE::ip。表示一些真正有趣的信息。添加这两个变量的代码如下所示:

HP-DW-SAMPLE::ip",varId,&varIdLen)) 
    { 
      snmp_perror("ip"); 
    } 
    else 
    { 
       printf("Success snmp_parse_oid\n"); 
       snmp_add_var(pdu, varId, sizeof(varId)/sizeof(oid),'s',"2.2.2.2"); 
    } 
    if(!snmp_parse_oid("HP-DW-SAMPLE::host",varId,&varIdLen)) 
    { 
      snmp_perror("host"); 
    } 
    else 
    { 
       retv =  snmp_add_var(pdu, varId, sizeof(varId)/sizeof(oid),'s',”M1”); 
 }

用 snmp_parse_oid 解析相应变量的 OID,然后就可以调用 snmp_add_var 将您想设置的值加入 PDU 中了。假如您直接在代码中使用”HP-DW-SAMPLE::ip”的 OID,(即 1.3.6.1.4.1.10234.10.2),那么可以不需要调用 snmp_parse_oid。该函数只是把一个好记的字符串翻译为一串数字的 OID。不过这就好比用 16.157.1.2 而不使用 www.ibm.com 一样。

3.2.4 发送Trap

至此,一个 SNMP Trap PDU 就创建成功了。将该 PDU 发送出去即可:

  if( !snmp_send(session, pdu) ) 
  { 
    snmp_error("Send pdu error \n"); 
  }

3.2.5 结束清理

程序结束之前需要做清理工作,代码如下:
snmp_close(sptr);
snmp_shutdown( “myexample” );
SOCK_CLEANUP;

3.2.6 小结

利用netsnmp开发,就是调用snmp api库函数实现即可,参照标准的流程,可实现set、get、trap等开发。没有仔细梳理,把看过有用的都记录下来了,反正核心思想就是 参考流程 一步步开发就是了,类似于建立 socket 发送数据道理一样。有时间再仔细整理一下…

流程:https://www.cnblogs.com/YBhello/articles/5465507.html
SNMPv3 Get报文构建可参考:https://blog.csdn.net/chengwenyao18/article/details/7319732
net-snmp配置开发:https://dandelioncloud.cn/article/details/1572239455459438593
net-snmp简单例子:https://blog.csdn.net/wangcg123/article/details/52949285

介绍头文件#include<net-snmp-includes.h>库函数:https://www.cnblogs.com/cqx6388/p/17306491.html

其他使用netsnmp库开发的博客:
Qt 使用 net-snmp 包的过程记录:https://www.cnblogs.com/pied/p/7501248.html
snmp学习笔记:https://www.cnblogs.com/beautifullife4e/p/4760361.html
学习笔记 trap部分:https://blog.csdn.net/weixin_39897267/article/details/115988004
snmptrap动作学习:
与snmpget动作相差无几,只不过调用函数时参数不同。参考:net-snmp-5.5/apps/snmptrap.c
只需要将open_session换为snmp_add和netsnmp_transport_open_client即可。

netsnmp_session *snmp_add(netsnmp_session *, struct netsnmp_transport_s *, int (*fpre_parse) (netsnmp_session *, struct netsnmp_transport_s*, void *, int), int (*fpost_parse) (netsnmp_session *,netsnmp_pdu *, int));

将一些设置添加到session中,

netsnmp_transport* netsnmp_transport_open_client(const char* application, const char* str);

打开trap的客户端,产生netsnmp_transport结构体用于trap。
void snmp_shutdown(const char *type);
关闭应用程序,保存任何需要持久性存储,并进行适当的清理。参数:config文件中的"type"使用的类型标签

snmptarp和snmptarpd的基本流程为:
1.初始化session(snmp_sess_init)
2.打开session(snmp_open)
3.打开trap客户端或者服务端(netsnmp_transport_open_client or netsnmp_transport_open_server)
4.客户端发送trap pdu。服务端等待接收trap
5.关闭应用程序(snmp_shutdown)

Trap报文解析:https://javaforall.cn/171446.html

SNMPv2原始报文内容:
00 23 5a 9e 58b9 00 4c 41 49 50 55 08 00 45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a01 c0 a8 0a05 0c01 00 a2 0067 04 bb 305d 02 01 01 04 06 70 75 62 6c 69 63a7 50 02 04 1773 2c fb 02 01 00 02 01 00 30 42 30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 30 17 060a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 0603 01 01 05 01 3018 06 0a2b 06 01 06 03 01 01 04 0300 06 0a2b 06 01 04 01 bf 08 03 02 0a

目的MAC:00 23 5a 9e 58 b9
源MAC:00 4c 41 49 50 55
协议类型:08 00,IP报文
IP头:45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a80a 01 c0 a80a 05
UDP头:0c01 00 a2 00 67 04 bb
余下部分全为SNMP报文内容,这里我们做一下简单的约定:
xx 标注类型;xx 标注长度;xx 标注真正的数据。
这样一来上面这串原始数据就好分析多了J
n  30 5d 整个SNMP报文的编码方式为30,即SEQUENCE类型,报文长度93(0x5d)字节;
n  02 01 01 版本号01即v2版本;
n  04 06 70 75 62 6c 69 63 团体名70 75 62 6c69 63  即英文的“public”;
n  a7 50 a7表示trap类型为7,即厂商自定义trap;50表示PDU区段占80(0x50)字节;
n  02 04 17 73 2c fb 请求ID为17 73 2c fb 十进制的393424123;
n  02 01 00 错误状态0;
n  02 01 00 错误索引0;
n  30 42 “变量名-值”对编码类型30 即SEQUENCE类型;“变量名-值”所占总字节0x42,即66字节;
n  30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 第一个“名-值”对区段编码方式30 即SEQUENCE类型;第一个“名-值”对总长度0x0d13字节;第一个变量名的编码类型0x06,时间标签;第一个变量名占0x08个字节;第一个变量名2b 06 01 02 01 01 03 00,为1.3.6.1.2.1.1.3.0;第一个变量值为0x0e,即14;
n  30 17 06 0a2b 06 01 06 03 01 01 04 0100 06 09 2b 06 01 06 03 01 01 05 01 第二个“名-值”对;变量名1.3.6.1.6.3.1.1.4.1.0;变量值1.3.6.1.6.3.1.1.5.1;
n  30 18 06 0a2b 06 01 06 03 01 01 04 0300 06 0a2b 06 01 04 01 bf 08 03 02 0a 第三个“名-值”对;变量名1.3.6.1.6.3.1.1.4.3.0;变量值1.3.6.1.4.1.8072.3.2.10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SNMP Trap的session问题 的相关文章

  • Java:如何创建 HTTP 浏览会话

    我正在尝试创建一个向服务器发送一些 POST 请求的 Java 应用程序 第一个请求是带有身份验证信息的请求 然后 当我发送下一个请求时 我得到的答案是我的会话已过期 但我在同一秒内发送下一个请求 所以它不能超时 所以我猜想 Java 中有
  • PHP mail() 中的空 $_POST

    对于以下方面的一些帮助将不胜感激 我已经在网络和 stackoverflow 上搜索了几个小时 我的php邮件功能有这个问题 我的网站上有一个表单 该网站使用 WordPress 其中包含两个文本字段 姓名和电话号码 表单中还有一个隐藏字段
  • Session_End 上的 asp.net 会话变量

    我需要访问 global asax cs 中 Session End 事件上的会话变量 但 HttpContext Current 为空 因此所有会话变量都不可访问 a 我可以以不同的方式访问用户会话 或者 b 在 Session End
  • 扩展 ASP.NET 应用程序

    这是一个非常广泛的问题 但希望我能得到有用的提示 目前我有一个在单个服务器上运行的 ASP NET 应用程序 我现在需要进行扩展以适应不断增加的客户负载 所以我的计划是 1 将 ASP NET 和 Web 组件扩展到五台服务器上 2 将数据
  • 为什么 ColdFusion SESSION 变量在前几行被引用后会“未定义”?

    在 Windows2003 IIS6 上运行 ColdFusion 8 01 Standard 应用程序 cfc
  • CakePHP 总是让我退出

    最近我制作了三个蛋糕应用程序 这三个应用程序都有这个问题 配置大部分是库存的 我使用它作为会话选项 Configure write Session array defaults gt php cookie gt test 经过大量谷歌搜索后
  • 函数 session_start() 出现问题(运行缓​​慢)

    我有一个问题session start 在主服务器上 当我第一次加载页面时 完成请求只需要不到 1 秒的时间 如果我等待大约 12 15 秒 然后重新加载页面 加载时间将是相同的 但是 当我尝试在初始加载后 3 或 5 秒后刷新页面时 服务
  • 无法登录 Magento 管理员

    我在登录我们的一个临时站点上的 Magento 管理面板时遇到问题 它在我们的 webdev 服务器上 100 工作 不久前在临时服务器上也工作得很好 我做了一些研究 大多数人认为这与在本地主机上运行 Magento 以及浏览器不为域名中没
  • Symfony2:检查会话是否存在

    有没有办法检查会话是否存在 我尝试过这种方法 但它总是给我一个 太棒了 回答 session this gt getRequest gt hasPreviousSession if session return new Response B
  • 使用Rvest登录网站抓取时出现403错误

    我试图在需要登录的网站上抓取页面 但不断收到 403 错误 我已经修改了我网站的这两篇文章中的代码 使用rvest或httr登录网页上的非标准表单 https stackoverflow com questions 28418770 usi
  • 在sqlalchemy中跨不同模块访问相同的db.session

    我对 sqlalchemy 非常陌生 正在尝试找出如何让事情变得更干净和连接 我创建了一个 model base py 文档 在其中创建了一个会话并在表中建立了所有实体 以及关系等 我想创建另一个模块 在其中对 base py 中的实体 表
  • 如何检查 servlet 中的 sessionId 是否有效 (java)

    我在我的 Web 应用程序中维护 sessionid 和 HttpSession 对象的映射 我使用 HttpSessionListener 从地图中填充或删除会话 当我的网络服务器崩溃 宕机并恢复时 我需要一种方法来检查提交的 sessi
  • 使用 google app-engine 跨浏览器/服务器重新启动会话持久性

    如何使会话在浏览器 服务器重新启动后持续存在 我正在使用谷歌应用程序引擎 每次重新启动浏览器和 或服务器时 我都会得到一个新的会话 ID String jSessionId this getThreadLocalRequest getSes
  • 数组中的唯一条目

    我有以下内容将前 10 个 URL 存储到会话中 function curPageURL pageURL http if SERVER HTTPS on pageURL s pageURL if SERVER SERVER PORT 80
  • 将 cookie 设置为在会话结束时过期? ASP.NET

    我很惊讶我找不到任何答案 如何将 cookie 中的 sessionid 设置为在会话结束时过期 当浏览器关闭或用户一段时间不活动时 我发现的两个解决方案是 httpcookie Expires HttpContext Current Se
  • Flask 会话不持久(Postman 有效,Javascript 无效)

    我正在开发一个 Flask 服务器 用于通过网络在一些后端 Python 功能和 Javascript 客户端之间进行通信 我正在尝试利用 Flask 的session变量来存储用户在与应用程序交互过程中的特定数据 我已经删除了下面大部分应
  • 如何在 Express 4.0 中发送 Flash 消息?

    因此 我的 Web 应用程序需要身份验证 并且我有一个注册页面 如果用户尝试使用数据库中已有的电子邮件进行注册 我想向他们显示一条错误消息 我正在尝试在 html 端使用此代码来执行此操作 div class alert alert dan
  • 如何检查 Rails 中的会话大小?

    我希望session size session length or session count工作 但它们都返回 未定义的方法 为什么 不是session a hash 那是好奇心 实际问题 有没有办法检查会话大小 以 KB 为单位 目前我
  • 优雅地终止 WCF 服务 - 完成所有打开的会话并限制新会话

    我有一个我编写的 WCF 服务 它托管在 Windows 服务中 它以 PerSession 模式运行 该服务允许客户端通过该服务远程打开文件 更改文件以及关闭文件 到目前为止一切工作都非常顺利 当 Windows 服务停止时 我希望能够让
  • 对过期会话进行休息调用:HTTP 401 响应导致浏览器显示登录窗口

    我编写了一个 HTML 5 应用程序 它使用 AngularJS 并与在 Tomcat 上运行的 Java REST 后端进行交互 我使用 Spring Security 来处理登录和安全性 当用户进入网站时 他将被转发到登录页面 该页面创

随机推荐

  • 全网最全的 LeetCode 国人大神刷题指南,全部 Go 语言实现

    大家好 xff0c 我是欧盆索思 xff08 opensource xff09 xff0c 每天为你带来优秀的开源项目 xff01 说到 LeetCode xff0c 作为一个程序员来说 xff0c 应该不陌生 xff0c 近几年参加面试都
  • ROS实现串口通信

    虚拟串口的搭建 参考Linux下添加虚拟串口 xff0c 接收和发送数据 com py文件代码如下 xff1a span class token comment usr bin env python span span class toke
  • 基于Linux的UART驱动框架源码分析笔记

    文章目录 前言一 I MX6ULL串口接收和发送方式1 非DMA方式1 1 接收方式1 2 发送方式 2 DMA方式2 1 接收方式2 2 发送方式 二 UART驱动注册1 uart register driver 函数解析2 serial
  • cmake install 命令

    install指令用于定义安装规则 xff0c 安装的内容可以包括目标二进制 动态库 静态库以及文件 目录 脚本等 需要引入一个新的cmake指令和一个非常有用的变量 cmake install prefix 法一 xff1a cmake
  • 基于全景相机的视觉里程计算法研究

    一 视觉里程计 视觉里程计技术首先建立相机的成像模型 xff0c 接着通过标定算法计算相机参数 xff0c 最后建立相邻图像的关联并估计相机运动轨迹 1 1相机在空间中运动的描述 描述相机在三维空间中的运动状态 xff0c 即求解相机在空间
  • 多旋翼无人机组成(小白上路)

    1 无人机组成 1 1 机架 四旋翼最常见的两种机身布局如下图 xff1a 机架指无人机的承载平台 xff0c 通常用轴距衡量机架的大小 xff0c 轴距是指对角线两个螺旋桨的距离 xff0c 一般以mm为单位 xff0c 如F330表示轴
  • freertos创建任务后进入prvStartFirstTask发生HardFault_Handler中断

    在stm32f103zet6环境中移植成功freertos之后 xff0c 创建第一个任务之后 xff0c 会进入硬件中断 xff0c 经过排查发现死在了prvStartFirstTask 排查原因 xff1a 发现是启动文件startup
  • 解决无法对docker容器进行端口映射的问题

    初学docker的时候 xff0c 不知道为啥 xff0c 按着教程里打的代码 xff0c 最后却出现了映射失败的情况 即 xff1a 在docker内部设置的映射端口 xff0c 外部却没有办法访问 想了想 xff0c 不外乎两个原因 x
  • K8s手工创建kubeconfig

    我们通过 kubectl 命令行连接 k8s apiserver 时需要依赖 kubeconfig 文件 kubeconfig 文件通常包含了 context xff08 上下文 xff09 列表 xff0c 每个 context 又会引用
  • grep命令总结

    grep命令总结 1 关于 nbsp ps ef grep php grep v grep wc l grep v grep 代表在查询的最终结果中去掉grep命令本身 wc l 标示统计查询到的结果数量 grep常用命令 1 grep n
  • Ubuntu 16.04安装realsense D435i SDK以及realsense-ros

    先直接上一个报错信息 xff0c 折腾了半天才解决 在使用catkin make编译realsense ros时 xff0c 报错 traversing 4 packages in topological order realsense c
  • 关于视觉SLAM的一些常识(纯小白学习笔记)

    本文只是小白对于视觉slam的一个非常泛的介绍 xff0c 对于视觉slam中的数学运算均没有提及 xff0c 适合于对没有接触过视觉slam的新人进行一个简单的科普 作者即小白 xff0c 文章如有错误 xff0c 非常非常非常欢迎指正
  • 使用CubeMX快速搭建FREERTOS

    如何使用STM32快速搭建FREERTOS 小编之前一直使用正点原子家的产品 xff0c 最近准备学习学习TOUCHGFX 要用到HAL 43 RTOS 原子家的使用起来不方便 于是琢磨着使用STM32CUBEMX直接生成FREERTOS
  • 使用DMA+SPI驱动Aliyun Things 上的ST7789H2 LCD屏幕

    目录 前言硬件CUBEMX时钟树GPIOSPI 代码部分LCD驱动中断服务函数测试代码现象 前言 1 xff1a 驱动程序参考自https blog csdn net BearPi article details 104311705 2 x
  • SLAM测试5-YGZ-Stereo-Inertial(GAAS双目视觉ygz -立体惯性SLAM)

    这篇主要测试GAAS开源无人机里用到的一种SLAM算法 xff0c 目的是先对该SLAM算法进行熟悉 xff0c 再开始入手GAAS视觉定位 GIThub上的代码地址为 xff1a https github com gaoxiang12 y
  • Linux之线程条件变量cond

    概念 xff1a 条件变量不是锁 xff0c 要和互斥量组合使用 条件变量就是生产者 生产 完成 xff0c 消费者才能 使用 xff0c 如果没有 产品 xff0c 消费者就会被条件变量cond阻塞等待生产者 生产 xff08 生产者与消
  • Linux之线程-信号量sem_*

    1 概念 信号量可理解为进化版的互斥锁 量 xff0c 允许多个线程访问共享资源 由于互斥锁的力度比较大 xff0c 如果希望在多个线程间对某一对象的部分数据进行共享 xff0c 使用互斥锁是没有办法实现的 xff0c 只能将整个数据对象锁
  • 4、树(中篇)

    前言 前节二叉树只能适用于静态查找 不能实现动态插入 删除等 如何解决以下两个问题 静态查找与动态查找 针对动态查找 数据如何组织 4 1 二叉搜索树 4 1 1 什么是二叉搜索树 二叉搜索树 BST Binary Search Tree
  • SNMP源码分析

    源码下载 http www net snmp org download html 源码目录结构 net snmp程序逻辑 xff08 1 xff09 main主函数 span class token macro property span
  • SNMP Trap的session问题

    1 前言 最近遇到了个问题 xff0c SNMPv3 Trap上报 xff0c 在snmp agent侧修改了用户密码 xff0c 管理站mibbroswer上没有修改trap用户的密码 xff0c 仍然可接收到trap上报消息 通过Wir