2009-07-21 20 views
5

Tôi đang phát triển một ứng dụng theo dõi sự hiện diện của nguồn điện của máy tính xách tay. Nếu có một cắt điện hoặc phục hồi nó sẽ thân mật với tôi qua email. Nó cũng sẽ giám sát ứng dụng và kiểm soát qua email (Về cơ bản để kiểm soát máy tính xách tay của tôi từ văn phòng của tôi qua email). Tôi đang thực hiện với giao tiếp email nhưng tôi không có ý tưởng về cách giám sát việc cung cấp điện/nguồn cung cấp pin từ java.Giám sát pin hoặc nguồn điện của máy tính xách tay từ java

Nếu có thể cung cấp cho một số con trỏ về điều này, nó sẽ giúp ích rất nhiều.

Cảm ơn trước ....

+1

Nó sẽ giúp biết nền tảng (OS) vì điều này có thể là nền tảng cụ thể. – jsight

+0

chỉ tò mò tại sao bạn sử dụng động từ thân mật ở đó? Nghe có vẻ lạ. bạn có ý định sử dụng một từ khác hay là một số loại api email? – Victor

+0

Tôi đang sử dụng Windows Vista và cho "thân mật" là một lỗi đánh máy nên đã được "thông báo": $. – vcosk

Trả lời

5

Bạn đã có thể đã giải quyết vấn đề này nhưng đối với những người khác - bạn có thể làm điều đó một cách Adam Crume cho thấy, sử dụng một kịch bản đã được viết battstat.bat cho Windows XP trở lên. Dưới đây là một ví dụ của hàm kết quả:

private Boolean runsOnBattery() { 
    try { 
     Process proc = Runtime.getRuntime().exec("cmd.exe /c battstat.bat"); 

     BufferedReader stdInput = new BufferedReader(
      new InputStreamReader(proc.getInputStream())); 

     String s; 
     while ((s = stdInput.readLine()) != null) { 
      if (s.contains("mains power")) { 
       return false; 
      } else if (s.contains("Discharging")) { 
       return true; 
      } 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return false; 
} 

Hoặc bạn có thể đơn giản hóa các kịch bản để quay trở lại trực tiếp True/False hoặc bất cứ điều gì phù hợp.

+0

Điều này khá thú vị, mặc dù nó không cho tình trạng hiện tại của pin đúng cách này là chính xác những gì tôi đang tìm kiếm trở lại sau đó. – vcosk

0

Cách nhanh chóng và bẩn để xử lý việc này là gọi chương trình gốc (qua Runtime.exec (...)) và phân tích đầu ra. Trên Windows, chương trình gốc có thể là VBScript sử dụng WMI.

2

Trên Linux, bạn có thể sử dụng/proc/acpi/pin/

0

Đây là mã hoạt động trên Windows bằng cách sử dụng cấu trúc SYSTEM_POWER_STATUS.

Lưu ý rằng bạn cần thêm jna vào phụ thuộc (Maven) của bạn để hoạt động này.

import java.util.ArrayList; 
import java.util.List; 

import com.sun.jna.Native; 
import com.sun.jna.Structure; 
import com.sun.jna.win32.StdCallLibrary; 

public interface Kernel32 extends StdCallLibrary 
{ 
    public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", 
      Kernel32.class); 

    public class SYSTEM_POWER_STATUS extends Structure 
    { 
     public byte ACLineStatus; 

     @Override 
     protected List<String> getFieldOrder() 
     { 
      ArrayList<String> fields = new ArrayList<String>(); 
      fields.add("ACLineStatus"); 

      return fields; 
     } 

     public boolean isPlugged() 
     { 
      return ACLineStatus == 1; 
     } 
    } 

    public int GetSystemPowerStatus(SYSTEM_POWER_STATUS result); 
} 

Trong mã của bạn gọi nó là như thế này:

Kernel32.SYSTEM_POWER_STATUS batteryStatus = new Kernel32.SYSTEM_POWER_STATUS(); 
Kernel32.INSTANCE.GetSystemPowerStatus(batteryStatus); 

System.out.println(batteryStatus.isPlugged()); 

Kết quả:

true if charger is plugged in false otherwise 

này đã được bắt nguồn tắt BalsusC's answer.