1. var assert = require('assert');
  2.  
  3. var ASN1 = {
  4. EOC: 0,
  5. Boolean: 1,
  6. Integer: 2,
  7. BitString: 3,
  8. OctetString: 4,
  9. Null: 5,
  10. OID: 6,
  11. ObjectDescriptor: 7,
  12. External: 8,
  13. Real: 9, // float
  14. Enumeration: 10,
  15. PDV: 11,
  16. Utf8String: 12,
  17. RelativeOID: 13,
  18. Sequence: 16,
  19. Set: 17,
  20. NumericString: 18,
  21. PrintableString: 19,
  22. T61String: 20,
  23. VideotexString: 21,
  24. IA5String: 22,
  25. UTCTime: 23,
  26. GeneralizedTime: 24,
  27. GraphicString: 25,
  28. VisibleString: 26,
  29. GeneralString: 28,
  30. UniversalString: 29,
  31. CharacterString: 30,
  32. BMPString: 31,
  33. Constructor: 32,
  34. Context: 128,
  35.  
  36. TypeError: function(msg) {
  37. var e = new Error();
  38. e.name = 'InvalidAsn1Error';
  39. e.message = msg || '';
  40. return e;
  41. }
  42. };
  43.  
  44. function Reader(data) {
  45. if (!data || !Buffer.isBuffer(data))
  46. throw new TypeError('data must be a node Buffer');
  47.  
  48. this._buf = data;
  49. this._size = data.length;
  50.  
  51. // These hold the "current" state
  52. this._len = 0;
  53. this._offset = 0;
  54.  
  55. var self = this;
  56. this.__defineGetter__('length', function() { return self._len; });
  57. this.__defineGetter__('offset', function() { return self._offset; });
  58. this.__defineGetter__('remain', function() {
  59. return self._size - self._offset;
  60. });
  61. this.__defineGetter__('buffer', function() {
  62. return self._buf.slice(self._offset);
  63. });
  64. }
  65.  
  66. /**
  67. * Reads a single byte and advances offset; you can pass in `true` to make this
  68. * a "peek" operation (i.e., get the byte, but don't advance the offset).
  69. *
  70. * @param {Boolean} peek true means don't move offset.
  71. * @return {Number} the next byte, null if not enough data.
  72. */
  73. Reader.prototype.readByte = function(peek) {
  74. if (this._size - this._offset < 1)
  75. return null;
  76.  
  77. var b = this._buf[this._offset] & 0xff;
  78.  
  79. if (!peek)
  80. this._offset += 1;
  81.  
  82. return b;
  83. };
  84.  
  85. Reader.prototype.peek = function() {
  86. return this.readByte(true);
  87. };
  88.  
  89. /**
  90. * Reads a (potentially) variable length off the BER buffer. This call is
  91. * not really meant to be called directly, as callers have to manipulate
  92. * the internal buffer afterwards.
  93. *
  94. * As a result of this call, you can call `Reader.length`, until the
  95. * next thing called that does a readLength.
  96. *
  97. * @return {Number} the amount of offset to advance the buffer.
  98. * @throws {InvalidAsn1Error} on bad ASN.1
  99. */
  100. Reader.prototype.readLength = function(offset) {
  101. if (offset === undefined)
  102. offset = this._offset;
  103.  
  104. if (offset >= this._size)
  105. return null;
  106.  
  107. var lenB = this._buf[offset++] & 0xff;
  108. if (lenB === null)
  109. return null;
  110.  
  111. if ((lenB & 0x80) == 0x80) {
  112. lenB &= 0x7f;
  113.  
  114. if (lenB == 0)
  115. throw ASN1.TypeError('Indefinite length not supported');
  116.  
  117. if (lenB > 4)
  118. throw ASN1.TypeError('encoding too long');
  119.  
  120. if (this._size - offset < lenB)
  121. return null;
  122.  
  123. this._len = 0;
  124. for (var i = 0; i < lenB; i++)
  125. this._len = (this._len << 8) + (this._buf[offset++] & 0xff);
  126.  
  127. } else {
  128. // Wasn't a variable length
  129. this._len = lenB;
  130. }
  131.  
  132. return offset;
  133. };
  134.  
  135. /**
  136. * Parses the next sequence in this BER buffer.
  137. *
  138. * To get the length of the sequence, call `Reader.length`.
  139. *
  140. * @return {Number} the sequence's tag.
  141. */
  142. Reader.prototype.readSequence = function(tag) {
  143. var seq = this.peek();
  144. if (seq === null)
  145. return null;
  146. if (tag !== undefined && tag !== seq)
  147. throw ASN1.TypeError('Expected 0x' + tag.toString(16) + ': got 0x' + seq.toString(16));
  148.  
  149. var o = this.readLength(this._offset + 1); // stored in `length`
  150. if (o === null)
  151. return null;
  152.  
  153. this._offset = o;
  154. return seq;
  155. };
  156.  
  157. Reader.prototype.readInt = function() {
  158. return this.readTag(ASN1.Integer);
  159. };
  160.  
  161. Reader.prototype.readBoolean = function() {
  162. return (this.readTag(ASN1.Boolean) === 0 ? false : true);
  163. };
  164.  
  165. Reader.prototype.readEnumeration = function() {
  166. return this.readTag(ASN1.Enumeration);
  167. };
  168.  
  169. Reader.prototype.readString = function(tag, retbuf) {
  170. if (!tag)
  171. tag = ASN1.OctetString;
  172.  
  173. var b = this.peek();
  174. if (b === null)
  175. return null;
  176.  
  177. if (b !== tag)
  178. throw ASN1.TypeError('Expected 0x' + tag.toString(16) + ': got 0x' + b.toString(16));
  179.  
  180. var o = this.readLength(this._offset + 1); // stored in `length`
  181.  
  182. if (o === null)
  183. return null;
  184.  
  185. if (this.length > this._size - o)
  186. return null;
  187.  
  188. this._offset = o;
  189.  
  190. if (this.length === 0)
  191. return retbuf ? new Buffer(0) : '';
  192.  
  193. var str = this._buf.slice(this._offset, this._offset + this.length);
  194. this._offset += this.length;
  195.  
  196. return retbuf ? str : str.toString('utf8');
  197. };
  198.  
  199. Reader.prototype.readOID = function(tag) {
  200. if (!tag)
  201. tag = ASN1.OID;
  202.  
  203. var b = this.readString(tag, true);
  204. if (b === null)
  205. return null;
  206.  
  207. var values = [];
  208. var value = 0;
  209.  
  210. for (var i = 0; i < b.length; i++) {
  211. var byte = b[i] & 0xff;
  212.  
  213. value <<= 7;
  214. value += byte & 0x7f;
  215. if ((byte & 0x80) == 0) {
  216. values.push(value);
  217. value = 0;
  218. }
  219. }
  220.  
  221. value = values.shift();
  222. values.unshift(value % 40);
  223. values.unshift((value / 40) >> 0);
  224.  
  225. return values.join('.');
  226. };
  227.  
  228. Reader.prototype.readTag = function(tag) {
  229. assert.ok(tag !== undefined);
  230.  
  231. var b = this.peek();
  232.  
  233. if (b === null)
  234. return null;
  235.  
  236. if (b !== tag)
  237. throw ASN1.TypeError('Expected 0x' + tag.toString(16) + ': got 0x' + b.toString(16));
  238.  
  239. var o = this.readLength(this._offset + 1); // stored in `length`
  240. if (o === null)
  241. return null;
  242.  
  243. if (this.length > 4)
  244. throw ASN1.TypeError('Integer too long: ' + this.length);
  245.  
  246. if (this.length > this._size - o)
  247. return null;
  248. this._offset = o;
  249.  
  250. var fb = this._buf[this._offset];
  251. var value = 0;
  252.  
  253. for (var i = 0; i < this.length; i++) {
  254. value <<= 8;
  255. value |= (this._buf[this._offset++] & 0xff);
  256. }
  257.  
  258. if ((fb & 0x80) == 0x80 && i !== 4)
  259. value -= (1 << (i * 8));
  260.  
  261. return value >> 0;
  262. };
  263.  
  264. var dgram = require("dgram");
  265. function parseTrapPacket(buffer){
  266. var pkt = {};
  267. var reader = new Reader(buffer);
  268. reader.readSequence();
  269. pkt.version = reader.readInt();//02 01 00
  270. pkt.community = reader.readString();//04 06 70 75 62 6c 69 63
  271. pkt.type = reader.readSequence();//a4
  272. pkt.enterprise = reader.readOID()//0x06, 0x0c, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x91, 0x28, 0x02, 0x02, 0x47, 0x64
  273. var bytes = reader.readString(64, true);//0x40, 0x04, 0xc0, 0xa8, 0x17, 0x0a,
  274. pkt.agentAddr = bytes[0] + "." + bytes[1] + "." + bytes[2] + "." + bytes[3];
  275. pkt.specific = reader.readInt();// 0x02, 0x01, 0x06,
  276. pkt.generic = reader.readInt();//0x02, 0x01, 0x0a
  277. pkt.upTime = reader.readTag(67);//
  278. pkt.varbinds = readVarbinds(reader);
  279. return pkt;
  280. };
  281. function readVarbinds (reader) {
  282. var vbs = [];
  283. reader.readSequence ();
  284. while (1) {
  285. reader.readSequence();
  286. var oid = reader.readOID (), type = reader.peek (), value = '';
  287. if (type == null) break;
  288.  
  289. switch(type){
  290. case 1:
  291. value = reader.readBoolean();
  292. break;
  293. case 2:
  294. case 65:
  295. case 66:
  296. case 67:
  297. value = reader.readTag(2);
  298. break;
  299. case 4:
  300. value = reader.readString (null);
  301. break;
  302. case 5:
  303. case 128:
  304. case 129:
  305. case 130:
  306. reader.readByte ();
  307. reader.readByte ();
  308. value = null;
  309. break;
  310. case 6:
  311. value = reader.readOID();
  312. break;
  313. case 64:
  314. var bytes = reader.readString(64, true);
  315. value = bytes.length == 4 ? bytes[0] + '.' + bytes[1] + '.' + bytes[2] + '.' + bytes[3] : '';
  316. break;
  317. case 68:
  318. case 70:
  319. value = reader.readString(type, true);
  320. break;
  321. }
  322. vbs.push ({
  323. oid: oid,
  324. type: type,
  325. value: value
  326. });
  327. }
  328. return vbs;
  329. }
  330. function Receiver(port, onTrap, onError, onStart){
  331. this.port = port;
  332. this.socket = null;
  333. this.isRunning = false;
  334. this.onTrap = onTrap;
  335. this.onError = onError;
  336. this.onStart = onStart;
  337. };
  338. Receiver.prototype.start = function(){
  339. var self = this;
  340. if(self.isRunning) return;
  341. var socket = self.socket = dgram.createSocket('udp4');
  342. socket.on('error', function(err){
  343. socket.close();
  344. self.isRunning = false;
  345. if(self.onError){
  346. self.onError(err);
  347. }
  348. });
  349. socket.on('message', function(msg, remote){
  350. if(self.onTrap){
  351. var pkt = parseTrapPacket(msg);
  352. self.onTrap(remote, pkt);
  353. }
  354. });
  355. socket.on('listening', function(){
  356. self.isRunning = true;
  357. if(self.onStart){
  358. self.onStart(self.port);
  359. }
  360. });
  361. socket.bind(self.port);
  362. };
  363. Receiver.prototype.stop = function(){
  364. var self = this;
  365. if(self.isRunning){
  366. if(self.socket){
  367. self.socket.close();
  368. self.isRunning = false;
  369. }
  370. }
  371. };
  372.  
  373. var trap = new Receiver(162, function(remote, pkt){
  374. console.log(JSON.stringify(remote), JSON.stringify(pkt));
  375. }, '', function(port){
  376. console.log('begin listen on ' + port);
  377. });
  378. trap.start();
  379.  
  380. module.exports.TrapReceiver = Receiver;

  

nodejs实现接收Snmp的Trap消息的更多相关文章

  1. 关于Snmp的Trap代码开发之坑

    最近是被这个snmp的trap给坑了,其实回想起来主要是对这个不了解.特别是对snmp协议研究不够深入, 真的不想看这些协议东西,只想大概知道.结果在开发snmp trap时候被坑了,下面列下自己踩到 ...

  2. Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息

    跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如  Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File -->  New Project 二: 编 ...

  3. WIN7/8系统下程序接收不到WM_COPYDATA 消息的原因和解决

    在WIN7/win8,如果发送消息的程序用户权限低于和接收消息的程序,则消 息无法传递.发送程序必须等于或者等于接收程序的权限.如发送与接收 是同一个用户,或者发送是管理员帐户,接收是是普通用户,这样 ...

  4. C/C++控制台接收不到鼠标消息-【解决办法】

    控制台编程中,使用了鼠标操作,遇到了控制台无法接收到鼠标消息的问题,可尝试一下办法解决 [win10系统] 在控制台标题栏右键-默认值-选项,将一下对勾取消 然后调用如下函数: HANDLE hIn ...

  5. nodejs之socket.io 私发消息和选择群组发消息

    写在前面:其实有的时候忙碌是好的,比如忙碌起来的自己手机可以一天耗费掉只有20%的电,忙碌的自己很专心于一件事情,但是忙碌不等于过度疲劳,本周忙碌有点上脑,迷糊了一天,都在补觉,还是要去平衡下自己一天 ...

  6. 【招聘App】—— React/Nodejs/MongoDB全栈项目:消息列表

    前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...

  7. nodejs数据接收body-parser中间件

    给大家翻译一下npm上body-parser的资料 nodejs 的body数据解析中间件 插件作用:对于req.body属性,在操作数据前分析进来的请求体的插件 首先学习解析一个http处理 这篇文 ...

  8. springboot使用activemq同时接收queue和topic消息

    原文链接:https://blog.csdn.net/jia_costa/article/details/79354478 新建springboot项目, pom文件如下 <?xml versi ...

  9. 解决在 win10 下 vs2017 中创建 MFC 程序拖放文件接收不到 WM_DROPFILES 消息问题

    解决方案 这个问题是由于 win10 的安全机制搞的鬼,即使以管理员权限运行也不行,因为它会把 WM_DROPFILES 消息过滤掉,那怎么办呢?只需在窗口初始化 OnInitDialog() 里添加 ...

随机推荐

  1. 学习笔记DAY2

    Pycharm使用 1.添加模板 file => settings =>Editor=>file and code template => python script => ...

  2. css-文本及其他

    <!DOCTYPE html>css7-文本和其他 text-align行内元素对齐方式,值为 左/中/右 对齐:left/right/center.test{text-align:cen ...

  3. java 加载图片的几种方式

    项目目录--src--testTable--image--active.gif | |_Task.class 方法1:通过项目目录访问. String a = System.getProperty(& ...

  4. 最强烈推荐-我的java收藏夹(内有国内最好的java论坛)

    原地址: http://bbs.chinaitlab.com/dispbbs.asp?boardid=148&id=34276 国内: www.chinajavaworld.com-论坛人很多 ...

  5. poj3581Sequence(后缀数组)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Sequence Time Limit: 5000MS   Memory Limi ...

  6. 关于char/varchar(n)中n的探究:字符数or字节数

    [问题来源]将设计的数据库表展示的时候,yu哥问我,你的那个top_info字段定义的类型是varchar(100),为什么是100呢,这100的长度能存多少个中文? 当时的想法就是,这个100能存多 ...

  7. js数组小结

    1.js数组使用sort()排序 var a = ["1","12","3","4","0"]; d ...

  8. MySql存储引擎介绍

    MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默认引擎,可以修改配置文件中的default-storage-engin ...

  9. FTP进行上传下载文件

    1.需要引入外部jar包:commons-net-2.0.jar(或者是子包commons-net-ftp-2.0.jar) 2.需下载ftp服务器 3. 本地电脑访问ftp服务器格式:ftp://用 ...

  10. 【Ecstore2.0】第三方信任登陆问题解决_备忘

    ECSTORE2.0的信任登陆模块开启后,需要拿着授过权的ID在官网进行配置才可以使用,但是客户的授权证书一时无法使用,而跳过认证的话功能又用不了,所以就自己临时搭了一个测试用的认证服务器和信任登陆平 ...