Ejemplo n.º 1
0
        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); });
        }
Ejemplo n.º 2
0
        // 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;
            }
        }