Disclaimer: Ky artikull është vetëm për qëllime edukative. Mos e thyej ligjin, jini të sjellshëm me fëmijët tuaj dhe mos harroni se ju jeni përgjegjës për atë që bëni me pajisjet tuaja.
Disclaimer: Ky artikull është vetëm për qëllime edukative. Mos e thyej ligjin, jini të sjellshëm me fëmijët tuaj dhe mos harroni se ju jeni përgjegjës për atë që bëni me pajisjet tuaja.
Problemi për të cilin askush nuk flet
Në një epokë ku ekranet dominojnë rutinat e gjumit, miliona tani bien në gjumë duke shikuar videot e YouTube, podcasts, ose aplikacionet streaming.
Sidoqoftë, ky zakon ka një kosto të fshehur: ekspozimi i pakontrolluar i vëllimit, veçanërisht për fëmijët.Si prind dhe zhvillues, unë u përball me këtë problem në dorë të parë – Binget e vonë të natës në YouTube të fëmijës tim çuan në gjumë të paqëndrueshëm dhe irritabilitet në mëngjes.
Aplikimet falas në Google Play Store, të tilla si Volume Limiter, Volume Control ishin një dështim: ata u rrëzuan, nuk kishin cilësime, ose ishin shumë ndërhyrëse. Ndoshta aplikacionet komerciale do të ishin më të mira, por unë e kam testuar këtë pasi ato kushtojnë para, shpesh mjaft pak.
The Hack (Totally Illegal...ish)
Unë ndërtova një skrip që lidhet me pajisjen tuaj Android pa tel dhe mban një sy në vëllimin e saj. Nëse ajo merr shumë të zhurmshme - ajo butësisht e ul atë.
Po, teknikisht, përdor ADB (Android Debug Bridge) mbi Wi-Fi, e cila është një mjet zhvilluesi dhe nuk ka për qëllim prindërimin para gjumit.
Ndërtimi i mjedisit të zhvillimit
Krijimi i një mjedisi zhvillimi dhe lidhshmëria është vendimtare para zhytjes në kod.Kjo do të sigurojë që ju të keni të gjitha mjetet dhe bibliotekat e nevojshme, duke përmirësuar procesin e zhvillimit.
Unë përdor macOS, kështu që të gjitha shembujt në histori do të jenë me këtë sistem, por duke përdorur Windows nuk e bën procesin shumë më të vështirë në krahasim me MacOS. Dallimi i vetëm është se në sistemin operativ MacOS, Python është tashmë i instaluar, dhe në Windows, ju do të duhet të instaloni Python vetë nga këtu: Windows Python
Këtu është një ndarje më e detajuar:
-
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.
Nga tani ne do të punojmë vetëm në vijën e komandës. në rastin tim, do të jetë terminali.
Ndërtimi i lidhjes
Hapi tjetër do të jetë lidhja e pajisjes suaj mobile me PC-në tuaj.Ky është një hap relativisht i thjeshtë që përbëhet nga dy pjesë:
- Lidhje me tel;
- Lidhje pa tel.
Lidhja e telave:
Duhet të lidhni pajisjen tuaj mobile me kompjuterin tuaj duke përdorur kabllon (USB A / USB C ose USB A / micro USB, etj.).
Pas kësaj, hapni terminalin dhe shkruani komandën e mëposhtme:
adb devices
Për momentin, ne jemi të gatshëm të aktivizojmë modalitetin TCP/IP me komandën e mëposhtme:
adb tcpip 5555
Nëse jemi tashmë në terminal, atëherë ne mund të kontrollojmë adresën IP të pajisjes celulare në rrjetin tonë Wi-Fi pa shikuar në pajisjen celulare. le të ekzekutojmë komandën e mëposhtme për të gjetur adresën IP që do të na duhet më vonë kur vendosim një lidhje wireless:
adb -d shell "ip route | awk '/wlan0/ {print \$9}'"
Lidhje pa tela:
Tani që keni adresën IP të pajisjes suaj, është koha për t'u lidhur pa tel. Nuk ka më nevojë për një lidhje me tel. Pasi të keni ekzekutuar adb tcpip 5555
, ju mund të çaktivizoni me siguri kabllon USB. Pjesa tjetër e magjisë do të ndodhë përmes Wi-Fi.
Sigurohuni që të dy smartphone dhe kompjuter janë në të njëjtën rrjet Wi-Fi. Pastaj, në terminalin tuaj, shkruani komandën e mëposhtme:
adb connect <DEVICE_IP>:5555
Për shembull, nëse IP-ja e pajisjes suaj është 10.0.0.108
, do të futni:
adb connect 10.0.0.108:5555
Nëse gjithçka shkon mirë, do të shihni një mesazh si:
Le të flasim për problemin përsëri
Le të bëjmë një hap mbrapa dhe të kujtojmë se çfarë po zgjidhim. Fëmija juaj bie në gjumë paqësisht duke shikuar një video të qetë - ndoshta një histori në gjumë ose disa tinguj relaksues. Por dy orë më vonë? Autoplay-i i YouTube-it fillon, një reklamë e fuqishme, ose një soundtrack i karikaturave me energji të lartë i zgjon ata. Ata janë groggy. Ju jeni groggy. Çdokush fillon ditën e tyre tashmë të zbrazët. Çfarë na duhej ishte një roje e heshtur - diçka e padukshme dhe e besueshme. Një sistem që do të ulte butësisht vëllimin në sfond pa ndaluar riprodhimin, pa flashing pop-ups irrituese, dhe pa zgjuar
Arkitektura në një vështrim
Këtu është një diagram i shpejtë që tregon se si gjithçka lidhet:
Kompjuteri juaj (duke drejtuar skripin Python) lidhet me pajisjen Android përmes ADB nëpërmjet Wi-Fi, monitoron vëllimin periodikisht dhe e zvogëlon atë nëse është e nevojshme.Kompjuteri juaj (duke drejtuar skripin Python) lidhet me pajisjen Android përmes ADB nëpërmjet Wi-Fi, monitoron vëllimin periodikisht dhe e zvogëlon atë nëse është e nevojshme.
Skript që bën magji
Bërthama e zgjidhjes është një skrip Python që komunikon me pajisjen tuaj Android përmes ADB përmes Wi-Fi.
Çdo 30 sekonda, kontrollohet vëllimi aktual i muzikës.Nëse vëllimi është mbi 5 (Android zakonisht përdor një shkallë prej 15 pikësh), skripti e ul me butësi atë - një hap në një kohë, me pauza të shkurtra.Nëse vëllimi është tashmë 5 ose më pak, ai thjesht ruan shikimin - duke pritur në heshtje në rast se vëllimi ngrihet përsëri.
Pjesa më e mirë? Ajo respekton ndryshimet manuale. Nëse dikush ul vetë vëllimin, skripti vë re dhe nuk ndërhyn. Ajo është e qetë. Ajo është adaptive. Ajo është e padukshme – ashtu si një asistent i mirë i gjumit duhet të jetë.
Evolucioni i Script: Nga hack i vogël në mjet të besueshëm
Kur shkrova për herë të parë këtë skenar, ishte vetëm disa rreshta e gjatë.
Ajo dukej diçka si kjo:
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'")
Por së shpejti, realiteti filloi.Çfarë ndodh nëse pajisja shkëputet në mes të natës?Çfarë nëse ADB hedh një timeout?Çfarë nëse telefoni nuk është i bashkuar?Çfarë nëse skripti rrëzohet ndërsa të gjithë janë në gjumë?
Kështu që skenarët kanë evoluar.
- Ndonjëherë, pajisja nuk ishte e lidhur. Kështu që kam shtuar
adb connect ip:port
. - Ndonjëherë ADB u rrëzua në mes të natës. Kam shtuar trajtim përjashtim dhe retries.
- Logging? Po, shtoi edhe këtë.
- File logging dhe console logging? Natyrisht.
- Volume ndryshon në mes të gjumit? Tani, skripti gjurmon edhe këtë - dhe ndërhyn vetëm kur është e nevojshme.
- Frekvenca e monitorimit?
Ajo që filloi si disa rreshta të skripit u shndërrua në një qenush të vogël që kujdeset për telefonin tuaj - kështu që ju nuk duhet të.
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.")
Sot, skripti është i shkallës së prodhimit - dhe me burim të hapur. por sigurohuni që ta ndryshoni këtë linjë ADB_DEVICE = "10.0.0.108:5555" në skrip me adresën tuaj IP nga "Setting Up Your Connection".
Running the Script: Dy opsione të lehta si dhe Cron
Ju keni dy mënyra kryesore për të drejtuar skripin:
- Direktisht me Python
Nëse keni Python 3 të instaluar, thjesht mund të ekzekutoni:
python3 reduce_volume.py
Ajo do të fillojë menjëherë dhe do të bëjë punën e saj në heshtje në sfond.
- Si një ekzekutues i pavarur
Dua ta ndaj atë me dikë që nuk ka Python instaluar?
Ju mund ta ktheni skripin në një standalone
.app
për macOS ose.exe
për Windows, duke përdorur PyInstaller:pyinstaller --onefile reduce_volume.py
Kjo do të krijojë një aplikacion portativ që mund të fillohet me një klikim të dyfishtë - nuk kërkohet Python.
- Edhe planifikoni atë me një punë cron ose planifikues detyrash nëse jeni fancy.
Një gjë tjetër: Kufizimet e ADB-së në distancë
Është e rëndësishme të theksohet se ADB mbi Wi-Fi mund të jetë i brishtë.
Lidhja juaj e largët do të ndërpritet nëse:
- Telefoni rifillon.
- Rrjeti Wi-Fi ndryshon.
- Rrjeti i zhvilluesit ose Debugging USB është i çaktivizuar.
- Drejtuesi shkon shumë gjatë pa aktivitet ADB (disa sisteme automatikisht fillojnë lidhjet joaktive).
- Dhe shumë të tjerë ...
Kështu që nëse skripti ndalon së punuari, thjesht përsëritni hapat nga "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
dhe ju do të jeni përsëri në biznes.
Mendimet përfundimtare
Ky hack nuk ka të bëjë me heshtjen e argëtimit të fëmijës tuaj.Kjo është për të mbrojtur gjumin e tyre - dhe shëndetin tuaj - nga surpriza të papritura teknologjike.
Kjo mund të jetë një skenar i vogël, por për familjen time dhe mua, ishte një ndryshim i jetës. Jo më 2 AM YouTube zgjohet. Jo më mëngjeset e mërzitshme. Vetëm netë të qeta dhe një pjesë delikate e automatizimit të prindërimit.
- A është pak e një hack? Sigurisht.
- A funksionon në mënyrë të besueshme? Absolutisht.
- A është e ligjshme? Teknikisht po, por funksionon në një zonë gri (qasje ADB dhe kontroll automatik nuk janë mbështetur zyrtarisht nga Google për përdoruesit e fundit).
- Por ju e dini çfarë? Për sa kohë që ndihmon një prind të lodhur (ose edhe veten) të flejë më mirë - ia vlen.
- Është e hollë.
- Është e padukshme.
- Dhe funksionon.
Më tregoni nëse dëshironi kodin burimor, një konfigurim me një klikim ose një version të përmirësuar.
Dhe hey - fle mirë. ju keni fituar atë.
P.S. Kjo zgjidhje mund të përmirësohet dhe zgjerohet - për shembull, të vendosni një orar, të përshtateni me profile të ndryshme, të gjurmoni aktivitetin e pajisjes, etj. Por edhe në formën e saj themelore, ajo tashmë zgjidh problemin kryesor: ju ndihmon të flini - dhe të flini paqësisht.
P.S. Kjo zgjidhje mund të përmirësohet dhe zgjerohet - për shembull, të vendoset një orar, të përshtatet në profile të ndryshme, të gjurmohet aktiviteti i pajisjes, etj. Por edhe në formën e saj themelore, tashmë zgjidh problemin kryesor: ju ndihmon të flini - dhe të flini qetësisht.