public void GAPScanResponseEvent(object sender, BlueGecko.BLE.Events.LEGAP.ScanResponseEventArgs e) { String log = String.Format("ble_evt_gap_scan_response:" + Environment.NewLine + "\trssi={0}, packet_type={1}, bd_addr=[ {2}], address_type={3}, bonding={4}, data=[ {5}]" + Environment.NewLine, (SByte)e.rssi, (SByte)e.packet_type, ByteArrayToHexString(e.address), (SByte)e.address_type, (SByte)e.bonding, ByteArrayToHexString(e.data) ); Console.Write(log); ThreadSafeDelegate(delegate { txtLog.AppendText(log); }); }
// for master/scanner devices, the "gap_scan_response" event is a common entry-like point // this filters adv packets to find devices which advertise the Health Thermometer service public void GAPScanResponseEvent(object sender, BlueGecko.BLE.Events.LEGAP.ScanResponseEventArgs e) { Byte[] cmd; String log = String.Format("ble_evt_gap_scan_response: rssi={0}, packet_type={1}, address=[ {2}], address_type={3}, bonding={4}, data=[ {5}]" + Environment.NewLine, (SByte)e.rssi, e.packet_type, ByteArrayToHexString(e.address), e.address_type, e.bonding, ByteArrayToHexString(e.data) ); Console.Write(log); ThreadSafeDelegate(delegate { txtLog.AppendText(log); }); // pull all advertised service info from adv packet List <Byte[]> ad_services = new List <Byte[]>(); Byte[] this_field = {}; int bytes_left = 0; int field_offset = 0; for (int i = 0; i < e.data.Length; i++) { if (bytes_left == 0) { bytes_left = e.data[i]; this_field = new Byte[e.data[i]]; field_offset = i + 1; } else { this_field[i - field_offset] = e.data[i]; bytes_left--; if (bytes_left == 0) { if (this_field[0] == 0x02 || this_field[0] == 0x03) { // partial or complete list of 16-bit UUIDs ad_services.Add(this_field.Skip(1).Take(2).Reverse().ToArray()); } else if (this_field[0] == 0x04 || this_field[0] == 0x05) { // partial or complete list of 32-bit UUIDs ad_services.Add(this_field.Skip(1).Take(4).Reverse().ToArray()); } else if (this_field[0] == 0x06 || this_field[0] == 0x07) { // partial or complete list of 128-bit UUIDs ad_services.Add(this_field.Skip(1).Take(16).Reverse().ToArray()); } } } } // check for 0x1809 (official health thermometer service UUID) if (ad_services.Any(a => a.SequenceEqual(new Byte[] { 0x18, 0x09 }))) { Console.Write("Found service! Attempting to connect." + Environment.NewLine); // Stop scanning cmd = bglib.BLECommandLEGAPEndProcedure(); bglib.SendCommand(serialAPI, cmd); #if SERIAL_DEBUG // DEBUG: display bytes written log = String.Format("=> TX ({0}) [ {1}]", cmd.Length, ByteArrayToHexString(cmd)) + Environment.NewLine; Console.Write(log); ThreadSafeDelegate(delegate { txtLog.AppendText(log); }); #endif /* We are going to connect in the response handler for le_gap_end_procedure because * le_gap_procedure will also cancel the connect request if called too early! */ target_device_address = e.address; target_device_address_type = e.address_type; app_state = STATE_SCAN_END_REQUEST; } }