Skip to content

Disable TCP keepalives to avoid constantly waking iOS devices #36

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 8, 2023

Conversation

geekman
Copy link
Contributor

@geekman geekman commented Aug 7, 2023

I noticed that my iPhone battery life has been quite bad after deploying a HAP server, and under Battery Settings during an idle period it says "Home - 100%". Running tcpdump shows that after the initial connection, Linux starts sending TCP keepalives every 15s or so, and the phone always answers. I believe this is keeping the phone (and also my iPad) awake.

HAP specifications section 6.2.3 also mentions this case specifically:

• HAP accessory servers must not use keepalive messages, which periodically wake up iOS devices.

This patch prevents keepalives from being sent out, and I've verified that it's quiet now when there's no changes/updates to HAP states.

@brutella
Copy link
Owner

brutella commented Aug 8, 2023

I've also noticed an increased battery usage of the Apple Home app on iOS 17. Thanks for your pull request.

@brutella brutella merged commit 04622f3 into brutella:master Aug 8, 2023
geekman added a commit to geekman/hapz2m that referenced this pull request Aug 8, 2023
It looks like Go has adopted 15s TCP keepalives as a default for _all_
TCP connections, which is quite dumb if you ask me.
golang/go#48622

For the HAP server's side, it degrades iOS battery life significantly by
waking the device every 15s to respond to these packets. In the case as
a normal MQTT client, it increases traffic on top of the 60s keepalive
we've already set at the application layer. In both cases, the solution
is to just explicitly disable TCP keepalives.

Upgrade hap to the latest version that contains the fix brutella/hap#36.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants