Disclaimer: Denne artikel er kun til uddannelsesmæssige formål. bryd ikke loven, vær venlig over for dine børn, og glem ikke, at du er ansvarlig for, hvad du gør med dine egne enheder.
afDisclaimer: This article is for educational purposes only. Don't break the law, be nice to your kids, and don't forget that you're responsible for what you do with your own devices.
Problemet ingen taler om
I en tid, hvor skærme dominerer sengetid rutiner, millioner nu falder i søvn til YouTube videoer, podcasts eller streaming apps.
Men denne vane har en skjult pris: ukontrolleret volumeneksponering, især for børn.Som forælder og udvikler, stod jeg over for dette problem fra første hånd - mit barns sent nat YouTube binges førte til rastløs søvn og morgen irritabilitet.
Gratis apps i Google Play-butikken, somBegrænset volumen, derKontrol af volumenvar en fiasko: de styrtede ned, havde ingen indstillinger, eller var for påtrængende. Måske kommercielle apps ville være bedre, men jeg har ikke testet dette, da de koster penge, ofte ganske lidt.
The Hack (Totalt ulovligt...ish)
Jeg byggede et script, der opretter forbindelse til din Android-enhed trådløst og holder øje med dens lydstyrke. Hvis det bliver for højt - det sænker det forsigtigt. ingen stop video, ingen skærmblink, ingen brugerinteraktion.
Ja, teknisk, det bruger ADB (Android Debug Bridge) over Wi-Fi, som er et udviklerværktøj og ikke beregnet til sengetid forældre.
Skab dit udviklingsmiljø
Opsætning af et udviklingsmiljø og tilslutning er afgørende, før du dykker ind i koden. Dette vil sikre, at du har alle de nødvendige værktøjer og biblioteker, der strømliner udviklingsprocessen.
Jeg bruger macOS, så alle eksempler i historien vil være med dette system, men ved hjælp af Windows gør processen ikke meget vanskeligere i forhold til macOS.Den eneste forskel er, at i macOS-operativsystemet er Python allerede installeret, og i Windows skal du installere Python selv herfra:Windows med Python
Her er en mere detaljeret opdeling:
- af
- Download og udtræk platformværktøjer: Gå til den officielle Android Developers hjemmeside: Navigér til Android SDK Platform-værktøjer. Download SDK Platform Tools: Download den nyeste version til dit operativsystem (Windows, macOS eller Linux). Udtræk ZIP-filen: Udtræk den downloadede ZIP-fil til et sted efter eget valg (f.eks. C:\adb på Windows). af
-
Add Platform Tools to your System's PATH:
-
Windows:
- Open the "Environment Variables" settings (search for "Environment Variables" in the Start menu).
- Click "Edit the system environment variables".
- Click "Environment Variables".
- In the "System variables" section, find the "Path" variable, select it, and click "Edit".
- Click "New" and add the path to the platform-tools directory (e.g., C:\adb).
-
macOS/Linux:
-
Open your terminal.
-
Add the path to the platform-tools directory to your shell's configuration file (e.g., ~/.bashrc, ~/.zshrc).
For example: export PATH=$PATH:/path/to/platform-tools.
export PATH=$PATH:/usr/local/bin/adb echo $PATH | tr ":" "\n"
In my case, it’ll be something like this:
-
Restart your terminal or source the configuration file (e.g., source ~/.bashrc).
Fra nu af vil vi kun arbejde i kommandolinjen. I mit tilfælde vil det være terminalen.
-
af -
- Kontroller ADB Installation: Åbn en kommandolinje interface (CLI): Brug Windows Search Bar (Windows OS): Klik på Start-knappen eller forstørrelsesglasikonet i opgavelinjen. Skriv "cmd" (uden citater) i søgefeltet. Klik på "Command Prompt" resultat. For at køre som administrator skal du højreklikke på "Command Prompt" i søgeresultaterne og vælge "Kør som administrator". Brug Spotlight Search (macOS): Klik på forstørrelsesglasikonet i menulinjen (eller tryk på Cmd+Space). Skriv "Terminal" og dobbeltklik på det for at åbne det. Typ adb og tryk på Enter. adb Hvis adb er installeret korrekt, skal du se ADB hjælp besked. af
- Aktiver USB Debugging på din Android-enhed: Gå til "Indstillinger" på din Android-enhed. Rul ned og vælg "Om telefonen". Find "Build Number" og tryk på det 7 eller flere gange for at låse Optioner for udviklere. Gå tilbage til den vigtigste "Indstillinger" side, og nu vil du se "Optioner for udviklere". Vælg "Optioner for udviklere". Rul ned til "USB Debugging" og skift det til. af
Fra nu af vil vi kun arbejde i kommandolinjen. I mit tilfælde vil det være terminalen.
Opret din forbindelse
Det næste skridt vil være at forbinde din mobile enhed med din pc. Dette er et relativt simpelt trin, der består af to dele:
- af
- trådbundne forbindelser; af
- Wireless connection. af
Wire forbindelse:
Du skal tilslutte din mobile enhed til din pc ved hjælp af kablet (USB A/USB C eller USB A/micro USB osv.).
Derefter åbner du terminalen og skriver følgende kommando:
adb devices
I øjeblikket er vi klar til at aktivere TCP/IP-tilstand med følgende kommando:
adb tcpip 5555
Hvis vi allerede er i terminalen, så kan vi kontrollere IP-adressen på den mobile enhed i vores Wi-Fi-netværk uden at kigge på den mobile enhed.
adb -d shell "ip route | awk '/wlan0/ {print \$9}'"
Den trådløse forbindelse:
Nu hvor du har din enheds IP-adresse, er det tid til at oprette en trådløs forbindelse. Der er ikke længere brug for en trådløs forbindelse.adb tcpip 5555
, du kan sikkert fjerne USB-kabel. resten af magien vil ske over Wi-Fi.
Sørg for, at både din smartphone og din computer er på samme Wi-Fi-netværk.
adb connect <DEVICE_IP>:5555
For eksempel, hvis din enhed IP er10.0.0.108
Du vil komme ind:
adb connect 10.0.0.108:5555
Hvis alt går godt, vil du se en besked som:
Lad os tale om problemet igen
Lad os tage et skridt tilbage og huske, hvad vi løser. Dit barn falder i søvn fredeligt og ser en stille video - måske en sengetidshistorie eller nogle afslappende lyde. Men to timer senere? YouTube's auto-play sparker ind, en høj ad blarer, eller nogle høj energi tegneserie soundtrack vækker dem. De er groggy. Du er groggy. Alle starter deres dag allerede drænet. Hvad vi havde brug for var en tavs vagter - noget usynligt og pålidelig. Et system, der forsigtigt ville sænke mængden i baggrunden uden at stoppe afspilning, uden at blinke irriterende pop-ups, og uden at vække brugeren. Det er præcis, hvad dette script gør.
Arkitektur i et kig
Her er et hurtigt diagram, der viser, hvordan alt forbinder:
afDin computer (der kører Python-skriptet) opretter forbindelse til Android-enheden via ADB via Wi-Fi, overvåger mængden regelmæssigt og reducerer den, hvis det er nødvendigt.
af
Din computer (der kører Python-skriptet) opretter forbindelse til Android-enheden via ADB via Wi-Fi, overvåger mængden regelmæssigt og reducerer den, hvis det er nødvendigt.
Skriptet, der gør magien
Kernen i løsningen er et Python-script, der kommunikerer med din Android-enhed via ADB over Wi-Fi.
Hvis lydstyrken er over 5 (Android bruger typisk en 15-punkts skala), sænker scriptet forsigtigt det - et skridt ad gangen, med korte pauser.
Den bedste del? Det respekterer manuelle ændringer. Hvis nogen selv sænker lydstyrken, bemærker manuskriptet og forstyrrer ikke. Det er stille. Det er adaptivt. Det er usynligt - ligesom en god sengetid assistent skal være.
The Script’s Evolution: Fra lille hack til pålideligt værktøj
Da jeg først skrev dette manuskript, var det kun få linjer langt.
Det så lidt sådan ud:
import subprocess
import time
import re
def get_stream_volume():
cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'"
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
match = re.search(r'streamVolume:(\d+)', result.stdout)
return int(match.group(1)) if match else None
def set_volume(level):
cmd = f"adb shell cmd media_session volume --stream 3 --set {level}"
subprocess.run(cmd, shell=True)
print(f"Volume set to {level}")
def monitor_volume():
while True:
volume = get_stream_volume()
if volume is None:
print("Failed to get volume level. Retrying...")
time.sleep(5)
continue
print(f"Current volume: {volume}")
if volume == 15:
for vol in range(14, 4, -1):
set_volume(vol)
time.sleep(30)
while get_stream_volume() == 5:
print("Volume is at 5, monitoring every 60 seconds...")
time.sleep(60)
if __name__ == "__main__":
monitor_volume()
os.system("adb shell dumpsys audio | grep -i 'streamVolume'")
Hvad sker der, hvis enheden afbryder forbindelsen midt om natten? Hvad sker der, hvis ADB kaster en timeout? Hvad sker der, hvis telefonen ikke er parret? Hvad sker der, hvis manuskriptet kolliderer, mens alle sover?
Så udviklede manuskriptet sig.
- af
- Så jeg tilføjede adb connect ip:port. af
- Nogle gange kollapsede ADB midt om natten. Jeg tilføjede undtagelseshåndtering og retries.
- Ja, det tilføjede jeg også. af
- Fil logging og konsol logging? selvfølgelig. af
- Nu følger manuskriptet også det – og griber kun ind, når det er nødvendigt. af
- Forskellige intervaller for høje vs. lave volumenniveauer. af
- Og ja, graceful shutdown Ctrl + C. af
Hvad der startede som et par linjer af scriptet blev til en lille vagthund, der babysitter din telefon - så du behøver ikke at.
import subprocess
import time
import re
import logging
from datetime import datetime
logging.basicConfig(
filename='volume_control.log',
level=logging.INFO,
format='[%(asctime)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
ADB_DEVICE = "10.0.0.108:5555"
def log(message):
timestamp = get_timestamp()
print(f'[{timestamp}] {message}')
logging.info(message)
def get_timestamp():
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def connect_adb():
subprocess.run(f"adb connect {ADB_DEVICE}", shell=True)
log(f"Reconnected to ADB at {ADB_DEVICE}")
def get_stream_volume():
cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'"
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
match = re.search(r'streamVolume:(\d+)', result.stdout)
return int(match.group(1)) if match else None
def safe_get_stream_volume(retries=3, delay=5):
for attempt in range(retries):
volume = get_stream_volume()
if volume is not None:
return volume
log(f"Attempt {attempt + 1}: Failed to get volume. Retrying after reconnect...")
connect_adb()
time.sleep(delay)
log("All attempts failed. Giving up temporarily.")
return None
def set_volume(level):
cmd = f"adb shell cmd media_session volume --stream 3 --set {level}"
subprocess.run(cmd, shell=True)
log(f"Volume set to {level}, waiting 30 seconds...")
def monitor_volume():
while True:
volume = safe_get_stream_volume()
if volume is None:
log("Initial volume read failed. Retrying in 30 seconds...")
time.sleep(30)
continue
log(f"Current volume: {volume}")
while volume > 5:
set_volume(volume - 1)
time.sleep(30)
volume = safe_get_stream_volume()
if volume is None:
log("Failed to read volume during decreasing.")
break
while True:
volume = safe_get_stream_volume()
if volume is None:
log("Failed to read volume during monitoring.")
time.sleep(30)
break
if volume > 5:
log(f"Volume increased to {volume}, restarting decreasing")
break
log(f"Volume is at {volume}, monitoring every 60 seconds...")
time.sleep(60)
if __name__ == "__main__":
try:
monitor_volume()
except KeyboardInterrupt:
log("Script stopped by user (Ctrl+C)")
except Exception as e:
log(f"Unexpected error: {e}")
finally:
log("Script exited.")
I dag er scriptet i produktionsklasse – og open source. Men sørg for at ændre denne linje ADB_DEVICE = "10.0.0.108:5555" i scriptet med din IP-adresse fra“Sæt din forbindelse op”af .
Kør skriptet: To nemme muligheder såvel som Cron
Du har to primære måder at køre manuskriptet på:
- Direkte med Python af
Hvis du har Python 3 installeret, kan du bare køre:
python3 reduce_volume.py
Det vil starte med det samme og gøre sit arbejde stille i baggrunden.
- af
- Som en selvstændig udøvende af
Vil du dele den med nogen, der ikke har Python installeret?
Du kan konvertere scriptet til en standalone.app
til macOS eller.exe
for Windows, ved hjælp afPyInstaller: af
pyinstaller --onefile reduce_volume.py
Dette vil skabe en bærbar app, der kan lanceres med et dobbeltklik - ingen Python kræves.
- af
- Selv planlægge det med en cron job eller opgave planlægger, hvis du er fancy. af
Endnu en ting: Remote ADB Begrænsninger
Det er vigtigt at bemærke, at ADB over Wi-Fi kan være skrøbeligt.
Din fjernforbindelse vil bryde, hvis:
- af
- Telefonen er reboot. af
- Wi-Fi netværk ændrer sig. af
- Udviklertilstand eller USB Debugging bliver deaktiveret. af
- Enheden kører for længe uden ADB aktivitet (nogle systemer auto-kick inaktive forbindelser). af
- Og mange andre... af
Så hvis manuskriptet holder op med at fungere, skal du blot gentage trinene fra“Sæt din forbindelse op”: af
- af
- Tilslut mobilenheden med en tråd til din personlige computer. af
- Udfør adb tcpip 5555 adb tcpip 5555 af
- Og kør adb connect <DEVICE_IP>:5555 af
adb connect 10.0.0.108:5555
Du kommer tilbage i erhvervslivet.
Afsluttende tanker
Det handler om at beskytte deres søvn - og dit sind - fra uventede teknologiske overraskelser.
Dette kan være et lille script, men for min familie og mig var det livsforandrende. Ikke mere 2 AM YouTube-vågne. Ikke mere kranke morgener. Bare fredelige nætter og en subtil smule forældreautomatisering.
- af
- Er det lidt af en hack? af
- Fungerer det pålideligt? helt sikkert. af
- Teknisk set ja, men det opererer i en grå zone (ADB-adgang og automatisk styring understøttes ikke officielt af Google for slutbrugere). af
- Så længe det hjælper en træt forælder (eller endda dig selv) sove bedre - det er det værd. af
- Det er subtilt. af
- Det er usynligt. af
- Og det virker. af
Lad mig vide, om du vil have kildekoden, en one-click opsætning eller en forbedret version.
Sov godt, du har fortjent det.
P.S. Denne løsning kan forbedres og udvides - for eksempel oprette en tidsplan, tilpasse sig forskellige profiler, spore enhedsaktivitet mv. Men selv i sin grundlæggende form løser den allerede hovedproblemet: det hjælper dig med at falde i søvn - og sove fredeligt.
afP.S. Denne løsning kan forbedres og udvides - for eksempel oprette en tidsplan, tilpasse sig forskellige profiler, spore enhedsaktivitet mv. Men selv i sin grundlæggende form løser den allerede hovedproblemet: det hjælper dig med at falde i søvn - og sove fredeligt.