项目背景介绍
XX集团无线网络在一二期建设并投入使用后,内网用户多次反馈内部无线网络使用体验糟糕,但目前运维团队缺乏有效的手段进行对现场无线网络各项参数进行测试与采集。
由此基于物联网技术手段ESP8266小蜜蜂无线监控项目由此而生,使用价格实惠的ESP8266开发板作为底层硬件支持,使其能够模仿实际无线客户端,关联至无线AP并完成测速 延时 信道 信号等数据采集与监控,真正做到无线网络的全寿命周期监控与管理。
技术架构
本项目技术架构为通过使用ESP8266(NODEMCU)开发板自带的Wifi模块检测周围无线信号情况汇总数据后,在小蜜蜂监控点本身启用SNMP服务。配合数据中心的Zabbix监控服务对每个监控节点进行数据抓取服务器,同时每个节点配置12864屏 0.96寸OLED显示屏 通过显示屏进行部分数据以及设备运行情况的展示,方便现场运维人员对数据进行查看。
技术实现
IDE工具:
Arduino
语 言:
C++ Python
硬件主板:
ESP8266-NodeMCU硬件参考
ESP8266-NodeMCU是一个开源硬件开发板,由于它支持WIFI功能,所以在物联网(IOT)领域,Arduino开发板最大的对手之一就是ESP8266-NodeMCU开发板。ESP8266-NodeMCU尺寸与Nano类似, 他并不是Arduino团队开发的,但是我们也可以使用Arduino IDE 对他进行开发。而且他还有一颗地道的“中国芯”—ESP8266模块。
主要技术参数
核心模块 | ESP8266 |
---|---|
工作电压 | 5伏特 |
输入电压(推荐) | 5伏特 |
输入电压(极限) | 4.5 ~ 10 伏特 |
数字输入输出引脚 | 10个(全部可以作为PWM引脚) |
PWM引脚 | 10个 |
模拟输入引脚 | 2个 |
WIFI标准 | 802.11 b / g / n |
工作模式 | STA / AP / STA + AP |
重量 | 7g |
硬件介绍-物理线路链接
引脚连接情况如下:
D5->SDA
D6->SCL
GND->GND
3.3V->VCC
软件代码
#include <SPI.h>
#include <Wire.h>
#include <WiFiUdp.h>
#include <Ticker.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Arduino_SNMP.h>
#include <ESP8266Ping.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include "ESP8266WiFi.h"
//定义LCD显示部分
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4 //4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//判断LCD显示分辨率
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
//定义LCD信号强度变量
int level = 0; //0--100 level (linear, not accurate)
int displaylevel = 0; //0---63 for the oled screen
//定义SNMP参数-团体字
WiFiUDP udp;
SNMPAgent snmp = SNMPAgent("public"); //启动社区字符串为“public”的SMMPAgent实例
//定义SNMP-Get获取的参数
int rssi = 0;
int time_ms_0 = 0;
int time_ms_1 = 0;
int time_ms_2 = 0;
int time_ms_3 = 0;
char* espmac;
char* apmac;
//定义子线程循环使用参数
int i = 0;//用来判定连接是否超时的累加量
//定义PING目标地址
const IPAddress remote_ip(172.16.254.254);
const char* remote_host_1 = "www.baidu.com";
const char* remote_host_2 = "www.qq.com";
//多任务处理ticker
Ticker ticker;
int count;
void setup() {
Serial.begin(115200);
//初始化SNMP数据
apmac = (char*)malloc(10);
espmac = (char*)malloc(13);
//初始化LCD I2C参数
Wire.begin(14, 12);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
//初始化WIFI自动配置网络
WiFiManager wifiManager;
wifiManager.autoConnect("AutoConnectAP");
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println("");
Serial.print("ESP8266 Connected to ");
Serial.println(WiFi.SSID()); // WiFi名称
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // IP
//SNMP服务初始化
snmp_Initialize();
//子线程调用处理数据刷新任务
ticker.attach(1, tickerCount);
}
void loop() {
//调用监听SNMP
snmp.loop();
if (snmp.setOccurred) {
snmp.resetSetOccurred();
}
//更新SNMP变量
if (count >= 5) {
UpdateData_Wifi();
UpdateData_ping();
DATAdisplay();
count = 0;
}
}
//子线程
void tickerCount() {
count++;
}
void snmp_Initialize() {
strcpy(espmac, WiFi.macAddress().c_str());
snmp.setUDP(&udp);
snmp.begin();
snmp.addStringHandler(".1.3.6.1.4.1.5.0", &apmac, false);
snmp.addStringHandler(".1.3.6.1.4.1.5.1", &espmac, false);
snmp.addIntegerHandler(".1.3.6.1.4.1.5.2", &rssi);
snmp.addIntegerHandler(".1.3.6.1.4.1.5.3", &time_ms_0);
snmp.addIntegerHandler(".1.3.6.1.4.1.5.4", &time_ms_1);
snmp.addIntegerHandler(".1.3.6.1.4.1.5.5", &time_ms_2);
}
void UpdateData_ping() {
if (Ping.ping(remote_ip, 1)) {
time_ms_0 = Ping.averageTime();
}
if (Ping.ping(remote_host_1, 1)) {
time_ms_1 = Ping.averageTime();
}
if (Ping.ping(remote_host_2, 1)) {
time_ms_2 = Ping.averageTime();
}
Serial.printf("标准作业结束");
Serial.println();
}
void UpdateData_Wifi() {
strcpy(apmac, WiFi.BSSIDstr().c_str());
rssi = WiFi.RSSI();
}
void DATAdisplay() {
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.print(WiFi.SSID());
display.setCursor(90, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.print(WiFi.RSSI());
display.setTextSize(1);
display.println("dbm");
display.setCursor(0, 11);
display.setTextSize(1);
display.print("IP:");
display.setTextSize(1);
display.setTextColor(WHITE);
display.print(WiFi.localIP());
display.setCursor(0, 21);
display.setTextSize(1);
display.print("1:");
display.setTextSize(1);
display.setTextColor(WHITE);
display.print(time_ms_0);
display.print("ms");
display.setTextSize(1);
display.print("2:");
display.setTextSize(1);
display.setTextColor(WHITE);
display.print(time_ms_1);
display.print("ms");
display.setTextSize(1);
display.print("3:");
display.setTextSize(1);
display.setTextColor(WHITE);
display.print(time_ms_2);
display.println("ms");
display.setCursor(0, 30);
display.setTextSize(1);
display.print("3:");
display.setTextSize(1);
display.setTextColor(WHITE);
display.println(WiFi.macAddress() );
display.setCursor(107, 55);
display.setTextSize(1);
display.print(level);
display.setTextSize(1);
display.println("%");
display.display();
}
通过ZABBIX纳管进行无线监控
参数定义
1.Mib 管理信息库
管理信息库(MIB,Management Information Base)是TCP/IP网络管理协议标准框架的内容之一,MIB定义了受管设备必须保存的数据项、允许对每个数据项进行的操作及其含义,即管理系统可访问的受管设备的控制和状态信息等数据变量都保存在MIB中。
详细参考如下:
https://baike.baidu.com/item/mib/4490795?fr=aladdin
https://blog.csdn.net/u013752926/article/details/85251251
2.SNMP
简单网络管理协议(SNMP) 是专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。
详细参考如下:
https://baike.baidu.com/item/%E7%AE%80%E5%8D%95%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86%E5%8D%8F%E8%AE%AE?fromtitle=SNMP&fromid=133378
3.MIB定义
".1.3.6.1.4.1.5.0" apmac 连接AP的mac地址
".1.3.6.1.4.1.5.1" espmac 设备本身的mac地址
".1.3.6.1.4.1.5.2" rssi 连接SSID的信号值
".1.3.6.1.4.1.5.3" time_ms_0 第一个站点的时延
".1.3.6.1.4.1.5.4" time_ms_1 第二个站点的时延
".1.3.6.1.4.1.5.5" time_ms_2 第三个站点的时延
操作指引
1.添加节点根据上图指引进行相关参数填写创建监控节点、监控节点IP最好在193.1DHCP服务器中进行保留绑定
注意勾选接口时选择SNMP 以及填写好正确的团队字
2.添加纳管监控参数
使用上文参数定义中的相关MIB节点进行创建即可
3.图表绘制