2012-11-23 17 views
55

ठीक है यह एक है जिसे मैं कुछ दिनों के लिए पता लगाने की कोशिश कर रहा हूं। हमारे पास विंडोज फोन 7 पर एक एप्लीकेशन है जहां फोन मल्टीकास्ट समूह में शामिल होते हैं और फिर एक-दूसरे से बात करने के लिए समूह को संदेश भेजते और प्राप्त करते हैं। नोट - यह फोन संचार के लिए फोन है। विजुअल स्टूडियो 2012 में 'Phone 8 में बदलें' सुविधा का उपयोग - -विंडोज फोन पर यूडीपी मल्टीकास्ट समूह 8

अब मैं Windows Phone 8 के लिए इस आवेदन बंदरगाह के लिए कोशिश कर रहा हूँ अब तक तो अच्छा। जब तक मैं फोन संचार के लिए फोन का परीक्षण करने की कोशिश नहीं करता। हैंडसेट समूह जुर्माना में शामिल होने लगते हैं, और वे डेटाग्राम ठीक भेजते हैं। वे समूह को भेजे गए संदेश भी प्राप्त करते हैं - हालांकि, किसी हैंडसेट को कभी भी किसी अन्य हैंडसेट से संदेश प्राप्त नहीं होता है।

यहाँ मेरी पृष्ठ पर पीछे नमूना कोड है:

// Constructor 
public MainPage() 
{ 
    InitializeComponent(); 
} 

// The address of the multicast group to join. 
// Must be in the range from 224.0.0.0 to 239.255.255.255 
private const string GROUP_ADDRESS = "224.0.1.1"; 

// The port over which to communicate to the multicast group 
private const int GROUP_PORT = 55562; 

// A client receiver for multicast traffic from any source 
UdpAnySourceMulticastClient _client = null; 

// Buffer for incoming data 
private byte[] _receiveBuffer; 

// Maximum size of a message in this communication 
private const int MAX_MESSAGE_SIZE = 512; 

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    _client = new UdpAnySourceMulticastClient(IPAddress.Parse(GROUP_ADDRESS), GROUP_PORT); 
    _receiveBuffer = new byte[MAX_MESSAGE_SIZE]; 

    _client.BeginJoinGroup(
     result => 
     { 
      _client.EndJoinGroup(result); 
      _client.MulticastLoopback = true; 
      Receive(); 
     }, null); 
} 

private void SendRequest(string s) 
{ 
    if (string.IsNullOrWhiteSpace(s)) return; 

    byte[] requestData = Encoding.UTF8.GetBytes(s); 

    _client.BeginSendToGroup(requestData, 0, requestData.Length, 
     result => 
     { 
      _client.EndSendToGroup(result); 
      Receive(); 
     }, null); 
} 

private void Receive() 
{ 
    Array.Clear(_receiveBuffer, 0, _receiveBuffer.Length); 
    _client.BeginReceiveFromGroup(_receiveBuffer, 0, _receiveBuffer.Length, 
     result => 
     { 
      IPEndPoint source; 

      _client.EndReceiveFromGroup(result, out source); 

      string dataReceived = Encoding.UTF8.GetString(_receiveBuffer, 0, _receiveBuffer.Length); 

      string message = String.Format("[{0}]: {1}", source.Address.ToString(), dataReceived); 
      Log(message, false); 

      Receive(); 
     }, null); 
} 

private void Log(string message, bool isOutgoing) 
{ 
    if (string.IsNullOrWhiteSpace(message.Trim('\0'))) 
    { 
     return; 
    } 

    // Always make sure to do this on the UI thread. 
    Deployment.Current.Dispatcher.BeginInvoke(
    () => 
    { 
     string direction = (isOutgoing) ? ">> " : "<< "; 
     string timestamp = DateTime.Now.ToString("HH:mm:ss"); 
     message = timestamp + direction + message; 
     lbLog.Items.Add(message); 

     // Make sure that the item we added is visible to the user. 
     lbLog.ScrollIntoView(message); 
    }); 

} 

private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    // Don't send empty messages. 
    if (!String.IsNullOrWhiteSpace(txtInput.Text)) 
    { 
     //Send(txtInput.Text); 
     SendRequest(txtInput.Text); 
    } 
} 

private void btnStart_Click(object sender, RoutedEventArgs e) 
{ 
    SendRequest("start now"); 
} 

आदेश बस यूडीपी ढेर का परीक्षण करने के लिए, मैंने डाउनलोड किया MSDN से नमूना पाया here और मैं विंडोज फोन 7 की एक जोड़ी पर इस परीक्षण किया डिवाइस और यह अपेक्षित के रूप में काम करता है। फिर मैंने विंडोज फोन 8 में परिवर्तित कर दिया और अपने हैंडसेट पर तैनात किया, फिर से डिवाइस अपने कनेक्शन शुरू करने लगते हैं, और उपयोगकर्ता अपना नाम दर्ज कर सकते हैं। हालांकि, फिर से डिवाइस अन्य उपकरणों के साथ देख या संवाद नहीं कर सकते हैं।

अंत में मैं नए DatagramSocket कार्यान्वयन का उपयोग एक साधारण संचार परीक्षण लागू किया है, और फिर मैं सफल दीक्षा देखते हैं, लेकिन कोई अंतर डिवाइस संचार।

// Constructor 
public MainPage() 
{ 
    InitializeComponent(); 
} 

// The address of the multicast group to join. 
// Must be in the range from 224.0.0.0 to 239.255.255.255 
private const string GROUP_ADDRESS = "224.0.1.1"; 

// The port over which to communicate to the multicast group 
private const int GROUP_PORT = 55562; 

private DatagramSocket socket = null; 

private void Log(string message, bool isOutgoing) 
{ 
    if (string.IsNullOrWhiteSpace(message.Trim('\0'))) 
     return; 

    // Always make sure to do this on the UI thread. 
    Deployment.Current.Dispatcher.BeginInvoke(
    () => 
    { 
     string direction = (isOutgoing) ? ">> " : "<< "; 
     string timestamp = DateTime.Now.ToString("HH:mm:ss"); 
     message = timestamp + direction + message; 
     lbLog.Items.Add(message); 

     // Make sure that the item we added is visible to the user. 
     lbLog.ScrollIntoView(message); 
    }); 
} 

private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    // Don't send empty messages. 
    if (!String.IsNullOrWhiteSpace(txtInput.Text)) 
    { 
     //Send(txtInput.Text); 
     SendSocketRequest(txtInput.Text); 
    } 
} 

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    socket = new DatagramSocket(); 
    socket.MessageReceived += socket_MessageReceived; 

    try 
    { 
     // Connect to the server (in our case the listener we created in previous step). 
     await socket.BindServiceNameAsync(GROUP_PORT.ToString()); 
     socket.JoinMulticastGroup(new Windows.Networking.HostName(GROUP_ADDRESS)); 
     System.Diagnostics.Debug.WriteLine(socket.ToString()); 
    } 
    catch (Exception exception) 
    { 
     throw; 
    } 
} 

private async void SendSocketRequest(string message) 
{ 
    // Create a DataWriter if we did not create one yet. Otherwise use one that is already cached. 
    //DataWriter writer; 
    var stream = await socket.GetOutputStreamAsync(new Windows.Networking.HostName(GROUP_ADDRESS), GROUP_PORT.ToString()); 
    //writer = new DataWriter(socket.OutputStream); 
    DataWriter writer = new DataWriter(stream); 

    // Write first the length of the string as UINT32 value followed up by the string. Writing data to the writer will just store data in memory. 
    // stream.WriteAsync(
    writer.WriteString(message); 

    // Write the locally buffered data to the network. 
    try 
    { 
     await writer.StoreAsync(); 
     Log(message, true); 
     System.Diagnostics.Debug.WriteLine(socket.ToString()); 
    } 
    catch (Exception exception) 
    { 
     throw; 
    } 
    finally 
    { 
     writer.Dispose(); 
    } 
} 

void socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) 
{ 
    try 
    { 
     uint stringLength = args.GetDataReader().UnconsumedBufferLength; 
     string msg = args.GetDataReader().ReadString(stringLength); 

     Log(msg, false); 
    } 
    catch (Exception exception) 
    { 
     throw; 
    } 
} 

बीती रात मैं हैंडसेट घर ले, कम अपने घर वायरलेस नेटवर्क पर उन्हें परीक्षण करने और निहारना मैं सफल डिवाइस संचार प्राप्त करने के लिए:

यह आंकड़ारेख सॉकेट कार्यान्वयन का उपयोग कर पृष्ठ के पीछे एक ही कोड है।

तो रिकैक करने के लिए - मेरी विरासत विंडोज फोन 7 कोड मेरे काम नेटवर्क पर ठीक चलती है। विंडोज फोन 8 के पोर्ट (कोई वास्तविक कोड परिवर्तन नहीं) इंटर-डिवाइस संचार नहीं भेजता है। यह कोड मेरे घर नेटवर्क पर काम करता है। कोड संलग्न डीबगर के साथ चलता है और निष्पादन के दौरान कहीं भी त्रुटियों या अपवादों के संकेत नहीं हैं।

हैंडसेट मैं उपयोग कर रहा हूँ कर रहे हैं:

विंडोज फोन 7 - नोकिया लूमिया 900 (* 2), नोकिया लूमिया 800 (* 3) Windows Phone 8 - नोकिया लूमिया 920 (* 1), नोकिया लिमिया 820 (* 2)

इन सभी नवीनतम ओएस चल रहा है, और डेवलपर मोड में हैं कर रहे हैं। विकास वातावरण विंडोज 8 एंटरप्राइज़ चल रहा है विजुअल स्टूडियो 2012 पेशेवर

मैं आपको वायरलेस नेटवर्क के बारे में बहुत कुछ नहीं बता सकता - फोन 7 डिवाइसों के अलावा कोई परेशानी नहीं है।

घर वायरलेस नेटवर्क मैं प्रयोग किया जाता है, कि बदल 'बॉक्स से बाहर' सेटिंग में से कोई भी साथ सिर्फ एक बुनियादी बीटी ब्रॉडबैंड रूटर है।

जाहिर है वहाँ तरीका है कि दो नेटवर्क कॉन्फ़िगर किया गया है के साथ एक मुद्दा है, लेकिन वहां भी तरह से Windows Phone 8 यूडीपी संदेशों को लागू करता है के साथ बहुत स्पष्ट रूप से एक मुद्दा है।

किसी भी इनपुट की सराहना की जाएगी क्योंकि यह अभी मुझे पागल कर रहा है।

+1

माइक्रोसॉफ्ट से मिली नवीनतम टिप्पणी यह ​​है कि यह ढेर में एक बग से संबंधित हो सकता है। अभी तक मैं उनसे वापस सुनने का इंतजार कर रहा हूं। जब मैं और अधिक सुनता हूं तो मैं इस पोस्ट को अपडेट कर दूंगा। हालांकि, WinRT कार्यान्वयन को काम करने के लिए बनाया जा सकता है, अगर SendSocketRequest कार्यान्वयन की पहली पंक्ति इस में बदल दी गई है: 'var stream = सॉकेट का इंतजार करें। GetOutputStreamAsync (नया Windows.Networking.HostName (IPAddress.Broadcast.ToString()), GROUP_PORT .ToString()); ' –

+0

" 239.0.0.11 "जैसे विभिन्न समूह पते का उपयोग करने का प्रयास करें। – nucleons

+0

माइक्रोसॉफ्ट से कोई और शब्द? मैं एक ही मुद्दा मार रहा हूं और एक काम नहीं मिला है। – briandunnington

उत्तर

1

मुझे लगता है कि आप लूपबैक का उपयोग करते हैं। मुझे लगता है कि इसका मतलब है कि जब आप अपने ग्राहक से एक संदेश भेजते हैं तो आपको वह संदेश प्राप्त होगा जिसे आपने भेजा था। इसका मतलब है कि आपका प्राप्त हैंडलर आग लगेगा।यह एक अप्रत्याशित रूप से unthreadsafe फैशन में प्राप्त बफर को समाशोधन का प्रभाव है। अपनी प्राप्त विधि में कुछ प्रयास करने का प्रयास करें और देखें कि क्या कुछ भी अवांछित हो रहा है लेकिन आप किसी भी मामले में साझा प्राप्त बफर का उपयोग नहीं कर सकते हैं।

1

क्या आपने कभी एक और मल्टीकास्ट समूह में शामिल होने का प्रयास किया है? क्योंकि 224.0.1.1 आईएएनए असाइनमेंट के रूप में उपयोग में प्रतीत होता है। आपको सभी here मिलते हैं।

शायद विंडोज फोन 8 पर कुछ सेवा आने वाले संदेशों को सुनने के लिए कड़ी बाध्य है (उदा। नेटवर्क सेवा जो कर्नेल मोड में चल रही है) और उन्हें आपको अग्रेषित नहीं किया जाता है।

1

यूडीपी बहुस्त्र्पीय ताकि आप विंडोज फोन के लिए एक ही चेकआउट चाहिए मेरे अनुभव से विंडोज फोन 7 के तहत बहुत अजीब काम करता है 8.

यहाँ मेरा अनुभव है:

  1. जांच जो आधिकारिक तौर पर उदाहरण के लिए समर्थित है, विंडोज फोन ओएस 7.1 के तहत (पिछली ओएस मैंने स्विच करने से पहले कोशिश की), टीसीपी यूनिकास्ट, यूडीपी यूनिकास्ट, और यूडीपी मल्टीकास्ट क्लाइंट समर्थित हैं।
  2. विंडोज फोन परमिट के कुछ संस्करण केवल यूडीपी सत्र प्राप्त करने के लिए अनुमति देते हैं यदि क्लाइंट ने इसे पहली बार खोला है और सत्र 10 सेकंड से अधिक के भीतर प्राप्त नहीं होता है, तो यह विंडोज फोन पर किसी प्रकार की सुरक्षा चीज़ की तरह लगता है।
  3. विभिन्न पतों के साथ प्रयास करें: 224.0.0.0 से 224.0.0.255 तक की श्रेणी में मल्टीकास्ट पते "प्रसिद्ध" आरक्षित मल्टीकास्ट पते हैं।
  4. वर्चुअल मशीन और वास्तविक फोन डिवाइस दोनों में जांचें, व्यवहार भिन्न हो सकता है।
संबंधित मुद्दे