Eddystone-URL does not support app intent or app install URLs

Wer lesen kann ist klar im Vorteil und ich gebe zu, dieses mal habe ich einen halben Sonntag damit verschwendet herauszufinden, warum mein Eddystone nicht so richtig will. Dabei hätte ich einfach nur unter „https://developers.google.com/beacons/get-started“ den folgenden Abschnitt lesen brauchen:

Eddystone-URL lets you advertise a URL (HTTP or HTTPS), and is designed for interacting with the Physical Web. Nearby Notifications can also show HTTPS URLs broadcast from Eddystone-URL devices, although Eddystone-URL does not support app intent or app install URLs. We recommend using a URL redirector to enable the use of longer URLs, and to make it possible to update the URL after the beacon is deployed. When using this frame type, you cannot register the beacon with Google. Once you have provisioned the beacon, no further steps are required. If you provisioned your beacons using Eddystone-UID or Eddystone-EID, continue to the next step. If you provisioned your beacons using Eddystone-URL, you’re done!

Aber immerhin habe ich eine ganze Menge über das Physical-Web erfahren, was über eine oberflächliche Betrachtung deutlich hinaus geht und ich habe erfahren, wie schnell man im Web selbst über so spezielle Themen Support bekommt.
Aus purer Verzweiflung habe ich alle Logs (siehe unten) gesammelt und einen Issue unter github.com aufgemacht (https://github.com/google/physical-web/issues/948) und noch am selben Tag eine Antwort bekommen.

Android Logcat logs & Server Logs

2018-10-07 12:21:42.158 530-18111/? I/vendor.qti.bluetooth@1.0-ibs_handler: SerialClockVote: vote for UART CLK ON
2018-10-07 12:21:42.160 530-18111/? D/vendor.qti.bluetooth@1.0-wake_lock: Acquire wakelock is acquired 
2018-10-07 12:21:42.160 530-18111/? I/vendor.qti.bluetooth@1.0-ibs_handler: ProcessIbsCmd: Writing IBS_WAKE_ACK
2018-10-07 12:21:42.166 529-1433/? D/audio_hw_primary: out_standby: enter: stream (0xe788e380) usecase(1: low-latency-playback)
2018-10-07 12:21:42.170 9795-17994/? W/NearbyDiscovery: Disabled by server: https://ux5.de/app, https://play.google.com/store/apps/details?id=com.jentsch.smartsquares, URL invalid: https://play.google.com/store/apps/details?id=com.jentsch.smartsquares [CONTEXT service_id=49 ]
2018-10-07 12:21:42.171 9795-17994/? W/NearbyDiscovery: Disabled by server: https://ux5.de/app, https://play.google.com/store/apps/details?id=com.jentsch.smartsquares, URL invalid: https://play.google.com/store/apps/details?id=com.jentsch.smartsquares [CONTEXT service_id=49 ]
2018-10-07 12:21:42.202 530-18111/? I/vendor.qti.bluetooth@1.0-ibs_handler: ProcessIbsCmd: Received IBS_SLEEP_IND: 0xFE
2018-10-07 12:21:42.202 530-18111/? I/vendor.qti.bluetooth@1.0-ibs_handler: SerialClockVote: vote for UART CLK OFF
2018-10-07 12:21:42.202 530-18111/? E/vendor.qti.bluetooth@1.0-wake_lock: Release wakelock is released 

66.249.69.118 - - [07/Oct/2018:12:10:02 +0200] "GET /app HTTP/1.1" 301 2631 "-" "Mozilla/5.0 (Google-PhysicalWeb)"
66.249.69.116 - - [07/Oct/2018:12:18:39 +0200] "GET /app HTTP/1.1" 301 2631 "-" "Mozilla/5.0 (Google-PhysicalWeb)"
66.249.81.178 - - [07/Oct/2018:13:02:02 +0200] "GET /game HTTP/1.1" 301 2631 "-" "Mozilla/5.0 (Google-PhysicalWeb)" 
66.249.69.116 - - [07/Oct/2018:13:07:53 +0200] "GET /game HTTP/1.1" 301 2631 "-" "Mozilla/5.0 (Google-PhysicalWeb)"

Daraufhin habe ich einen anderen URL (ohne eine Google-Play Weiterleitung) versucht und es hat auf Anhieb funktioniert. Nun habe ich einen Raspberry-Pi Zero-W, der sich wie ein Eddystone Beacon verhält und auf http://playsudoku.de/ verweist.

Die Regeln brechen

Auch wenn Google keine „app install URLs“ erlaubt, so ist es doch mit Hilfe eines URL-Shorteners recht einfach auf dieses Problem zu reagieren, falls man doch einen app install URL auf play.google.com anbieten möchte. Dank des User-Agents „Mozilla/5.0 (Google-PhysicalWeb)“ kann man ganz einfach erkennen, ob es sich um ein Klick auf den Link vom Handy/PC oder eine Link-Überprüfung durch einen Bot handelt.
In einem PHP Sktip kann man z.B. folgendes tun.

$ua = $_SERVER['HTTP_USER_AGENT'];
if ($ua == "Mozilla/5.0 (Google-PhysicalWeb)")
{
    // Show fake content 
} else {
    // 301 Redirect auf einen https://play.google.com/... URL
}

Natürlich sind das nur theoretische Überlegungen, die man nicht umsetzen sollte. Schließlich hat Google sich diese Regel nicht zum Spaß einfallen lassen sondern einen guten Grund dafür, so eine Regel aufzustellen – vermute ich :-).

Raspberry-Pi in einen Eddystone Beacon verwandeln

Das Skript mit dem ich den Raspberry-Pi in einen Eddystone Beacon verwandle sieht nun wie folgt aus:

#!/bin/sh -e
# set -x

sudo hciconfig hci0 down
sudo hciconfig hci0 reset
sudo hciconfig hci0 up

# enable non-connectable undirected advertisements (only works with recent hciconfig)
sudo hciconfig hci0 leadv 3

# custom hci commands take two parameters:
# 0x08       opcode group (LE)
# 0x0008     opcode command (set LE adv data)

# set random device address
sudo hcitool -i hci0 cmd 0x08 0x0005 11 34 56 78 90 BC

# set advertising parameters

# 00 08 00 08  min/max adv. interval
# 03           non-connectable undirected advertising
# 01           own address is random (see previous command)
# 00           target address is public (not used for undirected advertising)
# 00 00 00 ... target address (not used for undirected advertising)
# 07           adv. channel map (enable all)
# 00           filter policy (allow any)
sudo hcitool -i hci0 cmd 0x08 0x0006  00 08  00 08  03  01  00  00 00 00 00 00 00  07  00

# enable advertising (00 = disable)
sudo hcitool -i hci0 cmd 0x08 0x000A  01

# set advertisement data (_after_ advertising is enabled)

# 0e         adv data length (should be at most 0x15 for compatibility with NRF24L01+)
# 02 01 06   flags (LE-only device, general discoverable mode)
# 07 09 ...  name
# 02 ff fe   custom data (02 length, ff type, fe data)
# 00 00 ...  padding (to 32 bytes including length)

# http://yencarnacion.github.io/eddystone-url-calculator/
# https://ux5.de/game
# https://play.google.com/store/apps/details?id=com.jentsch.smartsquares
# sudo hcitool -i hci0 cmd 0x08 0x0008 19 02 01 06 03 03 aa fe 11 16 aa fe 10 00 03 75 78 35 2e 64 65 2f 67 61 6d 65 00 00 00 00 00 00

# https://playsudoku.de/
sudo hcitool -i hci0 cmd 0x08 0x0008 1c 02 01 06 03 03 aa fe 14 16 aa fe 10 00 03 70 6c 61 79 73 75 64 6f 6b 75 2e 64 65 2f 00 00 00
logger -s "Eddystone: https://playsudoku.de/"

exit 0

Eddystone Silent Notification

Nun zeigt mein Handy (bei mir im Wohnzimmer) immer folgende „Silent Notification“

Was noch zu tun bleibt

Spannend währe nun noch zu erfahren, wie viele Personen so eine Notification sehen, wenn man so einen Beacon an einem Bahnhof oder Flughafen einer der meistbesuchten Städte platziert. In Deutschland kommen laut der Liste nur Frankfurt am Main, München oder Berlin in Frage. Da ich in nächster Zeit keinen der Bahnhöfe/Flughäfen besuchen werde, versuche ich es einfach mal mit einem Bahnhof hier in der Region – ich bin schon gespannt.

Meine Apps im Google Play-Strore Jetzt bei Google Play