마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

connectivityManager으로 wifi 연결 후 TCP server에서의 통신에서 문제가 있습니다.

0 추천

안녕하세요, Android 개발을 처음해본 개발자입니다. 현제 앱에서 SSID를 통해서 원하는 wifi를 연결하고 TCP 통신을 하는 프로젝트를 진행하고 있습니다. Android 13(API 수준 33)에서 connectivityManager를 통해서 wifi를 연결 한 후 TCP server와 통신 하는 것에 문제가 있습니다.  

Android 상에서 와이파이를 직접 연결하면 TCP SERVER와 통신이 됩니다. 

하지만 connectivityManager을 통해서 wifi를 연결후 TCP server와 통신하려고 하면 android에서는 핑조차 날라가지 않습니다. 하지만 서버에서는 핑이 잘 날라갑니다.

​밑에는 코드입니다.

wifi 연결 코드

using Android.App;
using Android.Content;
using Android.Net.Wifi;
using Android.Net;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xamarin.Forms;

[assembly: Dependency(typeof(RemoteAGV.Droid.WifiConnector))]

namespace RemoteAGV.Droid
{
    public class WifiConnector : IWifiConnector
    {
        Context context;
        WifiManager wifiManager;
        ConnectivityManager connectivityManager;

        public WifiConnector()
        {
            context = Android.App.Application.Context;
            wifiManager = (WifiManager)context.GetSystemService(Context.WifiService);
            connectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
        }

        public void ConnectToWifi(string ssid, string password)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
            {
                NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                    .SetSsid(ssid)
                    .SetWpa2Passphrase(password)
                    .Build();

                NetworkRequest request = new NetworkRequest.Builder()
                    .AddTransportType(Android.Net.TransportType.Wifi)
                    .SetNetworkSpecifier(specifier)
                    .Build();

                ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback();
                connectivityManager.RequestNetwork(request, callback);

            }
            else
            {
                Toast.MakeText(Android.App.Application.Context, "FALSE", ToastLength.Short).Show();

            }
        }
    }
}

TCP 통신 부분 코드

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Text;

namespace RemoteAGV
{
    static public class COMM
    {
        static private TcpClient m_TcpClient = null;
        static NetworkStream m_ClientStream = null;

        static public Byte[] m_WriteBuffer = new Byte[10];
       
        /*  MOVE(Control Page)
             //header(0~2)
             * byte[0] = 60; //<
             * byte[1] = 83; //S
             * byte[2] = 62; //>
             * 
             * byte[3] = mode ->  0 = 일반  1 = QD
             * byte[4] = linear velocity 선속도 0.1 ~ 1.8  (value : * 10)
             * byte[5] = angular velocity 각속도 5 ~ 30
             * byte[6] = direction button
             * byte[7] = Exclusive OR //데이터 정합성
             * 
        */

        static public bool Connect()
        {
            m_TcpClient = new TcpClient();

            if (m_TcpClient.ConnectAsync("192.168.0.8", 8899).Wait(1000))  //test
            // 여기서 부터 TCP 연결이 안 됨   
            // if (m_TcpClient.ConnectAsync("10.10.100.254", 8899).Wait(200))
                    m_ClientStream = m_TcpClient.GetStream();
            else
                return false;           

            return true;
        }

        static public void Close()
        {
            if (m_ClientStream != null) m_ClientStream.Close();
            if (m_TcpClient != null) m_TcpClient.Close();
        }

        public static void ClearWriteBuffer()
        {
            Array.Clear(m_WriteBuffer, 0, m_WriteBuffer.Length);
        }

        public static bool WriteData()
        {
            try
            {
                if (m_TcpClient.Connected && m_ClientStream != null)
                {
                    m_ClientStream.Write(m_WriteBuffer, 0, m_WriteBuffer.Length);
                    m_ClientStream.Flush();
                }
            }

            catch (IOException ex)
            {
                return false;
            }

            return true;           
        }

        public static void WriteEndData()
        {
            ClearWriteBuffer();

            Byte _BCC = 0;

            //head
            COMM.m_WriteBuffer[0] = 60; //<
            COMM.m_WriteBuffer[1] = 83; //S
            COMM.m_WriteBuffer[2] = 62; //>

            COMM.m_WriteBuffer[3] = 0;

            COMM.m_WriteBuffer[4] = 0;

            COMM.m_WriteBuffer[5] = 0;

            COMM.m_WriteBuffer[6] = 0;

            for (int i = 0; i < 7; i++)
            {
                _BCC ^= COMM.m_WriteBuffer[i];
            }
            COMM.m_WriteBuffer[7] = _BCC;

            WriteData();
        }     
    }    
}

 

해결 방법을 알면 좋겠지만 해결이 가능 여부라도 알고 싶습니다. 감사합니다.

김민세 (120 포인트) 님이 2월 14일 질문
김민세님이 2월 14일 수정

1개의 답변

0 추천
ip가 192 군용...

어제두 비슷한 글을 본것 같은데...

각설하고 포트포워딩 설정을 해주시거나

고정아이피를 신청하시면 뎁니다.

Good luck
비애천사 (12,080 포인트) 님이 2월 14일 답변
서버에서는 2개다 하였는데 해결이 되지 않습니다. 혹시 android에서 따로 해야하나요?
WiFi망(SVR1, SVR2)
5G망(And)
여기서 SVR1, SVR2 는 포트포워딩 설정.
이 때는 가능한데...

WiFi망(SVR1, SVR2, And)
일때가 문제라는 말씀 맞나요?
...