Skip to content

Disable TCP keepalives to avoid constantly waking iOS devices#36

Merged
brutella merged 1 commit into
brutella:masterfrom
geekman:master
Aug 8, 2023
Merged

Disable TCP keepalives to avoid constantly waking iOS devices#36
brutella merged 1 commit into
brutella:masterfrom
geekman:master

Conversation

@geekman
Copy link
Copy Markdown
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
Copy Markdown
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