Tìm hiểu qua mạng nếu thiết bị Android đang hoạt động


9

Tôi có một thiết bị nVidia Shield TV, đang chạy Android TV.

Để tích hợp điều này vào thiết lập rạp hát tại nhà của tôi, tôi cần có thể xác định xem thiết bị đang hoạt động hay đang ngủ.

Đối với các thiết bị khác của tôi, tôi chỉ cần sử dụng ping để xác định điều này. Tuy nhiên, vì các thiết bị Android về cơ bản luôn bật, nên điều này không hoạt động trong trường hợp này.

Tất nhiên, có một cách là viết một ứng dụng đơn giản, mở cổng TCP khi thiết bị hoạt động và đóng lại khi nó đang ngủ.

Câu hỏi của tôi là nếu có một cách đơn giản hơn, có thể là một ứng dụng hiện có hoặc một số cách khác để làm điều này mà không phát triển ứng dụng của riêng tôi để làm điều này.


Thiết bị Android của bạn có luôn được kết nối với Wi-Fi không?
ếchatto

Tôi có cảm giác rằng bạn đang trộn "thiết bị đang hoạt động hoặc đang ngủ" với "đang bật". Hãy làm cho bạn câu hỏi chính xác hơn.
Mary Paździoch

@ HiI'mFrogatto Thiết bị không sử dụng WiFi, được kết nối qua Ethernet, do đó, nó luôn được kết nối với mạng.
Mika Fischer

@ MarianPaździoch Android TV có chế độ gọi là "chế độ ngủ", là chế độ năng lượng thấp, tương tự như khi màn hình của điện thoại hoặc máy tính bảng bị tắt. Tôi muốn phân biệt giữa chế độ ngủ này và chế độ hoạt động, nơi thiết bị đang hiển thị nội dung trên TV. Điều đó có làm rõ vấn đề không?
Mika Fischer

3
@MikaFischer "... mà không cần viết ứng dụng của riêng tôi, ..." Stack Overflow dành cho những người viết mã:)
ếchatto

Câu trả lời:


1

Có vẻ như nVidia Shield Android TV đi kèm với Android 5.1.1 và bản cập nhật Marshmallow chỉ khả dụng kể từ tháng 12. Tôi cho rằng Android 5.1.1 là phiên bản được cài đặt trong thiết bị của bạn.

Dịch vụ hệ thống truy vấn

Kích hoạt ở chế độ không dây trên thiết bị. Thực hiện theo hướng dẫn chính thức hoặc câu trả lời này của Izzy để được hướng dẫn, nếu cần.

Bạn có thể tìm thấy trạng thái của Android - ngủ hoặc thức - từ đống dịch vụ hệ thống khác nhau.

  • Dịch vụ: Nguồn điện

    adb shell dumpsys power
    

    Tìm kiếm các chuỗi mWakefulnessvà / hoặc Display Power: state. Cả hai sẽ cung cấp cho bạn trạng thái bạn cần.

    Thí dụ:

    adb shell 'dumpsys power | grep -e "mWakefulness=" -e "Display Power"'
    

    đưa cho tôi

    mWakefulness=Asleep
    Display Power: state=OFF
    
  • Dịch vụ: Cửa sổ

    adb shell dumpsys window
    

    Tìm kiếm chuỗi mAwake=truevà / hoặc mScreenOnEarly=truevà / hoặcmScreenOnFully=true

    Thí dụ:

    adb shell 'dumpsys window | grep -e "mAwake=" -e "mScreenOnEarly" -e "mScreenOnFully"'
    

    đưa cho tôi

    mAwake=true
    mScreenOnEarly=true mScreenOnFully=true
    
  • Dịch vụ: Hiển thị

    adb shell dumpsys display
    

    Tìm kiếm các chuỗi mState=OFFvà / hoặc mScreenState=OFF.

    Thí dụ:

    adb shell 'dumpsys display | grep -e "mState=" -e "mScreenState"'
    

    đưa cho tôi

    mState=OFF
    mScreenState=OFF
    

Sử dụng tự động hóa

Nếu không có dịch vụ hệ thống nào được đề cập trong phương pháp trước hoạt động cho bạn, hãy thiết lập một ứng dụng , chẳng hạn như Tasker hoặc MacroDroid hoặc Automate.

Bây giờ chúng tôi sẽ sử dụng tự động hóa để ghi trạng thái của Android vào một tệp, chẳng hạn như Ngủ ở chế độ ngủ và Thức khi thức.

Tasker ,

  • Hồ sơ: Sự kiện → Hiển thị → Hiển thị Tắt
  • Tác vụ: (Tác vụ): Tệp → Ghi tệp → chọn tệp văn bản để ghi vào, nhập Ngủ và bỏ chọn Thêm dòng mới
  • Hồ sơ: Sự kiện → Hiển thị → Hiển thị Bật
  • Tác vụ: (Tác vụ): Tệp → Ghi tệp → chọn tệp văn bản để ghi vào, nhập Awake và bỏ chọn Thêm dòng mới

MacroDroid

Đáng buồn là Android không đi kèm echohoặc printftiện ích, Nếu thiết bị đã được root, bạn có thể cài đặt busybox và yên tâm. Nếu không, hãy tải xuống tệp nhị phân busybox , đặt quyền thực thi và đẩy nó vào /data/local/tmpsử dụng adb push. Một cách khác cho một thiết bị không root là giữ ba tệp, một cho trạng thái, một cho văn bản Ngủ và một cuối cùng với văn bản Awake. Bất cứ khi nào màn hình tắt / bật, hãy sao chép tệp thứ hai / thứ ba vào tệp thứ nhất.

MacriDroid cũng yêu cầu một plugin, chẳng hạn như Cài đặt bảo mật để thực thi các lệnh.

  • Kích hoạt: Bật / Tắt màn hình → Tắt màn hình
  • Hành động: Cài đặt an toàn → Hành động → Lệnh chạy:

    • Chỉ huy: echo Sleeping > FILE_PATH
    • Tên lệnh: Tắt màn hình
  • Kích hoạt: Bật / Tắt màn hình → Bật màn hình
  • Hành động: Cài đặt an toàn → Hành động → Lệnh chạy:

    • Chỉ huy: echo Awake > FILE_PATH
    • Tên lệnh: Tắt màn hình

Đối với một Android không root, echonên được thay thế bằng ./data/local/tmp/busybox echo. Nếu không, thực hiện một hoạt động sao chép bằng cách sử dụng lệnh cp SOURCE DESTINATION.

Tự động hóa

Luồng của bạn sẽ ít nhiều trông giống như hình ảnh này

(Bấm vào hình để phóng to)

IMG:

Nhu cầu của bạn để tạo ra hai luồng, một cho giấc ngủ và một cho tỉnh táo. Khối thứ hai trong luồng được đặt tên là Broadcast Broadcast và có thể được tìm thấy trong Ứng dụng. Khối thứ ba có tên là File write text và có thể được tìm thấy trong File & Storage.

Bây giờ bạn có thể kiểm tra nội dung của tệp đó bằng adb ở chế độ không dây hoặc sử dụng SSH (yêu cầu máy chủ SSH trên Android; chạy máy chủ trên tất cả các giao diện và không liên kết nó với một giao diện duy nhất.)


Có một khả năng khác, chẳng hạn như làm cho ứng dụng tự động hóa của bạn tải tệp lên máy chủ cục bộ hoặc từ xa để bạn có thể truy vấn máy chủ đó thay vì Android để biết trạng thái.



Một cái gì đó cho tôi biết đây sẽ không phải là một chuyến đi suôn sẻ trên Android TV. Hãy cho tôi biết nếu câu trả lời của tôi không hoạt động. Tôi sẽ gỡ nó xuống. Tôi không có ý định giữ một câu trả lời không ích lợi đang rình rập xung quanh.
Firelord

1
Wow, cảm ơn đã trả lời chi tiết! Sử dụng Tasker như thế này làm việc như một cơ duyên! Nhắc nhở duy nhất là bạn cần kết nối chuột để thiết lập nó. Tôi đã không viết vào một tập tin. Thay vào đó tôi đã viết một máy chủ HTTP đơn giản bằng Python và gửi các yêu cầu GET đến nó từ tấm khiên.
Mika Fischer

Vâng, của bạn là một kỹ thuật tốt là tốt. Nó giống như nói với máy chủ rằng bạn còn sống. Và cảm ơn vì tiền thưởng! Bạn có phiền cho tôi biết liệu phương pháp 1 của tôi (phương thức dịch vụ hệ thống đó) không thành công hay bạn chưa thử nó?
Firelord

1
Tôi đã không thử vì tôi không root và theo như tôi thấy, cần phải kết nối máy tính với thiết bị để bật chế độ mạng adb (ví dụ như sau khi khởi động lại), điều này quá bất tiện cho tôi ...
Mika Fischer

0

Đây thực sự không phải là một giải pháp nhưng trong cài đặt thiết bị có thể có một tùy chọn vô hiệu hóa Wi-Fi khi thiết bị chuyển sang chế độ không tải. Ngay cả khi không có tùy chọn như vậy, tôi chắc chắn phải có một ứng dụng cho việc này. Vì vậy, nếu Wi-Fi bị tắt ở trạng thái IDLE thì phương pháp "ping" sẽ hoạt động nhưng bạn phải xử lý các cập nhật nền không hoạt động và cứ thế khi thiết bị chuyển sang trạng thái IDLE.

Tôi không nghĩ rằng có một ứng dụng mặc định cho giải pháp này nhưng có lẽ điểm tiếp theo sẽ giúp bạn. Bạn có thể tạo ứng dụng Android của riêng mình để nghe PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED Intent và khi nhận được một số loại yêu cầu từ máy chủ của bạn, nó có thể gửi lại nếu thiết bị còn thức hay không. Tuy nhiên, lưu ý rằng khi thiết bị của bạn nhận được yêu cầu máy chủ, nó có thể sẽ thức dậy.


Ý tưởng hay, tuy nhiên đây là một set-top-box và được kết nối qua Ethernet. Và như tôi đã viết, tôi biết rằng tôi có thể viết một ứng dụng. Các câu hỏi là nếu có cách nào đó để làm điều đó :)
Mika Fischer

AFAIK không có sự khác biệt lớn về các loại kết nối trên Android từ POV của nhà phát triển. Vì vậy, có lẽ có một ứng dụng bên 3d có thể vô hiệu hóa mọi loại kết nối, kể cả có dây khi thiết bị ở trạng thái không hoạt động.

0

Bạn có thể thiết lập tập lệnh shell để biết thiết bị có ở chế độ không tải..nếu thiết bị không hoạt động .. bạn có thể
gửi tín hiệu đến thiết bị .. Ví dụ: bạn có thể sử dụng lệnh shell adb như dưới đây: adb shell dumpsys deviceidle


Thật thú vị, tôi sẽ phải xem liệu tôi có làm cho adb hoạt động qua mạng hay không hoặc liệu máy chủ SSH có thể được sử dụng thay thế hay không.
Mika Fischer

Tuy nhiên, dumpsys deviceidlekhông thực sự hoạt động trên điện thoại của tôi ít nhất (cho Can't find service: deviceidle).
Mika Fischer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.