Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TIdTCPServer'dan seçili client'a veri gönderme [çözüldü]
#1
Merhaba
Okulların tekrar kapanmasıyla Delphi ve Arduino üzerinde daha çok çalışmaya başladım. Aklımda şöyle bir IoT projesi tasarladım.

[img]P077FI.png[/img]

1. Aşama
Tek bir Arduino'dan adc değerini Ethernet üzerinden Delphi'ye gönderip değerleri gösterip duruma göre Arduino geri komut göndermek.
Bu aşamayı başarılı bir şekilde geçtim. Case durumuna göre tek bir Arduino'ya geri komut gönderip Arduino'da işlem yapabiliyorum.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen:string;
begin
 gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Memo1.Lines.Add( DateTimeToStr( Now ) +'  '+ gelen);
 ProgressBar1.Position:= StrToInt( gelen );
 Label1.Caption:=gelen;
  case StrToInt(gelen) of
    0..500:AContext.Connection.IOHandler.WriteLn('led_yak');
    501..1023:AContext.Connection.IOHandler.WriteLn('led_sondur');
  end;
end;

[img]wqCjo3.png[/img]

giphy.gif
 
2. Aşama
İki adet Arduino'dan adc değerini okuyup Delphi'ye göndermek ve ayrı ayrı göstermek. Bu aşamayı da tamamladım.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen: string;
Parcala: TArray<String>;
Arduino_nu:Integer;
adc_deger:string;
begin
  gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Parcala := gelen.Split(['-']);
 Arduino_nu:= StrToInt(parcala[0]);
 adc_deger:= Parcala[1];
 case Arduino_nu of
   1:begin
     Memo1.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar1.Position:= StrToInt( adc_deger);
     Label3.Caption:=adc_deger;
   end;
   2:begin
     Memo2.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar2.Position:= StrToInt( adc_deger);
     Label4.Caption:=adc_deger;
   end;
 end;
end;

giphy.gif  

3. Aşama Çözemediğim ve sormak istediğim kısım
1. Aşamada tek Arduino'ya komut gönderdiğim gibi burada da iki Arduino'dan istediğim Arduino'ya (client) komut göndermek istiyorum. Bunun için bir sonraki sayfada sorulan sorudaki aynı kodları kullanarak bir client listesi oluşturdum.

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
 LHost: string;
 LItem: TListItem;
 List: TIdContextList;
begin
ListView1.Items.BeginUpdate;
 LItem:= ListView1.Items.Add;
 LItem.Caption := AContext.Connection.Socket.Binding.PeerPort.ToString;
 LItem.SubItems.Add(AContext.Connection.Socket.Binding.PeerIP);
 LItem.Data:= AContext;
ListView1.Items.EndUpdate;

ListBox1.Items.Add(AContext.Connection.Socket.Binding.PeerIP
 +' '+ AContext.Connection.Socket.Binding.PeerPort.ToString) ;

end;

Sonuçta şöyle bir ekranım oldu:

giphy.gif
 
Çözemediğim ve sormak istediğim kısım ise 
-iki Arduino'dan istediğime Nasıl komut gönderirim?
-OnExecute dışında buton click altında istediğim Arduino'ya komut gönderebilir miyim?


Değerli tavsiyelerinizi okumayı çok isterim.
KOTO Teknik 10. sınıf öğrencisiyim.
Nextion HMI, Arduino ve Delphi FMX ile ilgileniyorsanız Yotube Kanalım size katkı sağlayabilir.


Cevapla
#2
(22-11-2020, Saat: 15:19)Yasemin Adlı Kullanıcıdan Alıntı: Merhaba
Okulların tekrar kapanmasıyla Delphi ve Arduino üzerinde daha çok çalışmaya başladım. Aklımda şöyle bir IoT projesi tasarladım.

[img]P077FI.png[/img]

1. Aşama
Tek bir Arduino'dan adc değerini Ethernet üzerinden Delphi'ye gönderip değerleri gösterip duruma göre Arduino geri komut göndermek.
Bu aşamayı başarılı bir şekilde geçtim. Case durumuna göre tek bir Arduino'ya geri komut gönderip Arduino'da işlem yapabiliyorum.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen:string;
begin
 gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Memo1.Lines.Add( DateTimeToStr( Now ) +'  '+ gelen);
 ProgressBar1.Position:= StrToInt( gelen );
 Label1.Caption:=gelen;
  case StrToInt(gelen) of
    0..500:AContext.Connection.IOHandler.WriteLn('led_yak');
    501..1023:AContext.Connection.IOHandler.WriteLn('led_sondur');
  end;
end;

[img]wqCjo3.png[/img]

giphy.gif
 
2. Aşama
İki adet Arduino'dan adc değerini okuyup Delphi'ye göndermek ve ayrı ayrı göstermek. Bu aşamayı da tamamladım.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen: string;
Parcala: TArray<String>;
Arduino_nu:Integer;
adc_deger:string;
begin
  gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Parcala := gelen.Split(['-']);
 Arduino_nu:= StrToInt(parcala[0]);
 adc_deger:= Parcala[1];
 case Arduino_nu of
   1:begin
     Memo1.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar1.Position:= StrToInt( adc_deger);
     Label3.Caption:=adc_deger;
   end;
   2:begin
     Memo2.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar2.Position:= StrToInt( adc_deger);
     Label4.Caption:=adc_deger;
   end;
 end;
end;

giphy.gif  

3. Aşama Çözemediğim ve sormak istediğim kısım
1. Aşamada tek Arduino'ya komut gönderdiğim gibi burada da iki Arduino'dan istediğim Arduino'ya (client) komut göndermek istiyorum. Bunun için bir sonraki sayfada sorulan sorudaki aynı kodları kullanarak bir client listesi oluşturdum.

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
 LHost: string;
 LItem: TListItem;
 List: TIdContextList;
begin
ListView1.Items.BeginUpdate;
 LItem:= ListView1.Items.Add;
 LItem.Caption := AContext.Connection.Socket.Binding.PeerPort.ToString;
 LItem.SubItems.Add(AContext.Connection.Socket.Binding.PeerIP);
 LItem.Data:= AContext;
ListView1.Items.EndUpdate;

ListBox1.Items.Add(AContext.Connection.Socket.Binding.PeerIP
 +' '+ AContext.Connection.Socket.Binding.PeerPort.ToString) ;

end;

Sonuçta şöyle bir ekranım oldu:

giphy.gif
 
Çözemediğim ve sormak istediğim kısım ise 
-iki Arduino'dan istediğime Nasıl komut gönderirim?
-OnExecute dışında buton click altında istediğim Arduino'ya komut gönderebilir miyim?


Değerli tavsiyelerinizi okumayı çok isterim.

1.için
TIdContext(ListView1.Items[0].Data).Connection.IOHandler.WriteLn('bla bla bla');

2.için
TIdContext(ListView1.Items[1].Data).Connection.IOHandler.WriteLn('bla bla bla');
Cevapla
#3
(22-11-2020, Saat: 15:40)bibilen Adlı Kullanıcıdan Alıntı:
(22-11-2020, Saat: 15:19)Yasemin Adlı Kullanıcıdan Alıntı: Merhaba
Okulların tekrar kapanmasıyla Delphi ve Arduino üzerinde daha çok çalışmaya başladım. Aklımda şöyle bir IoT projesi tasarladım.

[img]P077FI.png[/img]

1. Aşama
Tek bir Arduino'dan adc değerini Ethernet üzerinden Delphi'ye gönderip değerleri gösterip duruma göre Arduino geri komut göndermek.
Bu aşamayı başarılı bir şekilde geçtim. Case durumuna göre tek bir Arduino'ya geri komut gönderip Arduino'da işlem yapabiliyorum.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen:string;
begin
 gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Memo1.Lines.Add( DateTimeToStr( Now ) +'  '+ gelen);
 ProgressBar1.Position:= StrToInt( gelen );
 Label1.Caption:=gelen;
  case StrToInt(gelen) of
    0..500:AContext.Connection.IOHandler.WriteLn('led_yak');
    501..1023:AContext.Connection.IOHandler.WriteLn('led_sondur');
  end;
end;

[img]wqCjo3.png[/img]

giphy.gif
 
2. Aşama
İki adet Arduino'dan adc değerini okuyup Delphi'ye göndermek ve ayrı ayrı göstermek. Bu aşamayı da tamamladım.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen: string;
Parcala: TArray<String>;
Arduino_nu:Integer;
adc_deger:string;
begin
  gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Parcala := gelen.Split(['-']);
 Arduino_nu:= StrToInt(parcala[0]);
 adc_deger:= Parcala[1];
 case Arduino_nu of
   1:begin
     Memo1.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar1.Position:= StrToInt( adc_deger);
     Label3.Caption:=adc_deger;
   end;
   2:begin
     Memo2.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar2.Position:= StrToInt( adc_deger);
     Label4.Caption:=adc_deger;
   end;
 end;
end;

giphy.gif  

3. Aşama Çözemediğim ve sormak istediğim kısım
1. Aşamada tek Arduino'ya komut gönderdiğim gibi burada da iki Arduino'dan istediğim Arduino'ya (client) komut göndermek istiyorum. Bunun için bir sonraki sayfada sorulan sorudaki aynı kodları kullanarak bir client listesi oluşturdum.

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
 LHost: string;
 LItem: TListItem;
 List: TIdContextList;
begin
ListView1.Items.BeginUpdate;
 LItem:= ListView1.Items.Add;
 LItem.Caption := AContext.Connection.Socket.Binding.PeerPort.ToString;
 LItem.SubItems.Add(AContext.Connection.Socket.Binding.PeerIP);
 LItem.Data:= AContext;
ListView1.Items.EndUpdate;

ListBox1.Items.Add(AContext.Connection.Socket.Binding.PeerIP
 +' '+ AContext.Connection.Socket.Binding.PeerPort.ToString) ;

end;

Sonuçta şöyle bir ekranım oldu:

giphy.gif
 
Çözemediğim ve sormak istediğim kısım ise 
-iki Arduino'dan istediğime Nasıl komut gönderirim?
-OnExecute dışında buton click altında istediğim Arduino'ya komut gönderebilir miyim?


Değerli tavsiyelerinizi okumayı çok isterim.

TIdContext(ListView1.Items[0].Data).Connection.IOHandler.WriteLn('bla bla bla');

ListView komutunu kopyala yapıştır ile aldım. Burda bahsetttiğiniz items değeeri ip mi? yoksa peerport mu?
Tıdcontext'e ip adresi verek client'a veri gönderebilir miyim?
KOTO Teknik 10. sınıf öğrencisiyim.
Nextion HMI, Arduino ve Delphi FMX ile ilgileniyorsanız Yotube Kanalım size katkı sağlayabilir.


Cevapla
#4
(22-11-2020, Saat: 15:44)Yasemin Adlı Kullanıcıdan Alıntı:
(22-11-2020, Saat: 15:40)bibilen Adlı Kullanıcıdan Alıntı:
TIdContext(ListView1.Items[0].Data).Connection.IOHandler.WriteLn('bla bla bla');

ListView komutunu kopyala yapıştır ile aldım. Burda bahsetttiğiniz items değeeri ip mi? yoksa peerport mu?
Tıdcontext'e ip adresi verek client'a veri gönderebilir miyim?

indexof ile ip'nin indexini bulup o indexe göndereceksin
Cevapla
#5
IdTCPServer1.Contexts.LockList
Yukarıdaki listenin her elemanı servere bağlanmış client. Burada liste içinde her bir bağlantı için ip ve port numara bilgisini bulup veriyi gönderebilirsiniz
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#6
(22-11-2020, Saat: 15:40)bibilen Adlı Kullanıcıdan Alıntı:
(22-11-2020, Saat: 15:19)Yasemin Adlı Kullanıcıdan Alıntı: Merhaba
Okulların tekrar kapanmasıyla Delphi ve Arduino üzerinde daha çok çalışmaya başladım. Aklımda şöyle bir IoT projesi tasarladım.

[img]P077FI.png[/img]

1. Aşama
Tek bir Arduino'dan adc değerini Ethernet üzerinden Delphi'ye gönderip değerleri gösterip duruma göre Arduino geri komut göndermek.
Bu aşamayı başarılı bir şekilde geçtim. Case durumuna göre tek bir Arduino'ya geri komut gönderip Arduino'da işlem yapabiliyorum.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen:string;
begin
 gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Memo1.Lines.Add( DateTimeToStr( Now ) +'  '+ gelen);
 ProgressBar1.Position:= StrToInt( gelen );
 Label1.Caption:=gelen;
  case StrToInt(gelen) of
    0..500:AContext.Connection.IOHandler.WriteLn('led_yak');
    501..1023:AContext.Connection.IOHandler.WriteLn('led_sondur');
  end;
end;

[img]wqCjo3.png[/img]

giphy.gif
 
2. Aşama
İki adet Arduino'dan adc değerini okuyup Delphi'ye göndermek ve ayrı ayrı göstermek. Bu aşamayı da tamamladım.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen: string;
Parcala: TArray<String>;
Arduino_nu:Integer;
adc_deger:string;
begin
  gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Parcala := gelen.Split(['-']);
 Arduino_nu:= StrToInt(parcala[0]);
 adc_deger:= Parcala[1];
 case Arduino_nu of
   1:begin
     Memo1.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar1.Position:= StrToInt( adc_deger);
     Label3.Caption:=adc_deger;
   end;
   2:begin
     Memo2.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar2.Position:= StrToInt( adc_deger);
     Label4.Caption:=adc_deger;
   end;
 end;
end;

giphy.gif  

3. Aşama Çözemediğim ve sormak istediğim kısım
1. Aşamada tek Arduino'ya komut gönderdiğim gibi burada da iki Arduino'dan istediğim Arduino'ya (client) komut göndermek istiyorum. Bunun için bir sonraki sayfada sorulan sorudaki aynı kodları kullanarak bir client listesi oluşturdum.

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
 LHost: string;
 LItem: TListItem;
 List: TIdContextList;
begin
ListView1.Items.BeginUpdate;
 LItem:= ListView1.Items.Add;
 LItem.Caption := AContext.Connection.Socket.Binding.PeerPort.ToString;
 LItem.SubItems.Add(AContext.Connection.Socket.Binding.PeerIP);
 LItem.Data:= AContext;
ListView1.Items.EndUpdate;

ListBox1.Items.Add(AContext.Connection.Socket.Binding.PeerIP
 +' '+ AContext.Connection.Socket.Binding.PeerPort.ToString) ;

end;

Sonuçta şöyle bir ekranım oldu:

giphy.gif
 
Çözemediğim ve sormak istediğim kısım ise 
-iki Arduino'dan istediğime Nasıl komut gönderirim?
-OnExecute dışında buton click altında istediğim Arduino'ya komut gönderebilir miyim?


Değerli tavsiyelerinizi okumayı çok isterim.

1.için
TIdContext(ListView1.Items[0].Data).Connection.IOHandler.WriteLn('bla bla bla');

2.için
TIdContext(ListView1.Items[1].Data).Connection.IOHandler.WriteLn('bla bla bla');

giphy.gif

procedure TForm1.Button3Click(Sender: TObject);
var
 I: Integer;
begin
for I := 0 to ListView1.Items.Count -1 do
 begin
    if ListView1.Items[I].Caption=edtIP_adresi.Text then
      begin
        TIdContext(ListView1.Items[I].Data).Connection.IOHandler.WriteLn('led_yak');
      end;
 end;


end;

procedure TForm1.Button4Click(Sender: TObject);
var
 I: Integer;
begin
for I := 0 to ListView1.Items.Count -1 do
 begin
    if ListView1.Items[I].Caption=edtIP_adresi.Text then
      begin
        TIdContext(ListView1.Items[I].Data).Connection.IOHandler.WriteLn('led_sondur');
      end;
 end;

end;

ListView içerisinde for ile gezip IP adresi varsa kodu gönderebiliyorum. 

(22-11-2020, Saat: 15:48)3ddark Adlı Kullanıcıdan Alıntı: IdTCPServer1.Contexts.LockList
Yukarıdaki listenin her elemanı servere bağlanmış client. Burada liste içinde her bir bağlantı için ip ve port numara bilgisini bulup veriyi gönderebilirsiniz

LockList olayını ise çözemedim eğer imkanınız varsa örnek verebilir misiniz?
KOTO Teknik 10. sınıf öğrencisiyim.
Nextion HMI, Arduino ve Delphi FMX ile ilgileniyorsanız Yotube Kanalım size katkı sağlayabilir.


Cevapla
#7
Merhaba

* Şöyle bir örnek açıklayıcı olacaktır.



function TForm1.SendText( aText, aTargetClientIp:String; aTargetClientPort: Integer): boolean;
var
  aPeerList     : TList;
  aContexClient : IdContext.TidContext;
  iIdx          : integer;
begin
  Result    := False;
  aPeerList := IdTCPServer1.Contexts.LockList;
  try
    for iIdx := 0 to pred(aPeerList.Count) do
    begin
      aContexClient := TIdContext( aPeerList[iIdx] );
      if ( aContexClient.Binding.PeerIP   = aTargetClientIP  ) and
         ( aContexClient.Binding.PeerPort = aTargetClientPort)
      then // peer has been found
      try // try to send data
        aContexClient.Connection.IOHandler.Write(aText, IdGlobal.IndyTextEncoding_UTF8 );
        Result := true;
        break;   // break the loop
      except // connection has been lost
        aContexClient.Connection.Disconnect;
      end;
    end;
  finally
    IdTCPServer1.Contexts.UnlockList;
  end;
end;

procedure TForm1.LedStatus( aPeerIp : String; aStat : Boolean );
var
 I: Integer;
begin
  for I := 0 to ListView1.Items.Count -1 do
  begin
    if ListView1.Items[I].Caption = aPeerIp then
      begin
        case aStat of
        true  :
          if SendText( 'led_yak', ListView1.Items[I].Caption, strToInt( ListView1.Items[I].SubItems[0] ) )
            then ShowMessage('OK, Message has been sent to peer...' )
            else ShowMessage('FAIL, Message could not be sent to peer...' );
        false :
          if SendText( 'led_sondur', ListView1.Items[I].Caption, strToInt( ListView1.Items[I].SubItems[0] ) )
            then ShowMessage('OK, Message has been sent to peer...' )
            else ShowMessage('FAIL, Message could not be sent to peer...' );
        end;
      end;
  end;
end;

Örnek kullanımı

procedure TForm1.Button3Click(Sender: TObject);
begin
  LedStatus( edtIP_adresi.Text, True );
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  LedStatus( edtIP_adresi.Text, False);
end;


Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#8
(22-11-2020, Saat: 18:49)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba

* Şöyle bir örnek açıklayıcı olacaktır.



function TForm1.SendText( aText, aTargetClientIp:String; aTargetClientPort: Integer): boolean;
var
  aPeerList     : TList;
  aContexClient : IdContext.TidContext;
  iIdx          : integer;
begin
  Result    := False;
  aPeerList := IdTCPServer1.Contexts.LockList;
  try
    for iIdx := 0 to pred(aPeerList.Count) do
    begin
      aContexClient := TIdContext( aPeerList[iIdx] );
      if ( aContexClient.Binding.PeerIP   = aTargetClientIP  ) and
         ( aContexClient.Binding.PeerPort = aTargetClientPort)
      then // peer has been found
      try // try to send data
        aContexClient.Connection.IOHandler.Write(aText, IdGlobal.IndyTextEncoding_UTF8 );
        Result := true;
        break;   // break the loop
      except // connection has been lost
        aContexClient.Connection.Disconnect;
      end;
    end;
  finally
    IdTCPServer1.Contexts.UnlockList;
  end;
end;

procedure TForm1.LedStatus( aPeerIp : String; aStat : Boolean );
var
 I: Integer;
begin
  for I := 0 to ListView1.Items.Count -1 do
  begin
    if ListView1.Items[I].Caption = aPeerIp then
      begin
        case aStat of
        true  :
          if SendText( 'led_yak', ListView1.Items[I].Caption, strToInt( ListView1.Items[I].SubItems[0] ) )
            then ShowMessage('OK, Message has been sent to peer...' )
            else ShowMessage('FAIL, Message could not be sent to peer...' );
        false :
          if SendText( 'led_sondur', ListView1.Items[I].Caption, strToInt( ListView1.Items[I].SubItems[0] ) )
            then ShowMessage('OK, Message has been sent to peer...' )
            else ShowMessage('FAIL, Message could not be sent to peer...' );
        end;
      end;
  end;
end;

Örnek kullanımı

procedure TForm1.Button3Click(Sender: TObject);
begin
  LedStatus( edtIP_adresi.Text, True );
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  LedStatus( edtIP_adresi.Text, False);
end;



// and         ( aContexClient.Binding.PeerPort = aTargetClientPort)

Muharrem Abi
sadece IP adresi kullanarak veri göndermek istediğim için bu kısmı kapatarak kod çalıştı.

Cevaplarınız için teşekkür ederim. @bibilen @3ddark @mrmarman
KOTO Teknik 10. sınıf öğrencisiyim.
Nextion HMI, Arduino ve Delphi FMX ile ilgileniyorsanız Yotube Kanalım size katkı sağlayabilir.


Cevapla
#9
Merhaba, adaptasyon için tebrikler.

- Proje geliştirirken yerel ağ ile sınırlı kalmamak için PORT'u da dahil ediyorum. 

Not: Verdiğim kodda siz IP verseniz de, listenizden ilgili IP'nin portunu ListView içindeki SubItems(0)'dan tespit ediyor olacağından yine çalışmasını beklerim.

- IoT teknolojileri LAN'dan WAN üzerine çıktığında, aynı evdeki örneğin (5) adet cihaz aynı LAN altında (5) farklı IP adresi alabiliyor iken, WAN üzerinden harici bir sunucuya ulaşırken sadece modemin yegane tek dış IP'si ile bağlanacaktır. Bu durumda IP yetmez PORT'u da dahil etmek lazım gelir. Çünkü aynı NAT altında çalışır. Bu durumda da ek bir işlem olarak bu portların da dahili ağda ilgili IP'lere modem router üzerinden yönlendirilmesi de gerekecektir ki şu aşamada sizin buna ihtiyacınız olmayacaktır. Sadece kodlamada geleceğe yatırım amaçlı yazdım bunları.

- Bir adım daha ilerleyelim, hücresel data ile bağlanacak bir cep telefonu da dışarısıdır WAN üzerindedir.

- Proje testlerini bu şekilde sürdürmenizde sakınca olmaz, ancak projelendirip dışarıdan erişime dahil etmek gibi bir amaç güderseniz PORT kısmı ve dahi bu da yetmeyecek her bir CLIENT'a unique ( tekil / benzersiz ) birer ID üretilmesi / gömülmesi vs. gerekecektir. ( ID'lerin UDP'den broadcast konusundan bahis )

- Amaç kafanızı karıştırmak değil, geri bu başlığa döndüğünüzde arama anahtarlarını vermekti.  Idea

Projelerinizde yolunuz açık olsun. Başarılar.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#10
(22-11-2020, Saat: 15:19)Yasemin Adlı Kullanıcıdan Alıntı: Merhaba
Okulların tekrar kapanmasıyla Delphi ve Arduino üzerinde daha çok çalışmaya başladım. Aklımda şöyle bir IoT projesi tasarladım.

[img]P077FI.png[/img]

1. Aşama
Tek bir Arduino'dan adc değerini Ethernet üzerinden Delphi'ye gönderip değerleri gösterip duruma göre Arduino geri komut göndermek.
Bu aşamayı başarılı bir şekilde geçtim. Case durumuna göre tek bir Arduino'ya geri komut gönderip Arduino'da işlem yapabiliyorum.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen:string;
begin
 gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Memo1.Lines.Add( DateTimeToStr( Now ) +'  '+ gelen);
 ProgressBar1.Position:= StrToInt( gelen );
 Label1.Caption:=gelen;
  case StrToInt(gelen) of
    0..500:AContext.Connection.IOHandler.WriteLn('led_yak');
    501..1023:AContext.Connection.IOHandler.WriteLn('led_sondur');
  end;
end;

[img]wqCjo3.png[/img]

giphy.gif
 
2. Aşama
İki adet Arduino'dan adc değerini okuyup Delphi'ye göndermek ve ayrı ayrı göstermek. Bu aşamayı da tamamladım.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
gelen: string;
Parcala: TArray<String>;
Arduino_nu:Integer;
adc_deger:string;
begin
  gelen:=AContext.Connection.IOHandler.ReadLn();
 //gelen veriyi satı sonuna kadar oku
 Parcala := gelen.Split(['-']);
 Arduino_nu:= StrToInt(parcala[0]);
 adc_deger:= Parcala[1];
 case Arduino_nu of
   1:begin
     Memo1.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar1.Position:= StrToInt( adc_deger);
     Label3.Caption:=adc_deger;
   end;
   2:begin
     Memo2.Lines.Add( DateTimeToStr(Now) +' '+ adc_deger );
     ProgressBar2.Position:= StrToInt( adc_deger);
     Label4.Caption:=adc_deger;
   end;
 end;
end;

giphy.gif  

3. Aşama Çözemediğim ve sormak istediğim kısım
1. Aşamada tek Arduino'ya komut gönderdiğim gibi burada da iki Arduino'dan istediğim Arduino'ya (client) komut göndermek istiyorum. Bunun için bir sonraki sayfada sorulan sorudaki aynı kodları kullanarak bir client listesi oluşturdum.

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
 LHost: string;
 LItem: TListItem;
 List: TIdContextList;
begin
ListView1.Items.BeginUpdate;
 LItem:= ListView1.Items.Add;
 LItem.Caption := AContext.Connection.Socket.Binding.PeerPort.ToString;
 LItem.SubItems.Add(AContext.Connection.Socket.Binding.PeerIP);
 LItem.Data:= AContext;
ListView1.Items.EndUpdate;

ListBox1.Items.Add(AContext.Connection.Socket.Binding.PeerIP
 +' '+ AContext.Connection.Socket.Binding.PeerPort.ToString) ;

end;

Sonuçta şöyle bir ekranım oldu:

giphy.gif
 
Çözemediğim ve sormak istediğim kısım ise 
-iki Arduino'dan istediğime Nasıl komut gönderirim?
-OnExecute dışında buton click altında istediğim Arduino'ya komut gönderebilir miyim?


Değerli tavsiyelerinizi okumayı çok isterim.

@Yasemin Soru örnek niteliğinde güzel bir sonuca ulaşmış.

Burada merak ettiğim Arduino tarafında nasıl bir kod çalışıyor, bu konuda bilgi verebilir misiniz.

Projeler; 
1-Arduino tarafında çalışan kodlar. (Bu kısmında Delphi kodlama dışınca C kodları ile işlem yapıyor diye biliyorum.) 
2-Delphi tarafında veri çalışan kodlar.

Teşekkürler.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [ÇÖZÜLDÜ] Scrollbox içindeki nesneyi başka scrollbox a sürükle bırak wiseman 14 258 Dün, Saat: 21:36
Son Yorum: wiseman
  [ÇÖZÜLDÜ] WebDav ile Bulut Sunucuya Dosya Yükleme theSinan 9 2.833 14-01-2021, Saat: 01:48
Son Yorum: SenayAkgun
  [ÇÖZÜLDÜ] Çalışma Zamanında oluşturulan nesnede çalışma farkı wiseman 7 198 13-01-2021, Saat: 12:53
Son Yorum: PROGRAMADOR35
  Aynı anda 10.000 farklı cihazdan veri alışverişi yapma. pro_imaj 23 1.342 27-12-2020, Saat: 11:22
Son Yorum: pro_imaj
  [ÇÖZÜLDÜ] Tablodaki verileri belirli bir düzenle memoya aktarma wiseman 8 330 25-12-2020, Saat: 17:14
Son Yorum: hi_selamlar



Konuyu Okuyanlar: 1 Ziyaretçi