Soru & Cevap

Android soket bağlantısı

10.09.2019 - 10:54

Merhaba öncelikle internete genel bir araştırma sonucu bu soruyu sorma ihtiyacı duydum. Bir kaç sitede socet.io kütüphanesinin anlatımını gördüm. Ancak şöyleki onlar hazır sunucu kullanıyor ve benim bu konuda bilgim çok az. Geleyim asıl konuya benim Play store da bir uygulamam var Araç ların muayenelerini takip eden kullanıcıya bildirim atarak bilgi veren. Bu uygulamada iki farklı kullanıcı tipi mevcut "Şirket Sahibi" ve "Şoför". Şoför kullanıcısı konum paylaştığında veriyi anlık olarak ya bir yere kaydetmeliyim yada şirket sahibine göndermeliyim ancak bunu verimli olarak soket programlama ile yapabilirim diye düşündüm. Şu an hali hazırda firebase firestore ile yaptım ancak konum paylaşılırken veri tabanı aşırı yükleniyor. Bu da fazla kaynak tüketiyor. Genel olarak toparlar isem ne yapmalıyım soket programlama burada işimi görür mü, görür ise sunucu işini nasıl ayarlarım veya sunucusuz bu işi telefonları içinde halledebilirmiyim. Veya başka bir yol var mı ? Şimdiden verilen her cevap için teşekkürler. Evet arkadaşlar çetrefilli eziyeter sonunda bir yere varmayı başardım. :D İlk olarak Socket.io yu local de kullanmayı başardım. Ancak on bir problem var bağlantı sadece tek kişilik bunu nasıl çoklarım ? Kodları aşağıya bırakıyorum.

Javascript kodu :


var express = require("express");
var app = express();
var server = require("http").Server(app);
var io = require("socket.io")(server);
app.get("/", function(req, res) {
  res.sendFile(__dirname + "/index.html");
});
io.on("connection", function(socket) {
  socket.on("update", data => io.emit("update", { data }));
});
server.listen(3000);
 
Html kodu : 


<html>
  <head> </head>
  <body>
    Merhaba Bu bir Api'dir.
    <button>Update</button>
    <p></p>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io();
      var button = document.querySelector("button");
      button.onclick = function() {
        socket.emit("update", { dolarRate: 5.12 });
      };
      var p = document.querySelector("p");
      socket.on("update", function(res) {
        p.innerText = res.data;
      });
    </script>
  </body>
</html>

Html çıktısı :

Merhaba Bu bir Api'dir.

{"get_user_id":"XbSTdXvrg3TtD1n0AvJ83HPzkqD3","plaka":"","push_user_id":"wpwHUNRh9fN7xt3miV7Y0jnuXul1","s":0.0,"t":1568279569668,"x":40.82429568,"y":29.47737739}

Android kodu :

@SuppressLint("MissingPermission")
    private void getLocation() {
        if (MainActivity.isLocation) {
            try {
                mSocket = IO.socket("http://192.168.8.103:3000/");
            } catch (URISyntaxException e) {
                e.printStackTrace();

                Log.e("Hata", e.getMessage());
            }
            mSocket.on(Socket.EVENT_CONNECT, onConnect);
            mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
            mSocket.connect();

            pb.setVisibility(View.VISIBLE);
            tw_konum.setText("Konum verisi bekleniyor.");

            LocationListener konumDinleyicisi = new LocationListener() {

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                }

                @Override
                public void onProviderEnabled(String provider) {
                }

                @Override
                public void onProviderDisabled(String provider) {
                    NotificationRegulative.getInstance(MainActivity.this).clearNotLoc(MainActivity.this, 0);
                    if (MainActivity.isLocation) {
                        buildAlertMessageNoGps(MainActivity.this);
                    }
                }

                @Override
                public void onLocationChanged(Location loc) {
                    loc.getLatitude();
                    loc.getLongitude();
                    loc.getSpeed();

                    DecimalFormat df = new DecimalFormat(".##");

                    if (MainActivity.isLocation) {
                        if (MainActivity.mainUser != null) {
                            if (!MainActivity.mainUser.getTel().equals("") && MainActivity.mainUser.getTel() != null) {
                                String text = "X = " + df.format(loc.getLatitude()) + " Y = " + df.format(loc.getLongitude()) + " Hız = " + df.format((loc.getSpeed() * 3.6));
                                tw_konum.setText(text);
                                final Map<String, Object> map = new HashMap<>();
                                map.put("x", loc.getLatitude());
                                map.put("y", loc.getLongitude());
                                map.put("s", (loc.getSpeed() * 3.6));
                                long time = System.currentTimeMillis();
                                map.put("t", time);

                                com.recep.aractakipuygulamasi.entity.Location location = new com.recep.aractakipuygulamasi.entity.Location(
                                        loc.getLatitude(), loc.getLongitude(), (loc.getSpeed() * 3.6), time, MainActivity.mainUserID, sirketSahibiId,"");

                                Gson gson = new Gson();

                                final String json = gson.toJson(location);
                                mSocket.emit("update", json);

                                NotificationRegulative.getInstance(MainActivity.this).sendNotLoc(text, MainActivity.this);
                            } else {
                                tw_konum.setText("Lütfen telefon numaranızı güncelleyiz.");
                            }
                        }
                    } else {
                        NotificationRegulative.getInstance(MainActivity.this).clearNotLoc(MainActivity.this, 0);
                    }
                }
            };
            konumYoneticisi.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, konumDinleyicisi);
        } else {
            tw_konum.setText("Konum paylaşılmıyor.");
            pb.setVisibility(View.GONE);
            if (mSocket != null) {
                mSocket.disconnect();

                mSocket.off(Socket.EVENT_CONNECT, onConnect);
                mSocket.off(Socket.EVENT_DISCONNECT, onDisconnect);
            }
        }
    }

 

sockete bağlanan her cihaz paylaşılan veriyi görebiliyor verinin özelliğine göre veri süzülebilir anvak diyelim 10 kişi aynı anda veri paylaşsa ve 10 kişi de veri çekse burada çakışma olacağı kanısındayım. Burada sizlerden yardım istiyorum galiba yeni thread falan açmamız gerek ama nasıl ? Şimdiden hepinize teşekkürler.

214 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-16838-1420450309.jpg
brhngk
21.09.2019 - 12:25

Firebase Realtime Database kullanmanız sizin için daha mantıklı olacaktır. Şoför konumunun lat ve long değerini database kaydedecek. Sonra admin tarafında da diz o bilgileri kullanarak gösterim yapacaksınız. Böyle yaparsınız hem realtime çalışmış olur hem de sunucu yükünden kurtulmuş olursunuz.