C#로 작성된 ECHONET Lite의 간단한 제어 샘플

C#로 ECHONET Lite 컨트롤러의 컨트롤 관련 프로그램을 쓰고 싶은데 인터넷 검색도 잘 안 팔려서 직접 만든 거예요.
샘플 코드는 Giithubechonetlitecs 창고에 놓여 있습니다.

샘플 설명



"보기"단추를 누르면 LAN 내의 ECHONET Lite 노드 보기를 가져옵니다.노드를 획득하면 다음 노드 표시줄에서 첫 번째로 획득한 노드 코드를 설정합니다.다음 열에서 실례 번호를 설정합니다.
ON OFF 버튼은 스위치를 켜고 끄는 데 사용되는 버튼입니다.그림 일람에 표시된 0290은 일반 조명의 노드 코드이기 때문에 "ON""OFF"버튼을 누르면 조명을 켜거나 끌 수 있습니다.

노드 목록 가져오기


UDP 그룹 방송을 통해 노드로부터 답장을 얻을 수 있습니다.
포트는 3610이고 주소는 224.0.23입니다.어쨌든 Port와 MulticastAddress가 설정되어 있습니다.
ECHONET_Lite.cs
 private static readonly int Port = 3610;
 private static readonly string MulticastAddress = "224.0.23.0";
 private static readonly UInt16 Header = 0x1081;
 private static readonly UInt16 TransactionID = 0x0000;
 private static readonly byte ControllerGrpCd = 0x05;
 private static readonly byte ControllerClsCd = 0xFF;
 private static readonly byte ControllerInsCd = 0x01;
UDP 그룹 방송 후 노드의 회신은 UDP 유니캐스트로 회신됩니다.따라서 UDP 멀티캐스트를 전송한 후 UDP 유니캐스트로 수신합니다.프로그램은 다음과 같습니다. (오류 처리는 생략되었습니다.)
ECHONET_Lite.cs
//ノード一覧を取得するためにマルチキャストします
using (UdpClient udpClient = new UdpClient(AddressFamily.InterNetwork))
{
  IPAddress address = IPAddress.Parse(MulticastAddress);
  IPEndPoint ipEndPoint = new IPEndPoint(address, Port);
  udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, Port));
  udpClient.JoinMulticastGroup(address, IPAddress.Parse(LocalAddress));
  udpClient.MulticastLoopback = true;
  byte[] frame = CreateSearchFrame();
  udpClient.Send(frame, frame.Length, ipEndPoint);
}
//マルチキャストの返信がユニキャストで来るので取得します
byte[] recvBytes = null;
IPEndPoint remoteEP = null;
using (UdpClient udp = new UdpClient(Port))
{
  udp.Client.ReceiveTimeout = 5000;   //5secでタイムアウト
  recvBytes = udp.Receive(ref remoteEP);
}
이렇게 하면 recvByte[]에 노드가 일람하는 프레임 데이터가 포함되어 있습니다.노드의 IP 주소는 remoteEP입니다.주소에 있어요.
목록에 노드 데이터를 추가했습니다.
ECHONET_Lite.cs
List<EObject> list = new List<EObject>();
string ipaddress = remoteEP.Address.ToString();
//取得したノードをlistに入れます
for (int i = 0; i < nodeCnt; i++)
{
  EObject eo = new EObject();
  eo.Number = i + 1;
  eo.IPAddress = ipaddress;
  eo.GroupCd = recvBytes[15 + i * 3];
  eo.ClassCd = recvBytes[15 + i * 3 + 1];
  eo.InstanceCd = recvBytes[15 + i * 3 + 2];
  list.Add(eo);
}
ECHONET Lite와 직접적인 관계는 없지만 그룹 방송 때 자신의 로컬 IP 주소를 추가하지 않으면 UDP 단독 방송자는 돌아오지 않는다.로컬 IP 주소 속성이 추가되었습니다.창의 원본 코드에도 자신의 로컬 IP 주소를 가져오는 방법이 포함되어 있습니다.

스위치의 연결이 끊기다


ECHONET Lite의 제어 샘플로서 스위치의 연결 끊기 샘플 코드가 첨부되어 있습니다.UDP 유니캐스트 송신 스위치의 연결 끊기용 프레임만 사용합니다.
ECHONET_Lite.cs
public byte[] SwitchSet(EObject eo, bool sw)
{
  byte[] sendFrame = CreateSwitchFrame(eo, sw);   //スイッチ用のフレームを取得します
  byte[] recvBytes = null;

  IPEndPoint remoteEP = null;
  using (UdpClient udp = new UdpClient(Port))
  {
    udp.Client.ReceiveTimeout = 5000;   //5secでタイムアウト
    udp.Send(sendFrame, sendFrame.Length, eo.IPAddress, Port);
    recvBytes = udp.Receive(ref remoteEP);
  }
  return recvBytes;
}
SwitchSet()은 스위치에 사용되는 프레임 생성 방법입니다.속성 번호 0x80은 스위치의 연결 끊기 속성입니다.
ECHONET_Lite.cs
private byte[] CreateSwitchFrame(EObject eo, bool sw)
{
  byte[] frame = new byte[15];
  frame[0] = (byte)(Header >> 8);         //EHD1 ECHONETLiteヘッダ  1Byte   0x10固定
  frame[1] = (byte)(Header & 0xFF);       //EHD2 ECHONETLiteヘッダ  1Byte   0x81固定
  frame[2] = (byte)(TransactionID >> 8);  //TID  トランザクションID 2Byte   0~65535
  frame[3] = (byte)(TransactionID & 0xFF);//TID  トランザクションID 2Byte   0~65535
  frame[4] = ControllerGrpCd;             //SEOJ 送信元オブジェクト コントローラークラスグループコード
  frame[5] = ControllerClsCd;             //SEOJ 送信元オブジェクト コントローラークラスコード
  frame[6] = ControllerInsCd;             //SEOJ 送信元オブジェクト インスタンスコード
  frame[7] = eo.GroupCd;                  //DEOJ 送信先オブジェクト グループコード
  frame[8] = eo.ClassCd;                  //DEOJ 送信先オブジェクト クラスコード
  frame[9] = eo.InstanceCd;               //DEOJ 送信先オブジェクト インスタンスコード
  frame[10] = (byte)enmESV.SETC;           //ESV  サービスコード     SETC
  frame[11] = (byte)0x01;                 //OPC  プロパティ数
  frame[12] = (byte)0x80;                 //EPC  プロパティ番号     スイッチのオンオフ
  frame[13] = (byte)0x01;                 //PDC  EDTのバイト数
  frame[14] = sw ? (byte)0x30 : (byte)0x31;   //0x30がスイッチオン 0x31がスイッチオフ
  return frame;
}
간단하지만 이런 느낌은 이미 C#부터 제어할 수 있다.

좋은 웹페이지 즐겨찾기