UWPからTCPサーバー上のライブデータを取得します(更新)

スミットモディ

以下は、基本的にデータをTCPサーバーに送信する1つの方法です。

         UPDATE BEGINS HERE: 
 //////////////////////////////////
 private string FormatValueByPresentation(IBuffer buffer, GattPresentationFormat format)
    {
        // BT_Code: For the purpose of this sample, this function converts only UInt32 and
        // UTF-8 buffers to readable text. It can be extended to support other formats if your app needs them.
        byte[] data;
        CryptographicBuffer.CopyToByteArray(buffer, out data);
        if (format != null)
        {
            if (format.FormatType == GattPresentationFormatTypes.UInt32 && data.Length >= 4)
            {
                return BitConverter.ToInt32(data, 0).ToString();
            }
            else if (format.FormatType == GattPresentationFormatTypes.Utf8)
            {
                try
                {
                    return Encoding.UTF8.GetString(data);
                }
                catch (ArgumentException)
                {
                    return "(error: Invalid UTF-8 string)";
                }
            }
            else
            {
                // Add support for other format types as needed.
                return "Unsupported format: " + CryptographicBuffer.EncodeToHexString(buffer);
            }
        }
        else if (data != null)
        {
            // We don't know what format to use. Let's try some well-known profiles, or default back to UTF-8.
            if (selectedCharacteristic.Uuid.Equals(GattCharacteristicUuids.HeartRateMeasurement))
            {
                try
                { 
                    ///////LOOK HERE/////
                    **string b = ParseHeartRateValue(data).ToString();
                    TrySend(b); 
                    //return "Heart Rate: " + ParseHeartRateValue(data).ToString();
                    return "Heart Rate: " + b;** 
                }
                catch (ArgumentException)
                {
                    return "Heart Rate: (unable to parse)";
                }
            }
            else if (selectedCharacteristic.Uuid.Equals(GattCharacteristicUuids.BatteryLevel))
            {
                try
                {
                    // battery level is encoded as a percentage value in the first byte according to
                    // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.battery_level.xml
                    return "Battery Level: " + data[0].ToString() + "%";
                }
                catch (ArgumentException)
                {
                    return "Battery Level: (unable to parse)";
                }
            }
            // This is our custom calc service Result UUID. Format it like an Int
            else if (selectedCharacteristic.Uuid.Equals(Constants.ResultCharacteristicUuid))
            {
                return BitConverter.ToInt32(data, 0).ToString();
            }
            // No guarantees on if a characteristic is registered for notifications.
            else if (registeredCharacteristic != null)
            {
                // This is our custom calc service Result UUID. Format it like an Int
                if (registeredCharacteristic.Uuid.Equals(Constants.ResultCharacteristicUuid))
                {
                    return BitConverter.ToInt32(data, 0).ToString();
                }
            }
            else
            {
                try
                {
                    return "Unknown format: " + Encoding.UTF8.GetString(data);
                }
                catch (ArgumentException)
                {
                    return "Unknown format";
                }
            }
        }
        else
        {
            return "Empty data received";
        }
        return "Unknown format";
    }
        ///////// END OF UPDATE //////


 private async void TrySend(string data)

    {
        // Create the StreamSocket and establish a connection to the echo server.

        StreamSocket socket = new StreamSocket();
        try
        {
            var streamSocket = new Windows.Networking.Sockets.StreamSocket();
            {
                //The server hostname that we will be establishing a connection to. In this example, the server and client are in the same process.
                var hostName = new Windows.Networking.HostName("127.0.0.1");
                await streamSocket.ConnectAsync((new Windows.Networking.HostName("127.0.0.1")), "9999");

                // Send a request to the echo server.
                using (Stream outputStream = streamSocket.OutputStream.AsStreamForWrite())
                {
                    using (var streamWriter = new StreamWriter(outputStream))
                    {
                        while (true)
                        {
                            await streamWriter.WriteLineAsync(data);
                            await streamWriter.FlushAsync();
                        }

                        //await streamWriter.WriteLineAsync(data);
                        //await streamWriter.FlushAsync();
                    }
                }
            }
        }
        catch (Exception)
        {
        }
    }

そして、これがデータを受信する私のTCPサーバーコードです:

 public class EchoServer {
public static void Main() {
    TcpListener listener = null;

    try
    {
        listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 9999);
        listener.Start();
        Console.WriteLine("TCP Server Has Started....");
        while (true)
        {
            Console.WriteLine("                                           ");
            Console.WriteLine("Waiting for incoming client connections....");
            Console.WriteLine("                                           ");
            Console.WriteLine("A message will display below once the client starts and establishes a connection ");
            TcpClient client = listener.AcceptTcpClient();
            Console.WriteLine("                                              ");
            Console.WriteLine("Okay, Accepting Client connection now");
            Console.WriteLine("                                       ");
            Console.WriteLine("Accepted new client connection.....");
            StreamReader reader = new StreamReader(client.GetStream());
            StreamWriter writer = new StreamWriter(client.GetStream());
            string s = string.Empty;
            while (!(s = reader.ReadLine()).Equals("Exit") || (s == null)) {
                Console.WriteLine("From client -> " + s);
                writer.WriteLine("From server -> " + s);
                writer.Flush();
            }
            reader.Close();
            writer.Close();
            client.Close();
        }



    } catch (Exception e)
    {
        Console.WriteLine(e);

    } finally
    {
        if (listener != null)
        {
            listener.Stop();
        }
    }

  }
}

今、私が取得しようとしているデータは心拍数であり、2秒ごとに変化します。ただし、TCPサーバーでは、心拍数の最初に記録された値のみを取得し、新しい値を取得する代わりに繰り返し続けます。

私がここで見た同様の投稿がstackoverflowにあります:UWPTCPはデータを継続的に受信します

そして誰かが、コードでわかるように、私が行ったwhileループの使用を提案しました。私が何をすべきかについて他に何か提案はありますか?

ありがとう

レオD。
while (true)
{
    await streamWriter.WriteLineAsync(data);
    await streamWriter.FlushAsync();
}

while(true)は繰り返し続けます。つまり、常に現在の値で「データ」を送信します。これが問題の原因です。

私の意見では、TCPサーバーへの接続を「TrySend」メソッドの外部で開いたままにし、このメソッドはデータの送信にのみ使用する必要があります。このように、このループを使用する必要はありません。

編集:

これを試して :

private async void CharacteristicReadButton_Click()
    {
    while(true)
    {
            // BT_Code: Read the actual value from the device by using Uncached.
            GattReadResult result = await selectedCharacteristic.ReadValueAsync(BluetoothCacheMode.Uncached);
            if (result.Status == GattCommunicationStatus.Success)
            {


                string formattedResult = FormatValueByPresentation(result.Value, presentationFormat);
                rootPage.NotifyUser($"Read result: {formattedResult}", NotifyType.StatusMessage);

                //string formattedResult = FormatValueByPresentation(result.Value, presentationFormat);
                //rootPage.NotifyUser($"Read result: {formattedResult}", NotifyType.StatusMessage);
            }
            else
            {
                rootPage.NotifyUser($"Read failed: {result.Status}", NotifyType.ErrorMessage);
            }
        }
    }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

meteorアプリのサーバーからクライアント側の最新データを取得します

分類Dev

クライアントはデータをtcpサーバーに送信し、tcpサーバーはデータを別のサーバーに送信します

分類Dev

デコレータから関数のサブ関数をオーバーライドしますか?

分類Dev

ライブデータオブザーバーは一度だけ呼び出しました。UIを更新するためにAPIが再度呼び出されたときにサーバーからのデータを更新していません

分類Dev

JSライブラリまたはNodeJSサーバーを介してFirebaseRDデータを取得しますか?

分類Dev

サーバーからデータを取得しないTCPクライアント

分類Dev

SQLサーバー上のさまざまなデータベースからデータを取得する

分類Dev

角度 - サーバーからデータを取得します

分類Dev

サブクエリからのデータをバインドしますか?

分類Dev

サーバーからライブデータを取得するためのWebソケット

分類Dev

<textarea>データをサーバー上のJSONファイルに取得しますか?

分類Dev

Google Appsのサイドバーからフォームデータを取得しますか?

分類Dev

mongooseからmongoDBドライバーデータベースを取得します

分類Dev

フェッチAPIを介してクライアント上のサーバー(node.js + express)からデータを取得できません

分類Dev

異なるサーバー上のテーブルからデータを更新する

分類Dev

Reactjs-サーバーからデータを取得して更新する

分類Dev

Java(クライアント)からデータを受信するPython(サーバー)を別々の行で..(TCP)

分類Dev

`firebase`はサーバーからデータを取得するときにエラーをスローします

分類Dev

サーバー上の各データベースの1つのテーブルからデータを選択します

分類Dev

NodeJSサーバーのクライアントから受信したデータを印刷します

分類Dev

Angular-サブスクライブしたサービスからデータを数回取得し、以前の結果を上書きしない方法

分類Dev

Pythonのサークルからデータを取得します

分類Dev

Xamarin iOSアプリのSignalRクライアントはサーバーからデータを取得しますが、プロパティがありません

分類Dev

ライブarduinoセンサーデータから画像を描画します

分類Dev

サブクラスのメンバーデータをオーバーライドし、スーパークラスの実装で使用しますか?

分類Dev

JavaScript:サーバーから更新を取得しますか?

分類Dev

WebSocketサーバーからリアルタイムデータを取得することを提案します

分類Dev

同じサーバー上の4つのデータベースから同じテーブルから同じ列を選択します

分類Dev

Androidはどのようにしてウェブサイトからデータを取得しますか?

Related 関連記事

  1. 1

    meteorアプリのサーバーからクライアント側の最新データを取得します

  2. 2

    クライアントはデータをtcpサーバーに送信し、tcpサーバーはデータを別のサーバーに送信します

  3. 3

    デコレータから関数のサブ関数をオーバーライドしますか?

  4. 4

    ライブデータオブザーバーは一度だけ呼び出しました。UIを更新するためにAPIが再度呼び出されたときにサーバーからのデータを更新していません

  5. 5

    JSライブラリまたはNodeJSサーバーを介してFirebaseRDデータを取得しますか?

  6. 6

    サーバーからデータを取得しないTCPクライアント

  7. 7

    SQLサーバー上のさまざまなデータベースからデータを取得する

  8. 8

    角度 - サーバーからデータを取得します

  9. 9

    サブクエリからのデータをバインドしますか?

  10. 10

    サーバーからライブデータを取得するためのWebソケット

  11. 11

    <textarea>データをサーバー上のJSONファイルに取得しますか?

  12. 12

    Google Appsのサイドバーからフォームデータを取得しますか?

  13. 13

    mongooseからmongoDBドライバーデータベースを取得します

  14. 14

    フェッチAPIを介してクライアント上のサーバー(node.js + express)からデータを取得できません

  15. 15

    異なるサーバー上のテーブルからデータを更新する

  16. 16

    Reactjs-サーバーからデータを取得して更新する

  17. 17

    Java(クライアント)からデータを受信するPython(サーバー)を別々の行で..(TCP)

  18. 18

    `firebase`はサーバーからデータを取得するときにエラーをスローします

  19. 19

    サーバー上の各データベースの1つのテーブルからデータを選択します

  20. 20

    NodeJSサーバーのクライアントから受信したデータを印刷します

  21. 21

    Angular-サブスクライブしたサービスからデータを数回取得し、以前の結果を上書きしない方法

  22. 22

    Pythonのサークルからデータを取得します

  23. 23

    Xamarin iOSアプリのSignalRクライアントはサーバーからデータを取得しますが、プロパティがありません

  24. 24

    ライブarduinoセンサーデータから画像を描画します

  25. 25

    サブクラスのメンバーデータをオーバーライドし、スーパークラスの実装で使用しますか?

  26. 26

    JavaScript:サーバーから更新を取得しますか?

  27. 27

    WebSocketサーバーからリアルタイムデータを取得することを提案します

  28. 28

    同じサーバー上の4つのデータベースから同じテーブルから同じ列を選択します

  29. 29

    Androidはどのようにしてウェブサイトからデータを取得しますか?

ホットタグ

アーカイブ