Domanda

Sto utilizzando il servizio UPS per monitorare lo stato del mio UPS da un'applicazione: la chiave in HKLM\SYSTEM\CCS\Services\UPS\Status contiene tutte le informazioni che puoi ottenere dal pannello di controllo dell'alimentazione.MA - Mi piacerebbe poter dire all'UPS di spegnersi anche dalla mia app.So che il servizio può dire all'UPS di spegnersi, ad esempio dopo aver utilizzato la batteria per un determinato numero di minuti, e mi chiedo se esiste un qualche tipo di comando che posso inviare al servizio per avviare manualmente uno spegnimento .

Ho difficoltà a cercare queste informazioni: le persone tendono a scrivere erroneamente "Uninterruptible" (hrm, Firefox lo ha sottolineato ma non ha un'alternativa) e "UPS" ottiene risultati solo per il servizio di spedizione.Forse posso fare qualcosa tramite System.ServiceController o WMI?

UNA PRECISAZIONE:Sì, sto parlando di spegnere il dispositivo UPS fisico.So come interrompere il servizio.Ho pensato che sarebbe stato un problema comune: voglio che il mio UPS si spenga insieme al PC.Ho avuto un'idea che proverò, basata su questa pagina.Vedete, APC (e tutti gli altri) devono fornire una DLL per la chiamata del servizio UPS e poiché le chiamate alle funzioni sono ben documentate, non c'è motivo per cui non dovrei essere in grado di P/Invocarle.Lo modificherò nuovamente una volta che avrò saputo se ha funzionato o meno.

Aggiornamento:Ho provato a richiamare UPSInit, quindi UPSTurnOff e non succede nulla.Ci armeggerò ancora un po', ma la chiamata diretta ad apcups.dll potrebbe essere un vicolo cieco.

È stato utile?

Soluzione 2

OK, ho la risposta (testata!), ma non è carina.Il mio UPS APC comunica utilizzando il Protocollo "Smart" APC (di più qui).Ciò di cui hai bisogno nel mio caso è un comando "soft shutdown", "S".Ma prima devi assicurarti che sia in modalità "Smart" ("Y").Ora, se si desidera consentire al servizio UPS di Windows di monitorare lo stato, il servizio avrà un controllo ferreo sulla porta COM.Quindi puoi a) lasciare che il servizio Windows spenga l'UPS oppure b) interrompere il servizio e spegnere tu stesso l'UPS.

L'UPS stesso ha un "periodo di grazia" dopo aver ricevuto il comando "S", dandoti il ​​tempo di spegnere il sistema operativo.Ciò significa che per fare (a) sopra, devi:

  • Elimina l'alimentazione di rete
  • Attendi il timeout del servizio UPS di Windows (predefinito e minimo 2 minuti)
  • Attendi che Windows si spenga: proprio verso la fine invierà il comando "S".
  • Attendi il periodo di grazia dell'UPS, trascorso il quale si spegnerà effettivamente

Penso che opteremo per (a), solo perché (b) implica lavoro extra per eliminare il servizio e implementare le comunicazioni seriali.

Altri suggerimenti

Controlla i miei commenti a Herman, si desidera arrestare l'UPS verso il basso, non il servizio Gruppo di continuità, giusto? Voglio dire, si desidera che la cosa da spegnere, uccidere il potere, ecc, giusto?

Se è così, siete alla ricerca su un gruppo di continuità per modello UPS. Dubito che due di loro avrebbe funzionato lo stesso.

Nelle vostre ricerche, invece di UPS, prova a "APC", o "batteria". Penso che un sacco di codice è quello che viene eseguito su computer portatili a che fare con l'essere a batteria, ecc ...

Alcuni posto nascosto in alcuni vecchi file polverosi ho informazioni di protocollo per APC UPS, ei comandi rispondono a, e ciò che essi inviano al PC, ecc Ma questo è stato nel lontano il giorno in cui abbiamo usato per collegare i nostri UPS per i nostri computer con i cavi seriali ... Si potrebbe effettivamente parlare con un gruppo di continuità con Qmodem o Hyperterm ...

appreso parlando con i ragazzi di APC. Sono molto gentile e disponibile. Ora, a un giorno, penso che solo inviare un URL proveniente dal software Powerchute, e sarà parlare direttamente con il gruppo di continuità, ed eseguire i comandi.

Per favore, dica in che lingua stai cercando di farlo ... se si sta utilizzando .NET si può fare con la classe ServiceController (leggere la documentazione).

Per il controllo dei servizi in Win32 API utilizzando C C ++, Funzioni di servizio (Windows) .

Per esempio, per arrestare un servizio è possibile utilizzare la funzione ControlService come segue (questo è un esempio rapido e sporco):

OpenService (hServMgr, TEXT("\\UPS_SERVICE_0"), SC_MANAGER_ALL_ACCESS);

SERVICE_STATUS stat;
ControlService (hUpsService, SERVICE_CONTROL_STOP, &stat)

Si noti che è necessario fornire un manico Service Manager nel hServMgr e il nome \\ UPS_SERVICE_0 è il nome che deve corrispondere con il servizio desiderato UPS (sia di Windows built-in o in un altro).

Ricordate che per arrestare un servizio sono necessari i diritti di sicurezza appropriati. Questo non è un problema con un account Administration, ma di tenere presente che cosa succede quando si accede con un account non-admin.

La speranza che aiuta.

A proposito di spegnimento del dispositivo UPS fisico, mi ricordo di nuovo in giorni win98 ho potuto poweroff il dispositivo di parlare con l'UPS attraverso la porta COM, benche non ricordo la marca o come l'interfaccia di programmazione è stato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top