‪Black Box
Public Member Functions | Static Public Attributes | Properties | Events | Private Member Functions | Private Attributes
MiBand_Heartrate.MiBand Class Reference

Public Member Functions

delegate void OnHeartrateChangedHandler (MiBand device, ushort value)
 
delegate void OnAuthHandler (MiBand device, bool status)
 
 MiBand (BLEManager bluetoothLEManager)
 
async void Authenticate (OnAuthHandler callback=null)
 
async void StartMonitorHeartrate ()
 
void StopMonitorHeartrate ()
 ‪Stop heart rate reading More...
 

Static Public Attributes

static string ATS_UUID = "0000fee1-0000-1000-8000-00805f9b34fb"
 
static string HMS_UUID = "0000180d-0000-1000-8000-00805f9b34fb"
 
static string SNS_UUID = "0000fee0-0000-1000-8000-00805f9b34fb"
 
static string ATC_UUID = "00000009-0000-3512-2118-0009af100700"
 
static string HRM_UUID = "00002a37-0000-1000-8000-00805f9b34fb"
 
static string HMC_UUID = "00002a39-0000-1000-8000-00805f9b34fb"
 
static string SNC_UUID = "00000001-0000-3512-2118-0009af100700"
 

Properties

bool ContinuousMode [get, set]
 

Events

OnHeartrateChangedHandler HeartrateChanged
 

Private Member Functions

void RunPingSensor ()
 

Private Attributes

BLEManager manager
 
byte [] _authKey
 
GattDeviceService HMSService = null
 
GattCharacteristic HMRcharacteristic = null
 
GattCharacteristic HMCCharacteristic = null
 
GattCharacteristic SNSCharacteristic = null
 
Thread pingThread = null
 
bool continuousMode = false
 

Detailed Description

Definition at line 20 of file MiBand.cs.

Constructor & Destructor Documentation

◆ MiBand()

MiBand_Heartrate.MiBand.MiBand ( BLEManager  bluetoothLEManager)

Definition at line 67 of file MiBand.cs.

68  {
69  ‪manager = bluetoothLEManager;
70  }
‪BLEManager manager
Definition: MiBand.cs:41

Member Function Documentation

◆ Authenticate()

async void MiBand_Heartrate.MiBand.Authenticate ( OnAuthHandler  callback = null)

Definition at line 83 of file MiBand.cs.

84  {
85  GattDeviceServicesResult servicesResult = await ‪manager.‪Device.GetGattServicesForUuidAsync(new Guid(‪ATS_UUID));
86  if (servicesResult.Status == GattCommunicationStatus.Success && servicesResult.Services.Count > 0)
87  {
88  GattDeviceService service = servicesResult.Services[0];
89 
90  GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsForUuidAsync(new Guid(‪ATC_UUID));
91  if (characteristicsResult.Status == GattCommunicationStatus.Success && characteristicsResult.Characteristics.Count > 0)
92  {
93  GattCharacteristic characteristic = characteristicsResult.Characteristics[0];
94 
95  // Enable notification
96  GattCommunicationStatus status = await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
97  if (status == GattCommunicationStatus.Success)
98  {
99  characteristic.ValueChanged += (GattCharacteristic sender, GattValueChangedEventArgs args) =>
100  {
101  DataReader reader = DataReader.FromBuffer(args.CharacteristicValue);
102  byte[] messageType = new byte[3]; reader.ReadBytes(messageType);
103 
104  if (messageType[1] == 0x01) // Request random number
105  {
106  if (messageType[2] == 0x01)
107  {
108  ‪manager.‪Write(sender, new byte[] { 0x02, 0x08 });
109  }
110  else
111  {
112  callback.Invoke(this, false);
113  service.Dispose();
114  }
115  }
116  else if (messageType[1] == 0x02) // Get random number
117  {
118  byte[] number = new byte[reader.UnconsumedBufferLength];
119  reader.ReadBytes(number);
120 
121  // Encrypt number
122  byte[] encNumber;
123  using (Aes aes = Aes.Create())
124  {
125  aes.Key = ‪_authKey;
126  aes.Mode = CipherMode.ECB;
127  aes.Padding = PaddingMode.None;
128 
129  ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); // Constant iv, bad :(
130  using (MemoryStream stream = new MemoryStream())
131  {
132  using (CryptoStream cryptoStream = new CryptoStream(stream, encryptor, CryptoStreamMode.Write))
133  {
134  cryptoStream.Write(number, 0, number.Length);
135  cryptoStream.FlushFinalBlock();
136  encNumber = stream.ToArray();
137  }
138  }
139  }
140 
141  // Send encrypted number
142  using (MemoryStream stream = new MemoryStream())
143  {
144  stream.Write(new byte[] { 0x03, 0x08 }, 0, 2);
145  stream.Write(encNumber, 0, encNumber.Length);
146  ‪manager.‪Write(characteristic, stream.ToArray());
147  }
148  }
149  else if (messageType[1] == 0x03)
150  {
151  if (messageType[2] == 0x01)
152  {
153  callback.Invoke(this, true);
154  }
155  else
156  {
157  callback.Invoke(this, false);
158  service.Dispose();
159  }
160  }
161  };
162  }
163 
164  // Define authentication secret key
165  byte[] hash = new SHA256Managed().ComputeHash(Guid.NewGuid().ToByteArray());
166  ‪_authKey = hash.Take(16).ToArray();
167 
168  // Send key it to device
169  using (MemoryStream stream = new MemoryStream())
170  {
171  stream.Write(new byte[] { 0x01, 0x08 }, 0, 2);
172  stream.Write(‪_authKey, 0, ‪_authKey.Length);
173  ‪manager.‪Write(characteristic, stream.ToArray());
174  }
175  }
176  }
177  }
‪static string ATC_UUID
Definition: MiBand.cs:29
‪BLEManager manager
Definition: MiBand.cs:41
‪BluetoothLEDevice Device
Definition: BLEManager.cs:32
‪static string ATS_UUID
Definition: MiBand.cs:23
‪async void Write(GattCharacteristic c, byte[] data)
Definition: BLEManager.cs:122

Referenced by MiBand_Heartrate.ControlFrame.authButton_Click().

◆ OnAuthHandler()

delegate void MiBand_Heartrate.MiBand.OnAuthHandler ( MiBand  device,
bool  status 
)

◆ OnHeartrateChangedHandler()

delegate void MiBand_Heartrate.MiBand.OnHeartrateChangedHandler ( MiBand  device,
ushort  value 
)

◆ RunPingSensor()

void MiBand_Heartrate.MiBand.RunPingSensor ( )
private

Definition at line 306 of file MiBand.cs.

307  {
308  while (‪HMCCharacteristic != null)
309  {
310  ‪manager.‪Write(‪HMCCharacteristic, new byte[] { 0x16 });
311  Thread.Sleep(5000);
312  }
313  }
‪BLEManager manager
Definition: MiBand.cs:41
‪async void Write(GattCharacteristic c, byte[] data)
Definition: BLEManager.cs:122
‪GattCharacteristic HMCCharacteristic
Definition: MiBand.cs:45

Referenced by MiBand_Heartrate.MiBand.StartMonitorHeartrate().

◆ StartMonitorHeartrate()

async void MiBand_Heartrate.MiBand.StartMonitorHeartrate ( )

Definition at line 188 of file MiBand.cs.

189  {
190  // Enabling sensor
191  GattDeviceServicesResult servicesResult = await ‪manager.‪Device.GetGattServicesForUuidAsync(new Guid(‪SNS_UUID));
192  if (servicesResult.Status == GattCommunicationStatus.Success && servicesResult.Services.Count > 0)
193  {
194  GattDeviceService service = servicesResult.Services[0];
195  GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsForUuidAsync(new Guid(‪SNC_UUID));
196  if (characteristicsResult.Status == GattCommunicationStatus.Success && characteristicsResult.Characteristics.Count > 0)
197  {
198  GattCharacteristic characteristic = characteristicsResult.Characteristics[0];
199  ‪SNSCharacteristic = characteristic;
200  ‪manager.‪Write(characteristic, new byte[] { 0x01, 0x03, 0x19 });
201  }
202  }
203 
204  // Enabling Heart rate measurements
205  servicesResult = await ‪manager.‪Device.GetGattServicesForUuidAsync(new Guid(‪HMS_UUID));
206  if (servicesResult.Status == GattCommunicationStatus.Success && servicesResult.Services.Count > 0)
207  {
208  GattDeviceService service = servicesResult.Services[0];
209 
210  // Enabling notification
211  GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsForUuidAsync(new Guid(‪HRM_UUID));
212  if (characteristicsResult.Status == GattCommunicationStatus.Success && characteristicsResult.Characteristics.Count > 0)
213  {
214  ‪HMRcharacteristic = characteristicsResult.Characteristics[0];
215 
216  GattCommunicationStatus status = await ‪HMRcharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
217  if (status == GattCommunicationStatus.Success)
218  {
219  ‪HMRcharacteristic.ValueChanged += (GattCharacteristic sender, GattValueChangedEventArgs args) =>
220  {
221  DataReader reader = DataReader.FromBuffer(args.CharacteristicValue);
222  ushort heartrate = reader.ReadUInt16();
223 
224  if (heartrate > 0)
225  { // Other wise there is a high probability that sensor failed to retrieve heart rate or that you're dead ;)
226  ‪HeartrateChanged?.Invoke(this, heartrate);
227  }
228 
229  if (!‪continuousMode)
230  {
231  ‪manager.‪Write(‪HMCCharacteristic, new byte[] { 0x15, 0x02, 0x01 });
232  }
233  };
234  }
235  }
236 
237  // Enable measurements
238  characteristicsResult = await service.GetCharacteristicsForUuidAsync(new Guid(‪HMC_UUID));
239  if (characteristicsResult.Status == GattCommunicationStatus.Success && characteristicsResult.Characteristics.Count > 0)
240  {
241  ‪HMCCharacteristic = characteristicsResult.Characteristics[0];
242 
243  if (‪continuousMode)
244  {
245  ‪manager.‪Write(‪HMCCharacteristic, new byte[] { 0x15, 0x01, 0x01 });
246  }
247  else
248  {
249  ‪manager.‪Write(‪HMCCharacteristic, new byte[] { 0x15, 0x02, 0x00 });
250  }
251 
252  if (‪SNSCharacteristic != null)
253  {
254  ‪manager.‪Write(‪SNSCharacteristic, new byte[] { 0x02 });
255  }
256  }
257 
258  // Enable ping HMC every 5 sec.
259  ‪pingThread = new Thread(new ThreadStart(‪RunPingSensor));
260  ‪pingThread.Start();
261 
262  ‪HMSService = service;
263  }
264  }
‪static string SNS_UUID
Definition: MiBand.cs:26
‪BLEManager manager
Definition: MiBand.cs:41
‪static string SNC_UUID
Definition: MiBand.cs:33
‪OnHeartrateChangedHandler HeartrateChanged
Definition: MiBand.cs:49
‪GattCharacteristic HMRcharacteristic
Definition: MiBand.cs:44
‪static string HRM_UUID
Definition: MiBand.cs:31
‪BluetoothLEDevice Device
Definition: BLEManager.cs:32
‪GattDeviceService HMSService
Definition: MiBand.cs:43
‪static string HMC_UUID
Definition: MiBand.cs:32
‪async void Write(GattCharacteristic c, byte[] data)
Definition: BLEManager.cs:122
‪static string HMS_UUID
Definition: MiBand.cs:25
‪GattCharacteristic SNSCharacteristic
Definition: MiBand.cs:46
‪GattCharacteristic HMCCharacteristic
Definition: MiBand.cs:45

Referenced by MiBand_Heartrate.ControlFrame.startButton_Click().

◆ StopMonitorHeartrate()

void MiBand_Heartrate.MiBand.StopMonitorHeartrate ( )

‪Stop heart rate reading

Definition at line 269 of file MiBand.cs.

270  {
271  if (‪HMCCharacteristic != null)
272  {
273  if (‪continuousMode)
274  {
275  ‪manager.‪Write(‪HMCCharacteristic, new byte[] { 0x15, 0x01, 0x00 });
276  }
277  else
278  {
279  ‪manager.‪Write(‪HMCCharacteristic, new byte[] { 0x15, 0x02, 0x00 });
280  }
281  }
282 
283  ‪HMCCharacteristic = null;
284 
285  if (‪pingThread != null)
286  {
287  ‪pingThread.Join();
288  ‪pingThread = null;
289  }
290 
291  if (‪SNSCharacteristic != null)
292  {
293  ‪SNSCharacteristic.Service.Dispose();
294  ‪SNSCharacteristic = null;
295  }
296 
297  if (‪HMSService != null)
298  {
299  ‪HMSService.Dispose();
300  ‪HMSService = null;
301  }
302  }
‪BLEManager manager
Definition: MiBand.cs:41
‪GattDeviceService HMSService
Definition: MiBand.cs:43
‪async void Write(GattCharacteristic c, byte[] data)
Definition: BLEManager.cs:122
‪GattCharacteristic SNSCharacteristic
Definition: MiBand.cs:46
‪GattCharacteristic HMCCharacteristic
Definition: MiBand.cs:45

Referenced by MiBand_Heartrate.ControlFrame.ControlFrame_FormClosing(), and MiBand_Heartrate.ControlFrame.stopButton_Click().

Field Documentation

◆ _authKey

byte [] MiBand_Heartrate.MiBand._authKey
private

Definition at line 42 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.Authenticate().

◆ ATC_UUID

string MiBand_Heartrate.MiBand.ATC_UUID = "00000009-0000-3512-2118-0009af100700"
static

Definition at line 29 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.Authenticate().

◆ ATS_UUID

string MiBand_Heartrate.MiBand.ATS_UUID = "0000fee1-0000-1000-8000-00805f9b34fb"
static

Definition at line 23 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.Authenticate().

◆ continuousMode

bool MiBand_Heartrate.MiBand.continuousMode = false
private

◆ HMC_UUID

string MiBand_Heartrate.MiBand.HMC_UUID = "00002a39-0000-1000-8000-00805f9b34fb"
static

Definition at line 32 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.StartMonitorHeartrate().

◆ HMCCharacteristic

GattCharacteristic MiBand_Heartrate.MiBand.HMCCharacteristic = null
private

◆ HMRcharacteristic

GattCharacteristic MiBand_Heartrate.MiBand.HMRcharacteristic = null
private

Definition at line 44 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.StartMonitorHeartrate().

◆ HMS_UUID

string MiBand_Heartrate.MiBand.HMS_UUID = "0000180d-0000-1000-8000-00805f9b34fb"
static

Definition at line 25 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.StartMonitorHeartrate().

◆ HMSService

GattDeviceService MiBand_Heartrate.MiBand.HMSService = null
private

◆ HRM_UUID

string MiBand_Heartrate.MiBand.HRM_UUID = "00002a37-0000-1000-8000-00805f9b34fb"
static

Definition at line 31 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.StartMonitorHeartrate().

◆ manager

BLEManager MiBand_Heartrate.MiBand.manager
private

◆ pingThread

Thread MiBand_Heartrate.MiBand.pingThread = null
private

◆ SNC_UUID

string MiBand_Heartrate.MiBand.SNC_UUID = "00000001-0000-3512-2118-0009af100700"
static

Definition at line 33 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.StartMonitorHeartrate().

◆ SNS_UUID

string MiBand_Heartrate.MiBand.SNS_UUID = "0000fee0-0000-1000-8000-00805f9b34fb"
static

Definition at line 26 of file MiBand.cs.

Referenced by MiBand_Heartrate.MiBand.StartMonitorHeartrate().

◆ SNSCharacteristic

GattCharacteristic MiBand_Heartrate.MiBand.SNSCharacteristic = null
private

Property Documentation

◆ ContinuousMode

bool MiBand_Heartrate.MiBand.ContinuousMode
getset

Definition at line 54 of file MiBand.cs.

54  {
55  get => ‪continuousMode;
56  set
57  {
58  if (‪HMCCharacteristic == null)
59  {
60  ‪continuousMode = value;
61  }
62  }
63  }
‪GattCharacteristic HMCCharacteristic
Definition: MiBand.cs:45

Referenced by MiBand_Heartrate.ControlFrame.startButton_Click().

Event Documentation

◆ HeartrateChanged

OnHeartrateChangedHandler MiBand_Heartrate.MiBand.HeartrateChanged

The documentation for this class was generated from the following file: