Proje Hakkında Bilgi
Besinler üzerindeki etiketlerin akıllı cihazların kameraları ile okutularak , kullanıcılara ürün içerikleri hakkında bilgi veren , kullanıcılara besin maddesi içerikleri üzerinden öneriler sunan , kullanıcıların aktif olduğu sosyal platform tarzı bir uygulamadır.
Uygulamada Kullanılacak Teknolojiler
Günümüzdeki akıllı telefon pazarına baktığımızda android işletim sistemine sahip cihazların piyasadaki kullanım oranı diğer cihazlara göre öndedir.Dolayısıyla uygulamamızı android cihazlarda çalışacak şekilde geliştireceğiz.Projede kullanılacak veritabanı Sql Server'dır.Uygulamanın internet üzerinden kullanıcılara hitap edecek olmasından dolayı , veritabanı ile android cihaz arasındaki bağlantı Web Servisler üzerinden sağlanacaktır.Veritabanında ki datalar web servis üzerinde yazılan fonksiyonlarla çekilir.Android tarafında web servise ilgili fonksiyonun ihtiyaç duyduğu parametreler gönderilir, ilgili web servis fonksiyonu çalıştırılarak veritabanında veri çekilir veya veritabanına kayıt eklenir.Aşağıdaki şekilde bunun temsili bir gösterimi mevcuttur.Tabi burada sql server veritabanı da aslında bir server veya makine üzerinde çalışacaktır.
Visual Studio ile Web Service Uygulaması Oluşturma
Geliştireceğimiz uygulamada .NET teknolojisi kullanarak Web Servis uygulaması oluşturacağız.Bunun için Visual Studio'yu çalıştırırız.File ->New -> Project kısmından (kısayolu Ctrl + shift + N) uygulama oluşturma ekranı karşımıza gelir.Buradan yeni bir ASP.NET Empty Web Application oluşturuyoruz.
Uygulamayı oluşturduktan sonra solution explorer bölümünde proje ismine sağ tıklayıp Add->New Item diyoruz.Buradan Web Service seçeneğini seçip uygulamamıza dahil ediyoruz.
![]() |
Şekil 1 - Web Uygulaması Açma |
Web Servis ile Sql Server Veritabanı Arasında Bağlantı Kurma
Web Servis ile Sql Server arasında bağlantı kurmak için Microsoft ' un geliştirdiği Entity Framework kullanılmıştır.Entity Framework , C# programlama dili ile sql sorguları yazmamıza yarayan ORM mantığıyla geliştirilmiş bir frameworktur.Programcıyı katı sql sorgularıyla uğraşmaktan kurtaran çok daha basit ve bir o kadar da kullanışlı bir yapıdır.Kısa bir bilgiden sonra gelelim uygulamamız ile veritabanı bağlantısını kurmaya.Solution Explorer bölümünden uygulama ismine sağ tıklayıp Add->New Item diyoruz.Sol da Visual C# sekmesinin altında Data ya tıklayarak karşımıza gelen ADO.NET Entity Data Model e tıklayıp ,oluşturacağımız entity modeline bir isim veriyoruz.
Add seçeneğine tıkladıktan sonra karşımıza Entity Model Sihirbazı gelir.Buradan hazır oluşturduğumuz bir veritabanını uygulamaya dahil edeceğimiz için Generate from Database diyip Next diyoruz.Karşımıza gelen ekranda hangi veritabanı bağlantısını seçeceğimizi sorar.Buradan New Connection butonuna tıklıyoruz.Açılan form da Server Name kısmına bilgisayarımızda çalışan Sql Server adınız seçiyoruz.Connect to a database kısmında seçilen serverda ki yüklü veritabanları karşımıza gelir.Buradan kendi eklemek istediğim veritabanını seçiyorum ve Ok butonuna basıyorum.
Açılan pencerede Yes seçeneğine tıklayıp Model ismini de resimdeki gibi verdikten sonra Next diyorum.Buradaki model ismi uygulama boyunca kullanacağımız veritabanı işlemleri için kullanacağımız ana class ın ismidir.Bu class üzerinden oluşturulan nesne ile veritabanına kayıt,ekleme,silme gibi işlemleri yapacağız.
Açılan form da hangi veritabanı objelerini seçmek istediğimiz sorulmaktadır.Ben burada sadece tablolarımı dahil etmek istediğim için Tables sekmesini seçiyorum.Bu sekme içinden sysdiagram ın yanında bulunan tik i kaldırıyorum.Çünkü diyagramları dahil etmek istemiyorum .Alt tarafta pluralize yazan tik e de tıklıyorum ve son olarak finish e basarak bitiriyorum.Bir süre bekledikten sonra veritabanı tablolarım geliyor.Aslında bu tabloların hepsi bir class olarak oluşturuluyor.Entity framework un yaptığı şey de budur.Solution Explorer da .edmx uzantılı modelin .tt uzantısına tıklarsan veritabanındaki tüm tabloların class şeklinde oluşturulduğu görülmektedir.
![]() |
Şekil 3 - Entity Framework Modeli Oluşturma |
![]() |
Şekil 4 -Veritabanı Seçimi |
Açılan pencerede Yes seçeneğine tıklayıp Model ismini de resimdeki gibi verdikten sonra Next diyorum.Buradaki model ismi uygulama boyunca kullanacağımız veritabanı işlemleri için kullanacağımız ana class ın ismidir.Bu class üzerinden oluşturulan nesne ile veritabanına kayıt,ekleme,silme gibi işlemleri yapacağız.
![]() |
Şekil 5 - Model İsmi Verme |
Web Servisi Local Makine Üzerinde IIS kullanarak Yayınlama
Web Servisi kendi makinemizde çalıştırabilmek için IIS üzerinden publish etmemiz gerekmektedir.Bunun için sırayla C:>inetpub->wwwroot klasörü içinde yeni bir klasör açmamız gerekir.Daha sonra IIS yöneticisini açarak burada Default Web Site ın altında oluşturduğumuz klasör görünür.Klasöre sağ tıklayarak uygulamaya dönüştür deriz.Visual Studio da uygulamamızı açıyoruz.Sağ tıklayıp Publish diyoruz.Select or import a publish profile yazan yere tıklayıp New diyerek yeni bir profıl oluşturacağımızı söylüyoruz.Yayınlama yöntemi yazan yere File System seçeneğini seçip Target Location kısmına C:>inetpub->wwwroot->KlasörAdı oluşturduğumuz dizindeki klasörü seçip Open diyoruz.Eğer Publish 1 succeded : 0 failed : 0 skipped şeklinde bir output alıyorsanız web servisiniz artık kendi makineniz üzerinde çalışacak hale gelmiştir.Fakat ben ilk yaptığımda aşağıdaki hata mesajını aldım.
Bunun sebebi oluşturduğum klasöre AppPool un yazma yetkisinin olmamaması.Bunu düzeltmek için oluşturulan klasöre kendi AppPool um için izin verdim.Bunu yapmak için oluşturduğum klasöre sağ tıklayıp Özellikler -> Güvenlik -> Düzenle -> Ekle dedikten sonra IIS AppPool\ApplicationPoolName yazıp adları kontrol et dedikten sonra tamam diyerek çıktım.Fakat bu sefer de HTTP 404.3 Not Found hatası aldım.Bu hatayı çözmek için Windows özelliklerini aç veya kapat a tıkladım.IIS->World Wide Web Services->Application-> Development Features altında ASP.NET (.Net Extensibility ,ISAPI Extensions ,ISAPI Filters ) seçtim.Daha sonra cmd yi çalıştırarak %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -ir yazığ çalıştırdığımda sorun çözülmüş ve web servis kullanılabilir hale gelmiş oldu.Bunu test etmek için IIS Yönetim Paneli ni açarak oluşturduğumuz klasöre tıklayıp Yönetim Panelinin en sağ tarafında gözat tıkladığımız browser da çalışır durumda web servis görüntülenecektir.
![]() |
Şekil 1 - Hata Mesajı |
Web Servis Üzerinde Veritabanı İşlemi Yapacak Fonksiyon Yazma
.NET tarafında Web Servis üzerinde bir fonksiyonun çalışması için yazılacak fonksiyonun başına [WebMethod] yazılır.Bu ifade fonksiyonun web servis üzerinde çalışacağını belirtir.
Yukarıdaki kod Web Servis için yazdığım bir fonksiyondur.Entity modeli ekleme sayfasında bahsettiğim model ismi olan HealthyFoodEntities nesnesi üzerinden veritabanı işlemleri yapılır.Yukarıdaki fonksiyon email adresi ve şifre alarak veritabanında kayıt olup olmadığını kontrol eder.Entity Framework sorguları LINQ teknolojisi kullanılarak yazılır.Ben burada lambda expressions ile veritabanı sorgusu yazdım.Android tarafında kullanıcıdan alınan email ve şifre bilgisi bu fonksiyona parametre olarak verilir.Web Servis veritabanına sorgu yapar ve sonucu androide gönderir.Bu Web Servisi çalıştırmak için IIS Yönetim Panelini açıyoruz ve bir önceki yazıda bahsettiğim gibi klasöre tıklayıp browser da çalıştırıyorum.
Şekilde görüldüğü üzere localhostta çalışan web servis uygulamasıdır.Sayfanın başında bu web servis üzerinde çalışan AddUser ve IsAuthenticated fonksiyonları görülmektedir.IsAuthenticated fonksiyonuna tıklıyorum.
Görüldüğü üzere web servis bizden email ve password beklemektedir.Veritabanımda kayıtlı bir kullanıcı girdiğim zaman bana XML çıktısı üretir.XML çıktıları üzerinden haberleşme sağlandığından dolayı .NET üzerinde yazdığım bir web servisi tüm platformlarda kullanılır.
Şekilde görüldüğü gibi veritabanımda kayıtlı bir data girdiğim zaman aldığım sonuç.Web Servis ile Sql Server arasındaki bağlantının doğru bir şekilde çalıştığını böylece test etmiş olduk.Şimdi sıra Android ile Web Servis arasındaki bağlantıyı kurmaya geldi.
Code:
public class UserBusiness : System.Web.Services.WebService { HealthyFoodEntities db; public UserBusiness() { db = new HealthyFoodEntities(); } [WebMethod] public bool IsAuthenticated(string email, string password) { var query = db.Users.Where(x => x.Mail == email & x.Password == password).FirstOrDefault(); if (query == null) return false; return true; }
Yukarıdaki kod Web Servis için yazdığım bir fonksiyondur.Entity modeli ekleme sayfasında bahsettiğim model ismi olan HealthyFoodEntities nesnesi üzerinden veritabanı işlemleri yapılır.Yukarıdaki fonksiyon email adresi ve şifre alarak veritabanında kayıt olup olmadığını kontrol eder.Entity Framework sorguları LINQ teknolojisi kullanılarak yazılır.Ben burada lambda expressions ile veritabanı sorgusu yazdım.Android tarafında kullanıcıdan alınan email ve şifre bilgisi bu fonksiyona parametre olarak verilir.Web Servis veritabanına sorgu yapar ve sonucu androide gönderir.Bu Web Servisi çalıştırmak için IIS Yönetim Panelini açıyoruz ve bir önceki yazıda bahsettiğim gibi klasöre tıklayıp browser da çalıştırıyorum.
![]() |
Şekil 1-Browser da çalışan Web Servis Uygulaması |
![]() |
Şekil 2 - Web Servis Üzerinde Çalışan IsAuthenticated Fonksiyonu |
![]() |
Şekil 3 - XML çıktısı |
Uygulama Giriş Sayfası ve Üye Olma Sayfası Tasarımı
Android ile .NET Web Servis Arasında Bağlantı Kurma
Android ile .NET Web Servis arasında bağlantı kurmak oldukça problemli bir iş.Bu aşamada gerçekten çok uğraştığımı ve bunaldığım anlar olmuştur.Ancak bir şekilde bağlantıyı kurmayı başardım.Bağlantıyı kurmak için öncelikle bunun için hazırlanmış ksoap library i android uygulamasına dahil etmek gerekir.Bunun sebebi Web Servisler SOAP protokolü üzerinden haberleşir.Haberleşmenin sağlanabilmesi için android tarafından ksoap kütüphanesini kullanmak gerekiyor.Ksoap library i indirmek için ilgili tarayıcılarda aratıp bulmak mümkündür..jar uzantılı dosyayı uygulamaya dahil ettikten sonra bağlantı için gerekli kodları yazmaya başlayalım.
Öncelikle SOAP protokolü üzerinden haberleşeceğimiz değişkenleri tanımlamamız gerekiyor.
URL kısmına şekildeki yeri kopyalıyoruz.Fakat burada localhost yazan kısma bilgisayarın ip adresini yazmamız gerekiyor.Zira yazmassak program çalışmayacaktır.Ip adresini isteminden ipconfig yazarak bulabiliriz.
Soap Action kısmı şekilde görüldüğü gibidir.Diğer değişkenlerden Namespace kısmı zaten Visual Studio tarafında oluşturduğumuz web servis uygulamasını açarsak orada class ın tanımlandığı yerin üstünde yazmaktadır.Method Name adından da anlaşılacağı gibi Web Servis deki hangi methodun çalıştırılacağını belirler.
Android SOAP protokolü ile haberleşmeyi ana thread içerisinde yapılmasına izin vermiyor.Dolayısıyla haberleşmeyi yapmak için thread kullanımı gerekiyor.Bu aşamada dağıtık sistemler dersinde yaptığımız uygulamalardaki bilgilerimi kullandım.
Web Servis üzerinde çalışan IsAuthenticated fonksiyonu ile veri alışverişi yapılması bu şekilde yapılmaktadır.
public static final String NAMESPACE="http://tempuri.org/"; public static final String SOAP_ACTION="http://tempuri.org/IsAuthenticated"; public static final String URL="http://localhost/HealthyNutrition/UserBusiness.asmx"; public static final String METHOD_NAME="IsAuthenticated";
Öncelikle SOAP protokolü üzerinden haberleşeceğimiz değişkenleri tanımlamamız gerekiyor.
![]() |
Şekil 1 -URL |
![]() |
Şekil 2 -SOAP ACTION |
Android SOAP protokolü ile haberleşmeyi ana thread içerisinde yapılmasına izin vermiyor.Dolayısıyla haberleşmeyi yapmak için thread kullanımı gerekiyor.Bu aşamada dağıtık sistemler dersinde yaptığımız uygulamalardaki bilgilerimi kullandım.
Thread nt=new Thread(){ //Android ana thread üzerinden web servise bağlanmaya izin vermiyor. // o yüzden yeni thread tanımlayıp onun üzerinden bağşantı işlemleri yapılır. public void run(){ //Thread ile ilgili işlemler run fonksiyonunu override ederek yapılır SoapObject request=new SoapObject(NAMESPACE,METHOD_NAME); //Namespace ve method ismi ile ilgili web servise bağlantıyı sağlar request.addProperty("email",email.getText().toString()); //web serviste calısan fonksiyona gönderilecek parametreler belirlenir.Parametrelerin isimleri web serviste çalışan fonksiyonların aldığı parametrelerle aynı olmak zorunda request.addProperty("password",password.getText().toString()); SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet=true; // envelope.setOutputSoapObject(request); HttpTransportSE transport=new HttpTransportSE(URL); try { transport.call(SOAP_ACTION, envelope); SoapPrimitive result=(SoapPrimitive) envelope.getResponse(); //Web servisten cevabı alır. loginStatus=Boolean.parseBoolean(result.toString()); if(loginStatus) { intent= new Intent(Main.this,NewsFeed.class); startActivity(intent); control=true; } } catch (HttpResponseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } runOnUiThread(new Runnable() { //Thread ile işlem yapıldığı için ekrana yazı yazdırmak için kullanılır. @Override public void run() { // TODO Auto-generated method stub if(control == false) Toast.makeText(Main.this, "Sistemde böyle bir kayıt bulunamadı.Lütfen aşağıdaki linke tıklayarak üye olunuz", Toast.LENGTH_LONG).show(); } }); } }; nt.start();
Web Servis üzerinde çalışan IsAuthenticated fonksiyonu ile veri alışverişi yapılması bu şekilde yapılmaktadır.
Kaydol:
Kayıtlar (Atom)