https://www.youtube.com/watch?v=i7qaEEyv3Xk&t=1095s
Sensor nedir?
Bir cihazdaki dış ortamla ilgili verileri cihaza bildiren araçlardır. Her birinin içerisinde API’si mevcuttur. Bu APIlere erişerek cihazdan gelen veriyi alabiliyoruz.
İki sensor üzerinde anlatım yapacağız;
- Lokasyon sensor
- Oryantasyon sensor
Lokasyon Sensor : Cihazın o anda ki enlem ve boylam bilgisini alır.
Oryantasyon sensor : Cihazın hangi pozisyonda, açıda tutulduğunun bilgisini alıyor.
Diğer sensorler hakkında bilgi almak için Embarcadero’nun kendi web sitesinden ve Github Getit üzerinden ulaşabilirsiniz.
DEMO – 1
Mobil cihazdaki konum verisini alıp web browserdan hangi konumda olduğunu göstereceğiz.
File> New> Multi Device Application> Blank Application. Projemiz açılıyor ve kaydediyoruz. Palette> toolbar ekliyoruz. Toolbar’ın içine checkbox ekliyoruz. Checkbox> Object Inspector >align >right – name →items editor açılan pencereden 1 adet ListboxGroupHeader 2 adet ListboxItem ekliyoruz. Yüksekliklerini ayarlamak için height> 45 veriyoruz. Textlerini temizliyoruz. Listbox1’in içine label ekliyoruz.Label1 >align >left – text → Enlem – name→ lblenlem. 2tane daha label ekliyoruz. Bir tanesi toolbarın içine text → Lokasyon Uygulamasu diğeri listboxitem2’nin içerisine text→Boylam – name→lblboylam – align >left. Listboxların içinde yer alan labelları yanlarına kopyalayıp yanlarına ekliyoruz bu labellar ile değerleri göstereceğiz. Değer göstereceğimiz labelların align> client – text→0 – HorzAlign > center.
Bir adet web browser ekliyoruz ve bir lokasyon sensoru yerleştiriyoruz bu bize mobil cihazdan konum bilgisini alıp enlem ve boylam olarak okumamızı sağlayacak. Kodları checkboxa yazacağız. Checkbox aktifse lokasyon sensorumuzde aktif olacak. Checkboxa çift tıklıyoruz. Hazır bir kod ekliyoruz Android 7’den sonrası için izin alabilmemiz için bu kodu eklememiz gerekiyor. Hazır koddaki nesne isimlerini kendi nesne isimlerimizle değiştiriyoruz.
Procedure TForm2.cbSensorAcChange(Sender : TObject);
const
PermissionAccessFineLocation = ‘android.permission.ACCESS_FINE_LOCATION’;
begin
{$IFDEF ANDROID}
PermissionsService.RequestPermissions([PermissionAccesFineLocation],
procedure (const APermissions: TArray <string>: const AGrantResults:TArray < TPermissionStatus>)
begin
if (Length (AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
{activate or deactivate the location sensor}
LocationSensor1.Active := swLocationSensorActive.IsChecked
else
begin
swLocationSensorActive.IsChecked := False;
TDialogService.ShowMessage(‘Location permission not qranted’);
end;
end);
end;
end
Kodların sonuna her cihazda çalışması gereken kodlarımızı ekliyoruz.
{$ELSE}
LocationSensor1.Active := cbSensorAc.Checked;
{$ENDIF}
LocationSensor’e gidip event kısmında onLocationChange çift tıklıyoruz ve komutlarımızı yazıyoruz.
procedure TForm2.LocationSensorLocationChanged(Sender : TObject;
const OldLocation , NewLocation: TLocationCoord2D);
const
GoogleMapsUrl: String = ‘https: //maps.google.com/maps?q=%s’;
begin
var Enlem := Newlocation.Latitude.ToString(ffGeneral, 8,5,TFormatSettings.Create(‘en-US’));
var Boylam := Newlocation.Longitude.ToString(ffGeneral, 8,5,TFormatSettings.Create(‘en-Us’));
lblEnlem.Text := Enlem;
lblBoylam.Text := Boylam;
WebBrowser1.Navigate(Format(GoogleMapsURL,(Enlem,Boylam)));
end;
end.
Google’ın sabit adresinide ekledik çünkü web browser’a adres olarak göndereceğiz. 2 adet değişken tanımladık enlem ve boylam. Formatlama işlemi yaptık çünkü browsera göndereceğiz browser aracılığı ile Google’a göndereceğiz. Google’ın istediği formata uydurabilmemiz için enlem ve boylam bilgimizi göndermeyi bu şekilde yapıyoruz.
Uses kısmına fmx.DialogService ekliyoruz. Target Platforms> Target burada bağladığımız cihazımızı görebiliyoruz uygulamamızı derliyoruz ve gönderiyoruz. Mobil cihazımızda checbox aktif ediyruz. Konum kullanımına izin veriyoruz ve bulunduğumuz konumun enlem ve boylam değerlerini görebiliyoruz.
DEMO – 2
ORYANTASYON SENSORU
Cihazın hangi konumda tutulacağını belirleyen sensorümüzdür.
Zaman kaybetmemek için bu projemizi emarcadero’nun örnek uygulamaları üzerinden yapacağız. Delphi’yi açıyoruz > open a sample project menüsüne tıklıyoruz, burada Embarcadero’nun kendi demolorunun bulunduğu klasörü açan kısayol ekranı geliyor. Object pascal> Mobile snippets> Accelerometer> Accelerometer.dpr ve örnek uygulamamız açılıyor. Eğer bu sample klasörünü daha önceden yüklemediysek tools> manage performans> additional options> samples’ı işaretleyerek kuruyoruz. Açılan uygulamamızın kodları aşağıdaki gibi;
procedure TAccelerometerForm.swAccelerometerSensorActiveSwitch(Sender: TObject);
begin
{ activate or deactivate the reading of the accelerometer sensor }
MotionSensor1.Active := swAccelerometerSensorActive.IsChecked;
Timer1.Enabled := swAccelerometerSensorActive.IsChecked;
end;
Gelin kodları inceleyelim. Açılan uygulamada bir önceki demomuza benzer bir arayüzümüz var. Burada motionsensor componenti kullanılmış. Bir adet timer var. Sensorumuzu açıp kapama için TSwitch mevcut. Switch checbox ile hemen hemen aynı. Motion componentimizin aktif kısmı switchbox’ın checkine bağlanmış. Timer da aynı şekilde switchbox’ın check özelliğine bağlı.
procedure TAccelerometerForm.Timer1Timer(Sender: TObject);
var
LProp: TCustomMotionSensor.TProperty;
begin
for LProp in MotionSensor1.Sensor.AvailableProperties do
begin
{ get the data from the sensor }
case LProp of
TCustomMotionSensor.TProperty.AccelerationX:
begin
lbAccelerationX.Visible := True;
lbAccelerationX.Text := Format('Acceleration X: %6.2f', [MotionSensor1.Sensor.AccelerationX]);
end;
TCustomMotionSensor.TProperty.AccelerationY:
begin
lbAccelerationY.Visible := True;
lbAccelerationY.Text := Format('Acceleration Y: %6.2f', [MotionSensor1.Sensor.AccelerationY]);
end;
TCustomMotionSensor.TProperty.AccelerationZ:
begin
lbAccelerationZ.Visible := True;
lbAccelerationZ.Text := Format('Acceleration Z: %6.2f', [MotionSensor1.Sensor.AccelerationZ]);
end;
TCustomMotionSensor.TProperty.AngleAccelX:
begin
lbAngleAccelX.Visible := True;
lbAngleAccelX.Text := Format('Angle X: %6.2f', [MotionSensor1.Sensor.AngleAccelX]);
end;
TCustomMotionSensor.TProperty.AngleAccelY:
begin
lbAngleAccelY.Visible := True;
lbAngleAccelY.Text := Format('Angle Y: %6.2f', [MotionSensor1.Sensor.AngleAccelY]);
end;
TCustomMotionSensor.TProperty.AngleAccelZ:
begin
lbAngleAccelZ.Visible := True;
lbAngleAccelZ.Text := Format('Angle Z: %6.2f', [MotionSensor1.Sensor.AngleAccelZ]);
end;
TCustomMotionSensor.TProperty.Motion:
begin
lbMotion.Visible := True;
lbMotion.Text := Format('Motion: %6.2f', [MotionSensor1.Sensor.Motion]);
end;
TCustomMotionSensor.TProperty.Speed:
begin
lbSpeed.Visible := True;
lbSpeed.Text := Format('Speed: %6.2f', [MotionSensor1.Sensor.Speed]);
end;
end;
end;
end;
Kalan bütün işlem timer’ın içerisinde gerçekleşiyor. İlk başta x, y ve z hareketlerini almışız label’ın içine daha sonra x ,y ve z konumundaki açıları almışız bunları ekranda labellara yazdırmışız.
Bu uygulamayı cihaza gönderip deneyelim, ilk demomuzla aynı işlemleri uyguladığımızda mobil cihazımızda verilerin geldiğini göreceğiz.
Uygulamamızı kapatıp open a sample> object pascal> multi device samples> device sensor and services burada birçok sensor için uygulama örneği mevcut buradan örnekleri inceleyebilirsiniz.
Uygulamada Tools> getit package manager bölümünden driver daha önceden yüklenmiş cihazları kolaylıkla kurabiliyoruz. Internet of things seçtiğimizde daha önceden delphi için driver yazılmış bir çok cihaza erişimi sağlayabiliyoruz.