Android UDP多播(服务器)到C#WPF(客户端)有时仅适用于已注册的多播ip

时间:2016-03-08 12:59:08

标签: c# android wpf udp multicast

我正在开发一个简单的应用程序,它使用UDP Multicast将摄像机字节流发送到c#wpf应用程序。我能够使用UDP广播实现这一目标。

但我想要的是使用UDP多播连接它,但只有当我使用注册的多播IP(如“224.0.0.1”)时才能为我工作。

关于我的Android代码: 我已经为udp连接编写了一个服务,我可以从任何活动/片段调用它。本服务具有发送图像和文本的功能。

在Camera PreviewCallback上

private PreviewCallback previewCb = new PreviewCallback() {
        public void onPreviewFrame(byte[] frame, Camera c) {
            mService.initSocket();
            mService.sendImages(frame);
            c.addCallbackBuffer(frame);
        }
    };

相机设置:

Camera.Parameters p = camera_.getParameters();
        p.setPreviewSize(procSize_.width, procSize_.height);
        //p.setPreviewFormat(ImageFormat.NV21);
        p.setPreviewFpsRange(targetMaxFrameRate, targetMinFrameRate);
        camera_.setParameters(p);

        PixelFormat pixelFormat = new PixelFormat();
        PixelFormat.getPixelFormatInfo(ImageFormat.RGB_565, pixelFormat);
        int bufSize = procSize_.width * procSize_.height * pixelFormat.bitsPerPixel / 8;
        byte[] buffer = null;
        for(int i = 0; i < bufNumber; i++) {
            buffer = new byte[ bufSize ];
            camera_.addCallbackBuffer(buffer);
        }
        camera_.setPreviewCallbackWithBuffer(cb);

发送图片功能

    while(bRunning) {
      int sessionNumber = 0;
      byte[] buff = msg;
      int packets = (int) Math.ceil(buff.length / (float) DATAGRAM_MAX_SIZE);
      for (int i = 0; i < packets; i++) {
    DatagramPacket packet = new DatagramPacket(data, data.length, localaddress, 11000);
sessionNumber = sessionNumber < MAX_SESSION_NUMBER ? ++sessionNumber : 0;
    if(sessionNumber == packets){
                    bRunning = false;
                 }
           }
    }      

关于我的C#代码: 我创建了一个UDPMulticast监听器:

IPAddress multicastIP= IPAddress.Parse("224.0.0.1");
UdpClient udpClient = new UdpClient();
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, port);
udpClient.MulticastLoopback = true;
udpClient.Client.Bind(remoteEndPoint);
udpClient.JoinMulticastGroup(multicastIP);
byte[] finalBuffer = new byte[80000];
            while (true)
            {
                byte[] buffer = new byte[1048];
                buffer = mUDPClient.Receive(ref ipEndPoint);
                if (buffer[5].Equals(0))
                {
                    MemoryStream stream = new MemoryStream(finalBuffer);
                    imgPreview.Source = GetImage(stream);
                    finalBuffer = new byte[25000];
                    Array.Copy(buffer, finalBuffer, buffer[4]);
                }
                else
                {
                    Array.Copy(buffer, finalBuffer, buffer[4]);
                }
            }

public BitmapImage GetImage(Stream iconStream)
        {
            var imgbrush = new BitmapImage();
            imgbrush.BeginInit();
            imgbrush.StreamSource = iconStream;
            imgbrush.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            imgbrush.EndInit();
            var ib = new ImageBrush(imgbrush);
            return imgbrush;
        }

即使我连接了,我在imgbrosh.EndIt()收到一个错误,说图像格式不正确,因为即使我的第一张图片也没有被创建。

感谢任何帮助,谢谢。

0 个答案:

没有答案