質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

if文の条件の仕方が分からない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 510

UKAWATAKATO

score 12

大変未熟でifの条件ができなくて質問させていただきました
//Echonetデータであるか
if ( )
この上記の文を条件にしたいのですが
エコネットデータであるかを条件することが分からないです
エコネットデータとは pack[0] = 0x10; // EHD1
pack[1] = 0x81; // EHD2
pack[2] = 0x00; // 
pack[3] = 0x01; // ID
この十六進数のことみたいです汗
よく分かっていませんが
どうかアドバイスをもらえませんか。
このソースはスマートハウス用通信プロトコル「ECHONET Lite」の通信処理に関するもの

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine.UI; // <---- 追加1

public class UdpSocket : MonoBehaviour
{
    private string _MulticastAddr = "224.0.23.0";   // マルチキャストアドレス
    private string _RemoteHost = "";                // 送信相手アドレス
    private int _SendPort = 3610;                   // 送信ポート
    private int _RecvPort = 3610;                   // 受信ポート

    private UdpClient _UdpClient;                   // UDP
    private IPEndPoint _IpEndPoint;                 // IPEndPoint
    private Thread _RecvThread;                     // 受信スレッド

    // 接続
    public void Connect()
    {
        IPAddress grpAddr = IPAddress.Parse(_MulticastAddr);

        if (_IpEndPoint != null) _IpEndPoint = null;
        _IpEndPoint = new IPEndPoint(grpAddr, _RecvPort);

        // マルチキャストグループに参加
        Disconnect();
        _UdpClient = new UdpClient(_RecvPort);
        _UdpClient.JoinMulticastGroup(grpAddr);

        // 受信スレッド生成
        _RecvThread = new Thread(ReceiveMulticastThread);
        _RecvThread.Start();

        // ノードプロファイル通知送信
        SendNodeProfile();
    }

    // 切断
    public void Disconnect()
    {
        if (_RecvThread != null)
        {
            _RecvThread.Abort();
            _RecvThread = null;
        }

        if (_UdpClient != null)
        {
            IPAddress grpAddr = IPAddress.Parse(_MulticastAddr);
            _UdpClient.DropMulticastGroup(grpAddr);
            _UdpClient.Close();
            _UdpClient = null;
        }
    }

    // ノードプロファイル通知送信
    public void SendNodeProfile()
    {
        byte[] pack = BuildNodeProfileInfo();
        SendPacket(pack, _MulticastAddr);
    }

    // 送信
    public void SendPacket(byte[] packet, string host)
    {
        _UdpClient.Send(packet, packet.Length, host, _SendPort);
    }

    // 受信スレッド
    public void ReceiveMulticastThread()
    {
        byte[] packet;

        int i = 0;

        System.Text.StringBuilder s = new System.Text.StringBuilder();

        while (true)
        {
            packet = _UdpClient.Receive(ref _IpEndPoint);
            if (packet != null)
            {
                // 受信できた!
                s.Remove(0, s.Length);
                for (i = 0; i < packet.Length; i++)
                {
                    s.Append(System.Convert.ToString(packet[i], 16).PadLeft(2, '0'));
                }

                Debug.Log(s.ToString());

                //Echonetデータであるか
                if ( )
                {
                    flg = false;
                    RecvData = s.ToString();




                }
            }


        }
    }







    private string RecvData = "";
    private bool flg = true;
    private readonly Text Variable;

    void Start()
    {
        targetText = GameObject.Find("TextLog").GetComponent<Text>().GetComponent<Text>();

    }

    void Update()
    {


        if (flg == false)//ここしか動作しない
        {

            targetText.text = RecvData;
            flg = true;
        }
    }



    Text targetText; // <---- 追加2


    // ノードプロファイル通知パケット作成
    private byte[] BuildNodeProfileInfo()
    {
        byte[] pack;
        pack = new byte[17];

        pack[0] = 0x10; // EHD1
        pack[1] = 0x81; // EHD2
        pack[2] = 0x00; // 
        pack[3] = 0x01; // ID

        pack[4] = 0x0E; // 送信元「ノードプロファイルクラス」
        pack[5] = 0xF0; // EOJ = 0x0E F0 01
        pack[6] = 0x01; //

        pack[7] = 0x0E; // 送信先「ノードプロファイルクラス」
        pack[8] = 0xF0; // EOJ = 0x0E F0 01
        pack[9] = 0x01; //

        pack[10] = 0x73;    // ESV

        pack[11] = 0x01;    // OPC

        pack[12] = 0xD5;    // EPC
        pack[13] = 0x04;    // PDC
        pack[14] = 0x01;    // EDT
        pack[15] = 0x05;    // 
        pack[16] = 0xFF;    // 
        pack[16] = 0x01;    // 

        return pack;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takito

    2018/09/06 11:04

    この質問は、スマートハウス用通信プロトコル「ECHONET Lite」の通信処理に関するものと理解してよいでしょうか?

    キャンセル

  • UKAWATAKATO

    2018/09/06 11:08

    返信ありがとうございます はい!「ECHONET Lite」の通信処理に関するものです!

    キャンセル

回答 2

checkベストアンサー

0

ECHONET Lite 通信というのを初めて知りました
的はずれな回答だったらご容赦ください

通信仕様書を見つけました

ECHONET Lite 通信ミドルウェア仕様

これの第3章にフレームフォーマットが解説されてました

受信したフレームデータが「Echonetデータである」かどうかは、先ずはヘッダ部情報で判断できそうです

1バイト目が EHD1
2バイト目が EHD2

とあります

EHD1 は、b4=1 以外は 0(将来用)と規定されているので、0x10 だけが「Echonetデータである」ということになりそうです

//Echonetデータであるか
if( s の1バイト目は 0x10 ? ){

}

EHD2 は、0x81 と 0x82 の2種類あることが書かれているので、これを条件に加えればよいと思います

//Echonetデータであるか
if( s の1バイト目は 0x10 か? 且つ s の2バイト目が 0x81 または 0x82 ?){
}

条件が組み合わさっていくと解りにくくなるので、次のような書き方の方がよいかも

//Echonetデータであるか
if ( s の1バイト目は 0x10 ではない? ) {
  // 違うので捨てる
  continue;
}
if ( s の2バイト目は 0x81 でも 0x82 でもない? ) {
  // 違うので捨てる
  continue;
}

以上で、ヘッダ情報から最低限の「Echinetデータである」という判断ができそうです

3バイト目以降の詳細も仕様書に書かれていますので、書かれている通りの判定処理を実装してあげればよろしいかと

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/06 13:49

    丁寧なアドバイスありがとうございました。
    if (packet[0] == 0x10 && packet[1] == 0x81)
    {
    としてやると無事動きました!!!

    キャンセル

0

ソース読んでないんですが、byte[] someにチェックしたいデータが入っているとして、

if(some.length == 4 && some[0] == 0x10 && some[1] == 0x81 && some[2] == 0x00 && some[3] == 0x01)


でよろしいのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/06 11:09

    どうしてもできないんです汗
    未熟で条件分岐もあやふやなのでどうしてできないとかもわかってないです。

    キャンセル

  • 2018/09/06 12:16

    いや、だから↑ではだめなのですか?受信したデータは何という変数に入るのですか?受信はできてますよね?

    キャンセル

  • 2018/09/06 13:37

    変数はpacktですね。
    はい!受信はできています!

    キャンセル

  • 2018/09/06 14:03

    すいません。その通りソースを入力したらいけました!!
    変数をpacktにさせたら無事に動きました。
    ありがとうございました。
    未熟なせいで変数をifに書くのを忘れてしまっていました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る