Tile38 ile Geofencing

Ali Aydin
4 min readFeb 19, 2023

Geofencing harita üzerinde belirlediğiniz bir alanın içerisine kullanıcıların giriş, çıkış, veya alan üzerinden geçme gibi durumları tespit edip kullanıcılara mesaj (e-mail, sms, push notification) gönderip pazarlama veya tanıtım gibi amaçlar için kullanılmaktadır.

Örnek olarak; bir kullanıcı mağaza yakınından geçerken belirtilmiş alana girdiğinde mesaj göndererek kampanyalardan haberdar olması sağlanır veya kamu hizmetleri ile ilgili bilgilendirmeler içinde kullanılabilir.

Tile38

Tile38 in-memory geolocation data store ve real time geofencing yapabileceğimiz server olarak kullanılmakta, tile38 oldukça hızlı ve stabil çalışmakta, lokasyona göre search ve geofence konusunda bize kolaylık sağlıyor.

Tile38 search kısmında bize bir kaç opsiyon sunmakta bunlar;
within belirtilen alanın kesin olarak içindeki kullanıcıları belirtirken
intersects belirtilen alanın kesiştiği ve içindeki kullanıcıları kapsar ve nearby ise belirtilen alanın içindeki kullanıcılar ile verdiğiniz değere göre yakınındaki kullanıcıları kapsamaktadır.

Tile38'e basit bir giriş yapalım ve demo ile ilerleyelim

İlk olarak yapacağımız demo mimarisi ile başlayalım, öncelikle tespit edeceğimiz bir alan belirleyip bunu tile38 içerisindeki ‘SETHOOK’ keyword kullanarak eklememiz gerekiyor, bu keyword bize endpoint üzerinden bir “webhook” oluşturmamızı sağlıyor ve işimizi oldukça kolaylaştırıyor, hook set edildikten sonra lokasyon bilgileri girerek kullanıcının oluşturmuş olduğumuz alan içerisine enter, exit, cross .. gibi “event” bilgilerini yakalayıp webhook ile notification-service’e iletilmesini ve event’lerin database içerisinde tutulmasını sağlıyoruz. push notification ile belirtilen kısımda sadece konsol ekranında görüntülüyoruz.

Proje kurulum ve demo için : Github

Yapacağımız demo için Besiktas meydanı içeren bir Polygon seçiyorum

selected area
# selected coordinates
"coordinates":[[[29.000356631674492,41.03862126237229],[29.01497991197658, 41.042789096090104],[29.008308461516265,41.04995511989344],[28.999615359400792, 41.04472044173406],[29.000356631674492, 41.03862126237229]]]

NOT: Seçtiğiniz polygon bilgisinin başlangıç ve bitiş koordinatları aynı olmalı

# sethook with coordinates
curl -d '{"name":"besiktas","coordinates":[[[29.000356631674492, 41.03862126237229],[29.01497991197658, 41.042789096090104],[29.008308461516265, 41.04995511989344],[28.999615359400792, 41.04472044173406],[29.000356631674492, 41.03862126237229]]]}' -H "Content-Type: application/json" -X POST http://localhost:8081/geofence

Seçtiğimiz koordinatlar ile “besiktas” isminde bir hook set ettik. artık kullanıcı ile lokasyon bilgileri set ederek bunun tespit edilmesini görüntülemekte.

detect event

Burada set edeceğimiz “user1” id kullanıcısına üç farklı konum bilgili set edeceğiz.

1. base olarak seçilmiş alan dışarısında olacak
2. seçilen alan içerisinde olacak (enter)
3. seçilen alanın dışarısında olacak (exit)

# set user1 base location ( dolmabahce street)
curl -d '{"id":"user1","point":{"latitude":41.037706, "longitude":28.995291}}' -H "Content-Type: application/json" -X POST http://localhost:8081/user

# set user1 location (besiktas square)
curl -d '{"id":"user1","point":{"latitude":41.042046, "longitude":29.006620}}' -H "Content-Type: application/json" -X POST http://localhost:8081/user

# set user1 location (levent square)
curl -d '{"id":"user1","point":{"latitude":41.077613, "longitude":29.013334}}' -H "Content-Type: application/json" -X POST http://localhost:8081/user

Sıra ile ekledikten sonra sonra notification-service terminal ekranında aşağıdaki gibi çıktıyı elde edeceğiz.

notification-service terminal

Tile38 Hook için farklı yapılarda ve isteklerinze göre configure edebileceğiniz keyword’ler bulunmakta, önemli olduğunu düşündüğüm bir kaç keyword ve bilgi ile devam edelim.

Bir hook set edildiğinde eğer ‘ttl’ verilmez ise bu hook sonsuza kadar “event” tespit edip bunları belirttiğiniz endpoint’e göndermeye devam edecek, önlemek için hook set ederken “EX” keyword ile bunun önüne geçebiliriz.

# set 120 second ttl
SETHOOK 'name' 'url' EX 120 WITHIN 'collection' FENCE OBJECT ...

Bir diğer keyword “META” bu keyword bize “event” içerisinde gelmesini istediğimiz, ihtiyaç duyduğumuz bilgileri set etmemize yardımcı olmakta birden fazla olursa peş peşe META … META … şeklinde kullanılmakta.

# set info field to event header
SETHOOK 'name' 'url' META info "info" EX 120 WITHIN 'collection' FENCE OBJECT ...

# set info and date field to event header
SETHOOK 'name' 'url' META info "info" META date "date" EX 120 WITHIN 'collection' FENCE OBJECT ...

Bir başka önemli keyword “DETECT” bize tespit edeceğimiz event’leri özelleştirmeyi sağlıyor bu keyword içerisinde beş farklı mod (enter, exit, cross, inside, outside) bulunmakta sadece ihtiyacımız olan event’ler için düzenleyebiliriz, “DETECT” kullanılmaz ise tüm tespit edilen event’ler gönderilecektir.

# all detect type (enter,exit,cross,inside,outside)
SETHOOK 'name' 'url' WITHIN 'collection' FENCE OBJECT ...

# only detect enter
SETHOOK 'name' 'url' WITHIN 'collection' FENCE DETECT enter OBJECT ...

# enter exit
SETHOOK 'name' 'url' WITHIN 'collection' FENCE DETECT enter, exit OBJECT ...

Ayrıca bir endpoint ile web-hook kullanmak dışında “event” için servisler arası grpc, rabbitmq, kafka, redis gibi yapıları kullanabilirsiniz.

NOT: Tile38 ile yeni bir hook oluşturduğunuzda kullandığınız endpoint methodu POST olmalı ve response olarak http status ‘200’ döndürmeli, eğer tile38 gönderdiği endpoint’den http status ‘200’ cevabı alamaz ise tespit edilen event’in gönderilemediğini varsayıp belirli araliklar ile tekrar tekrar göndermekte.

--

--