-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathZWavePort.cs
More file actions
117 lines (103 loc) · 3.16 KB
/
ZWavePort.cs
File metadata and controls
117 lines (103 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.Threading;
namespace ZWave_Tester
{
class ZWavePort
{
private SerialPort sp;
private Thread receiverThread;
private Boolean sendACK = true;
private byte[] MSG_ACKNOWLEDGE = new byte[] { 0x06 };
public ZWavePort()
{
sp = new SerialPort();
sp.PortName = "COM4";
sp.BaudRate = 115200;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Handshake = Handshake.None;
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.NewLine = System.Environment.NewLine;
receiverThread = new Thread(
new System.Threading.ThreadStart(ReceiveMessage));
}
public void Open()
{
if (sp.IsOpen == false)
{
sp.Open();
receiverThread.Start();
}
}
public void SendMessage(byte[] message)
{
if (sp.IsOpen == true)
{
if (message != MSG_ACKNOWLEDGE)
{
sendACK = false;
message[message.Length - 1] = GenerateChecksum(message); // Insert checksum
}
System.Console.WriteLine("Message sent: " + ByteArrayToString(message));
sp.Write(message, 0, message.Length);
}
}
private void SendACKMessage()
{
SendMessage(MSG_ACKNOWLEDGE);
}
public void Close()
{
if (sp.IsOpen == true)
{
sp.Close();
}
}
private static byte GenerateChecksum(byte[] data)
{
int offset = 1;
byte ret = data[offset];
for (int i = offset + 1; i < data.Length - 1; i++)
{
// Xor bytes
ret ^= data[i];
}
// Not result
ret = (byte)(~ret);
return ret;
}
private void ReceiveMessage()
{
while (sp.IsOpen == true)
{
int bytesToRead = sp.BytesToRead;
if ((bytesToRead != 0) & (sp.IsOpen == true))
{
byte[] message = new byte[bytesToRead];
sp.Read(message, 0, bytesToRead);
System.Console.WriteLine(" *** [Possible HomeId BruteForced] Message received: " + ByteArrayToString(message) + " . Press any key to continue *****");
System.Console.ReadLine();
if (sendACK) // Does the incoming message require an ACK?
{
SendACKMessage();
}
sendACK = true;
}
}
}
private String ByteArrayToString(byte[] message)
{
String ret = String.Empty;
foreach (byte b in message)
{
ret += b.ToString("X2") + " ";
}
return ret.Trim();
}
}
}