在FreeBSD下UPS的改造

2009-05-13 12:58:05来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

0xEaa13
由于某种原因,弄得经常停电,对家里的服务器造成了危害。所以弄来了一台老的SANTAK M500W UPS,型号比较老了,所以没有数据接口,停电之后仍旧只能支持几十分钟,如果供电不恢复的话还是没用,所以准备对UPS进行改造。
首先要为UPS写一个支持程序,目的是让系统掉电候自动执行关机指令。我用的是FreeBSD,此系统下的串口编程资料很少,我找了很久才勉强找到几篇国外的文章。
程序如下:
格式化的程序在这里
下载
+++++++++++++++++++++++++++++++++++++++++
#include
#include
#include
#include
#include
#include
#include
#include
#include
static fd = 0;
help()
{
printf("0xEaa13`s UPS Daemon Version 1.0\n\
Usage: ./ups-daemon device-name\n\
\nWritten by 0xEaa13\n\
Host:http://eaa13.dns0755.net\n\
E-MAIL: eaa13_at_bsdmail.org\n\
");
exit(0);
}
int
main(int argc, char **argv)
{
int count = 0;
int ledon;
int ledoff;
pid_t pid;
int status;
ledon |= TIOCM_DTR;
ledoff &= ~TIOCM_DTR;
if (argc != 2)
help();
/* open device */
fd = open(argv[1], O_RDWR | O_NDELAY);
if (fd  0) {
printf("Start daemon OK!\nPid is:%d\n", pid);
exit(0);
}
while (1) {
ioctl(fd, TIOCMSET, &ledoff);
sleep(1);
ioctl(fd, TIOCMSET, &ledon);
sleep(1);
ioctl(fd, TIOCMGET, &status);
if (status & TIOCM_CAR) {
int i;
for (i = 0; i 下面是串口部分线路图


程序是通过TICOMSET/GET ioctl()函数来对串口进行操作的,程序使用了DB9串口的3个脚:1-DCD,4-DTR,5_GND。先用ioctl(fd, TIOCMSET, &ledoff);使4脚DTR变为低电平,LED不亮,sleep(1);之后用ioctl(fd, TIOCMSET, &ledon);使LED持续点亮,同时把4脚的高电平信号用于1脚DCD信号的采样,如果1-4之间的光耦关闭,1脚就得不到4脚的高电平信号,程序便认为UPS不工作,LED持续闪烁。如果UPS工作,把光耦打开了,程序便会进入监视程序,在3分钟内完成3次检测,如果3次结果都是UPS工作,程序便发出指令使系统关机。
下面是程序的使用方式:
# gcc -o ups-d ups-d.c
# ./ups-d /dev/cuaa0(第一个串口)
Start daemon OK!
Pid is:1362
# (程序已经fork成daemon进程了)程序正常工作的时候你将会看见LED持续闪烁,当检测到UPS工作的时候LED常亮,说明进入了监视程序。
程序这边已经完成,现在要解决的问题是改造UPS的电路,使其能在工作的时候发给程序信号。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:在FREEBSD 5.2上安装配置DNS SERVER(BIND 9)

下一篇:使用rtsp-proxy突破电影站点的ip限制