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.
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.
Det problem 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.
Free apps i Google Play Store, som Volume Limiter, Volume Control var 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 testet dette, da de kostede penge, ofte ganske lidt.
The Hack (Totalt ulovligt...ish)
Jeg har opbygget 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.
Ja, teknisk set bruger den ADB (Android Debug Bridge) over Wi-Fi, som er et udviklerværktøj og ikke beregnet til bedtime forældre.
Indstilling af dit udviklingsmiljø
At oprette et udviklingsmiljø og konnektivitet 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 udviklingen.
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, Python er allerede installeret, og i Windows, skal du installere Python selv herfra: Windows Python
Her er en mere detaljeret opdeling:
-
Download and Extract Platform Tools:
-
Go to the official Android Developers website:
- Navigate to Android SDK Platform-Tools.
-
Download the SDK Platform Tools:
- Download the latest version for your operating system (Windows, macOS, or Linux).
- Extract the ZIP file: Extract the downloaded ZIP file to a location of your choice (e.g., C:\adb on Windows).
C:\adb
-
-
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).
From now on, we will work only in the command line. In my case, it will be the terminal.
-
-
-
Verify ADB Installation:
-
Open a command line interface (CLI):
- Using the Windows Search Bar (Windows OS):
- Click the Start button or the magnifying glass icon in the taskbar.
- Type "cmd" (without quotes) in the search bar.
- Click on the "Command Prompt" result.
- To run as administrator, right-click on "Command Prompt" in the search results and select "Run as administrator".
- Using Spotlight Search (macOS):
- Click the magnifying glass icon in the menu bar (or press Cmd+Space).
- Type "Terminal" and double-click it to open.
- Using the Windows Search Bar (Windows OS):
-
Type adb and press Enter.
adb
-
If adb is installed correctly, you should see the ADB help message.
-
-
Enable USB Debugging on your Android Device:
- Go to "Settings" on your Android device.
- Scroll down and select "About Phone".
- Find "Build Number" and tap it 7 or more times to unlock Developer Options.
- Go back to the main "Settings" page, and now you'll see "Developer Options".
- Select "Developer Options".
- Scroll down to "USB Debugging" and toggle it on.
Fra nu af vil vi kun arbejde i kommandolinjen. i mit tilfælde vil det være terminalen.
Indstilling af din forbindelse
Det næste skridt vil være at forbinde din mobile enhed til din pc. Dette er et relativt simpelt trin, der består af to dele:
- Trådforbindelse;
- Trådløs forbindelse.
Tilslutning til tråd:
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
For nu 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 tjekke 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}'"
Trådløs forbindelse:
Nu hvor du har din enheds IP-adresse, er det tid til at forbinde trådløst. Der er ikke længere brug for en trådløs forbindelse. Når du har kørt adb tcpip 5555
, kan du sikkert afbryde USB-kabel.
Vær sikker på, at både din smartphone og din computer er på samme Wi-Fi-netværk.
adb connect <DEVICE_IP>:5555
For eksempel, hvis din enheds IP er 10.0.0.108
, vil du indtaste:
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 fredeligt i søvn og ser en stille video - måske en sengetidshistorie eller nogle afslappende lyde. Men to timer senere? YouTube's auto-play kicker 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ålideligt. Et system, der forsigtigt ville sænke lydstyrken 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 ved et kig
Her er et hurtigt diagram, der viser, hvordan alt forbinder:
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.
Din computer (der kører Python-skriptet) opretter forbindelse til Android-enheden via ADB via Wi-Fi, overvåger lydstyrken 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.
Den bedste del? Det respekterer manuelle ændringer. Hvis nogen selv sænker lydstyrken, bemærker manuskriptet og forstyrrer ikke. Det er stille. Det er tilpasningsdygtigt. 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 næppe et par linjer lang.
Det så 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'")
Men snart gik virkeligheden i gang.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 styrter, mens alle sover?
Så udviklede manuskriptet sig.
- Nogle gange var enheden ikke tilsluttet. Så jeg tilføjede
adb connect ip:port
. - Nogle gange ADB kollapsede midt om natten. Jeg tilføjede undtagelse håndtering og retries.
- Logging? Ja, tilføjede det også.
- File logging og konsol logging? Selvfølgelig.
- Volumen ændrer sig midt i søvnen? Nu sporer scriptet det også - og kun griber ind, når det er nødvendigt.
- Frekvensovervågning? Forskellige intervaller for høje vs
Hvad begyndte som et par linjer af script blev til en lille vagthund, der babysitter din telefon - så du behøver ikke.
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.")
Kør skriptet: To nemme muligheder såvel som Cron
Du har to hovedmåder at køre skriptet på:
- Direkt med Python
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.
- Som en selvstændig udførbar
Vil du dele den med nogen, der ikke har Python installeret?
Du kan konvertere scriptet til en selvstændig
.app
til macOS eller.exe
til Windows ved hjælp af PyInstaller:pyinstaller --onefile reduce_volume.py
Dette vil skabe en bærbar app, der kan lanceres med et dobbeltklik - ingen Python kræves.
- Selv planlægge det med en cron job eller opgaveplanlægger, hvis du er fancy.
One More Thing: Fjern ADB Begrænsninger
Det er vigtigt at bemærke, at ADB over Wi-Fi kan være skrøbeligt.
Din fjernforbindelse vil bryde, hvis:
- Telefonen genstarter.
- Wi-Fi-netværket ændrer sig.
- Developer Mode eller USB Debugging bliver deaktiveret.
- Enheden går for længe uden ADB-aktivitet (nogle systemer kicker automatisk inaktive forbindelser).
- Og mange andre ...
Så hvis scriptet holder op med at fungere, skal du blot gentage trinene fra "Setting Up Your Connection":
-
Connect the mobile device with a wire to your personal computer.
-
Run the command
adb tcpip 5555
adb tcpip 5555
-
And run
adb connect <DEVICE_IP>:5555
adb connect 10.0.0.108:5555
og du vil være tilbage i erhvervslivet.
De sidste tanker
Denne hack handler ikke om at stille dit barns sjov. 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 op. Ikke mere kranke morgener. Bare fredelige nætter og en subtil smule forældreautomation.
- Er det lidt af en hack? Sikker.
- Fungerer det pålideligt? Absolut.
- Er det lovligt? Teknisk set ja, men det opererer i en grå zone (ADB-adgang og automatiseret kontrol understøttes ikke officielt af Google for slutbrugere).
- Men du ved hvad? Så længe det hjælper en træt forælder (eller endda dig selv) sove bedre - det er det værd.
- Det er subtle.
- Det er usynligt.
- Og det virker.
Lad mig vide, om du vil have kildekoden, en one-click opsætning eller en forbedret version.
Og hej - sove 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 osv. 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.
P.S. Denne løsning kan forbedres og udvides - for eksempel oprette en tidsplan, tilpasse sig forskellige profiler, spore enhedsaktivitet osv. 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.