掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
IdUDPServerのBroadcastをAndroidで受信する方法を教えてください。 (ID:148555)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
最終的にWindows側(A)がサーバーでAndroid側(B)がクライアントの構成 Windows側からネットワーク全体にブロードキャスト送信してサーバーのIPアドレスを通知 Android側でブロードキャスト受信が出来れば、クライアントとして接続先がわかるので サーバーのIPアドレスを指定する必要が無く便利 という仕様で(例1)に (A)と(B)の処理を記述 【現象】これがAndroidでうまくいったりいかなかったりする。 【解決1】Java2OPでWifiManagerクラスを使ってWifiの有効無効を制御でブロードキャストがうまくいった。 ↑これはよくわからない 【原因】 Androidの省エネによる最適化でブロードキャストは制限があると思われます。 Stack Overflowのソースを参考に対応コンパイラも環境もありませんが書いてみました。 function WifiLock : JWiFiManager; var Obj: JObject; begin Obj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE); if not Assigned(Obj) then raise Exception.Create('Could not locate Wifi Service'); multiCastLock := Obj.createMulticastLock(StringToJString('lock')); multiCastLock.acquire(); end; function WifiUnLock : JWiFiManager; var Obj: JObject; begin Obj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE); if not Assigned(Obj) then raise Exception.Create('Could not locate Wifi Service'); multiCastLock := Obj.createMulticastLock(StringToJString('lock')); multiCastLock.release(); end; (例1) Windows同士だったらIndyのUdpServerで (B) サーバーとして起動 UdpServerB.Active := True; (A) ブロードキャスト送信 UdpServerA.BroadcastEnabled := True; UdpServerA.Active := True; UdpServerA.Broadcast('アプリを識別する文字列'#13#10, (B)のサーバーのポート); (B) ブロードキャストの受信と返信 ついでに接続 procedure TForm1.UdpServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var ip, s: string; begin s := ''; SetLength(s, AData.Size); AData.Read(s[1], Length(s)); ip := ABinding.PeerIP; UdpServerB.Send(ip, (B)のサーバーのポート, s); UdpClientB.Host := ip; UdpClientB.Connect; end; (A) ブロードキャストの返信を受信 procedure TForm1.UdpServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var ip, s: string; begin s := ''; SetLength(s, AData.Size); AData.Read(s[1], Length(s)); ip := ABinding.PeerIP; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.