Я только что потратил неделю на эту проблему, поэтому я могу воздержаться от отправки SMS-сообщений домашней тревоги моей жене, когда она на работе.
Pinging не работает, потому что iPhone не будет реагировать на ICMP при спящем режиме. Чтение кеша ARP не будет работать, потому что спящий iPhone придет и уйдет (проверьте его каждые 30 секунд в течение нескольких минут).
Единственный способ, которым я нашел «надежно», определить, когда мои два iPhone находятся в моей локальной (домашней) сети, - это использовать библиотеку dotnet для PCAP для поиска любых пакетов, исходящих от любого из MAC-адресов телефонов. Например, если запустить Wireshark с захватом фильтром
ether src <iphone-mac-address>
вы увидите удивительное количество сетевого открытия/объявление трафика с телефона. У него все еще есть состояния покоя, но до сих пор самый длинный интервал, который я видел между захваченными пакетами, составляет около 10 минут. Вам придется подождать, пока вы не услышите от телефона какое-то время (я использую 15 минут), прежде чем объявлять его не дома.
С помощью этой техники вы быстро найдете телефон, когда он подключится к домашней сети, при условии, что ваш телефон настроен для DHCP. Я также использую зеркалирование портов на моем основном коммутаторе Ethernet, чтобы включить трафик из моих беспроводных точек доступа.
У меня нет решения для малины Pi для этого, потому что мой опыт в Linux очень ограничен, но кто-то может помочь вам в этом. У меня есть служба Windows, использующая библиотеку PCAP, и до сих пор она работает надежно, с ограничением ожидания 15 минут, прежде чем решить, что iPhone покинул сеть.
* Обновление 2-3-2018 *
У меня есть этот алгоритм обнаружения примерно до 5 минут, используя комбинацию пинг/Arp сообщений, направленных на каждый телефон, примерно раз в минуту. Кажется, отлично работает.
Я отказался от этого, и теперь я использую bluetooth для регулярной проверки, если мой iPhone находится в зоне действия. – PiEnthusiast
В случае, если кто-то сталкивается с этим и задается вопросом, что я делаю, чтобы обнаружить присутствие с помощью bluetooth: Я пытаюсь разрешить имя моего (известного) адреса устройства ('sudo hcitool name xx: xx: xx: xx: xx: xx'). Если я получаю действительный ответ, телефон находится в диапазоне BT. – PiEnthusiast