家里有个自己拼凑的nas需要防止断电不正常关机,因此购买了施耐德后背式BP650CH,之所以选这款是因为带了串口,串口终究还是很方便的东西。不管linux还是window还是其他系统都能够使用,通过串口直接获得ups的信息,就不需要关心操作系统是什么了。

BP650CH的串口协议参考这篇文档是BP650CHBP1000CH串口通信协议.pdf-原创力文档 (book118.com)

默认波特兰2400,8bit数据,1bit停止位,无检验。SecureCRT设置如下

由于这个施耐德的UPS串口并非终端交互式的,因此我们不适合用SecureCRT,采用其他输入和输出分离的串口助手。

我使用Arduino IDE中的串口助手,设置如下

按照手册,首先需要登录到UPS,方法就是输入M回车,那么串口会返回一个V

接着输入QS回车,这个命令是检索状态。注意施耐德的串口交互命令都是回车结尾。

反正QS命令返回的结果格式为:

(是结果的开始,然后后面的数值用空格分开

216.1=输入电压216.1伏特(有效值rms)

216.1=输入故障电压216.1伏特(有效值rms)

216.1=输出电压216.1伏特(有效值rms)

000=输出负载,因为我UPS没有接负载,所以就是0,单位是百分比

50.0=输出电压的频率是50Hz

13.5=电池电压13.5V(有效值rms)

--.-=内部温度,似乎没法显示内部温度

00001001=UPS状态字节b7~b0

b6为高位的话指示电池电压低

b4为高位指示UPS故障

剩下的看手册

测试1:关闭UPS的市电输入,蜂鸣器10秒叫一次,QS命令检索状态发现UPS的状态字节最高位变成了1,这个时候就可以通知用户进行关机了

测试2:使用破旧没有电池的笔记本电脑装linux系统做断电自动关机的测试。

将USB转串口线插到电脑,lsusb发现串口PL2303驱动

ls /dev/tty*发现串口设备ttyUSB0

安装minicom软件:yum install minicom

然后minicom -s进入设置,选择Serial port setup。然后设置如下

然后save setup as dfl,下次就不用设置了

然后exit from minicom

接着输入minicom

输入M登录后,输入QS就可以查询数据了

退出minicom方法,ctrl+A后,然后按Z,然后按X,然后yes

但是minicom是交互式的,因此我们需要自己写一个程序实现ups的状态扫描来实现关机

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<termios.h>
#include<string.h>
#include<sys/select.h>
int serialDevFD;//串口设备描述符
char *serialDev = "/dev/ttyUSB0";
void serialDevOpen()
{serialDevFD = open(serialDev,O_RDWR|O_NOCTTY|O_NDELAY);//读写方式打开串口设备,后面两个属性不用管if(serialDevFD<0){printf("Serial port device %s open failed!!!\n",serialDev);perror(serialDev);exit(1);}printf("Serial port device %s open success, file descriptor = %d\n",serialDev,serialDevFD);
}
void serialDevClose()
{close(serialDevFD);printf("Serial port device %s close success\n",serialDev);
}
//延时n秒
void sleepSecond(int n)
{sleep(n);
}
//串口通信参数配置
void serialDevCfg()
{struct termios newT;//新的配置信息结构体  memset(&newT,0,sizeof(newT));//结构体清零  cfsetispeed(&newT,B2400);//设置input/output波特率都是2400cfsetospeed(&newT,B2400);  //  newT.c_cflag |= (CLOCAL|CREAD);  newT.c_cflag &=~CSIZE;  //设置数据位8位  newT.c_cflag |= CS8;  //设置无校验  newT.c_cflag &= ~PARENB;  newT.c_iflag &= ~INPCK;  //设置停止位1位  newT.c_cflag &= ~CSTOPB;  //  newT.c_cc[VTIME]=0;  newT.c_cc[VMIN]=0;  tcflush(serialDevFD,TCIOFLUSH);  if(tcsetattr(serialDevFD,TCSANOW,&newT)!=0){  perror("set Baud failed");  exit(1);  }else {printf("Serial port device %s set params success\n",serialDev);}
}//登录和监控ups
char *UPS_LOGIN = "M\r";
char *UPS_STATUS = "QS\r";
void serialMonitor()
{fd_set rds;int ret;int len;char buf;char arr[300];write(serialDevFD,UPS_LOGIN,2);//登录int loginIndex = 0;while(1){FD_ZERO(&rds);FD_SET(serialDevFD,&rds);/*调用select检查是否能够从/dev/input/event0设备读取数据*/ret = select(serialDevFD+1, &rds, NULL, NULL, NULL );if ( ret < 0 ){perror( "select" );exit(2);}/*能够读取到数据*/else if (FD_ISSET(serialDevFD,&rds)){len = read(serialDevFD,&buf,1);if(len==1){arr[loginIndex++] = buf;if(loginIndex==2){if(arr[1]=='\r'){arr[1]='<';arr[2] = 'c';arr[3]='r';arr[4] = '>';}arr[5] = '\0';printf("接收到UPS登录响应=%s\n",arr);break;}}}}//int duration = 3;//监测周期,单位秒int count = 0;//计数器,检测到断电后再检测2次如果真的没有电就关机int statusIndex = 0;write(serialDevFD,UPS_STATUS,3);while(1){FD_ZERO(&rds);FD_SET(serialDevFD,&rds);/*调用select检查是否能够从/dev/input/event0设备读取数据*/ret = select(serialDevFD+1, &rds, NULL, NULL, NULL );if ( ret < 0 ){perror( "select" );exit(2);}/*能够读取到数据*/else if (FD_ISSET(serialDevFD,&rds)){len = read(serialDevFD,&buf,1);if(len==1){if(buf=='\r'){//printf("<cr>\n");arr[statusIndex] = '\0';printf("接收到ups状态响应=%s<cr>\t",arr);int pass = 1;/*                  ups状态数据合法性检查         *///检查长度是否是46个字符if(statusIndex!=46) pass = 0;//检查第一个字符是不是左括号if(arr[0]!='(') pass = 0;if(pass==1){printf("ups状态数据合法,");//检测市电是否发生了断电if(arr[38]=='1'){printf("发生了断电\n");count++;if(count==3){printf("ups发生断电,执行关机命令\n");system("shutdown -h now");  }}else{printf("市电输入正常\n");count = 0;}}else{printf("ups状态数据不合法,跳过\n");}sleepSecond(duration);statusIndex = 0;write(serialDevFD,UPS_STATUS,3);}else{//printf("%c",buf);arr[statusIndex++] = buf;}}}}
}
int main(){  serialDevOpen();serialDevCfg();sleep(3);serialMonitor();serialDevClose();return 0;
}

Makefile如下:

CROSS=
TARGET=upsMonitor
SRC=main.c
all: $(TARGET)  $(TARGET):$(SRC)  $(CROSS)gcc -std=c99 -o $(TARGET) $(SRC)  $(CROSS)strip $(TARGET)
clean:  @rm -vf $(TARGET) *.o *~

UPS BP650CH实现nas自动关机相关推荐

  1. QNAP 威联通NAS ts-453bmini ups断电自动关机

    买了nas,买了ups,突然想起这个ups不能和nas通信,那岂不是无法自动关机,ups不是白买了,本着物尽其用的原则,网上搜了下方案,发现主要思路是nas跑脚本ping路由器或者某个没断电可以正常网 ...

  2. UPS大科普 群晖NAS 轻松设置UPS 断电 自动关机

    什么是UPS UPS即不间断电源(Uninterruptible Power Supply),是一种含有储能装置的不间断电源.主要用于给部分对电源稳定性要求较高的设备,提供不间断的电源. [1] 当市 ...

  3. 【软路由】esxi 配合UPS停电自动关机,网络异常自动重启openwrt虚拟机

    一.运行环境 软路由上跑了 esxi 6.7,esxi 上运行了 openwrt 虚拟机作为主路由,UPS 给软路由供电 实现功能 1.停电后UPS供电期间esxi自动关机 ping内网市电供电的设备 ...

  4. QNAP 威联通 NAS的个人使用经验 篇一:设备展示(TS-451)及基础知识

    原作者:noskin  http://www.hdpfans.com/thread-487413-1-1.html(貌似这个也是转载) 前言 NAS(Network Attached Storage) ...

  5. 家用nas存储,家庭个人云推荐

    Nas是什么 NAS是一种网络连接的存储设备,是一种小型的在线计算机,通常用于备份计算机和向本地网络上的设备提供文件.它包括至少一个但通常是两个(或更多)硬盘,一个(通常)基于Linux的操作系统,为 ...

  6. UPS电源即插即用的USB接口板方案

    一.方案背景: 针对早期的UPS电源的RS232接口标准,已经无法满足目前计算机硬件及软件技术的发展要求,导致很多UPS电源无法继续作为电脑等设备的备用电源.随着NAS用户群体的增多,而用户最担心的问 ...

  7. bk650不支持服务器系统,ESXi 6.7 使用NUT Client连接群晖UPS服务器

    进来增加了一台工控机,上面跑了如软路由等业务,万一突然断电ESXi坏了启不了,估计就得废好大劲折腾了,以前有给群晖配过一台APC BK650的UPS,目前UPS的COM数据输出直接给到了群晖,毕竟无论 ...

  8. Thecus色卡司1U机架式网络存储服务器

    1U机箱内支持4颗大容量SATA I/SATA II 高速硬盘<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:of ...

  9. Linux(CentOS)下,各种协议,端口号

    Linux(CentOS)下,各种配置文件如下: DNS:cat /etc/resolv.conf 主机名:cat etc/sysconfig/network 私有主机名:cat /etc/hosts ...

最新文章

  1. 网页的一般布局(标题和脚注100%,内容宽度固定宽度px)
  2. 面试官:不使用synchronized和lock,如何实现一个线程安全的单例?
  3. micropython安装第三方库_安装第三方模块
  4. CRM Fiori Simulation pipeline应用点了bubble控件的实现
  5. html 中一个格子拆分成两个_一个效果惊人的数字游戏
  6. python—列表、字典生成式
  7. mysql 临时索引_MYSQL临时表创建索引
  8. Golang开发的跨平台蜜罐平台HFish v0.6.4源码
  9. TCP/IP网络编程之多种I/O函数
  10. SGU 210 Acdream 1227 Beloved Sons KM
  11. 在Linux下安装bind服务,在Linux系统下安装DNS服务器BIND
  12. jdbc获取数据库元数据,获取数据库列表,获取数据库基本信息,获取指定数据库中的表信息,获取指定表中的字段信息
  13. PyTorch入门(四)搭建神经网络实战
  14. win10 联想键盘快捷键关闭_如何关闭联想台式机电脑USB键盘的FN功能
  15. 智慧机场大数据可视化分析决策系统
  16. CISSP怎么复习备考
  17. linux 文件可视化工具下载,Linux 可视化管理工具
  18. java格式化日期24小时_Java如何格式化24小时格式的时间?
  19. TOEFL 考场注意事项 考试须知
  20. css3揭秘读书笔记--边框内圆角

热门文章

  1. android开发的程序闪退,Android软件闪退
  2. firefox插件推荐
  3. 点餐推荐系统_麦当劳智慧餐厅的微信小程序终究将取代人工点餐和自助点餐机...
  4. 记录 Spring Cloud GateWay 使用 路径与路由名字重复 出现的问题
  5. 又是一年1024(2019)
  6. Java中set.iterator()的用法;
  7. 公司口碑及待遇评价的网站
  8. 成都玖益科技:二级降权对于店铺发展的影响
  9. 聚美优品美容热点产品
  10. Lateral View Outer