diff --git a/CocoaTouch/src/BTInquiryViewController.m b/CocoaTouch/src/BTInquiryViewController.m index 0d0741f38..eae0f432d 100644 --- a/CocoaTouch/src/BTInquiryViewController.m +++ b/CocoaTouch/src/BTInquiryViewController.m @@ -158,24 +158,34 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe { int numResponses = packet[2]; int i; + int offset = 3; for (i=0; i= 0) continue; // already in our list - memcpy(devices[deviceCount].address, addr, 6); - devices[deviceCount].pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1]; + + devices[deviceCount].pageScanRepetitionMode = packet[offset]; + offset += 1; + if (event == HCI_EVENT_INQUIRY_RESULT){ - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff; + offset += 2; // Reserved + Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2; devices[deviceCount].rssi = 0; } else { - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1]; + offset += 1; // Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2 + devices[deviceCount].rssi = packet[offset]; + offset += 1; } devices[deviceCount].state = REMOTE_NAME_REQUEST; printf("Device found: %s with COD: 0x%06x, pageScan %d, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), @@ -142,8 +153,9 @@ static void packet_handler (uint8_t packet_type, uint8_t *packet, uint16_t size) devices[deviceCount].clockOffset, devices[deviceCount].rssi); deviceCount++; } + break; - + } case HCI_EVENT_INQUIRY_COMPLETE: for (i=0;i= 0) continue; - memcpy(devices[deviceCount].address, addr, 6); - devices[deviceCount].pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1]; - if (event == HCI_EVENT_INQUIRY_RESULT){ - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = 0; - } else { - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1]; - } - devices[deviceCount].state = REMOTE_NAME_REQUEST; - printf("Device found: %s with COD: 0x%06x, pageScan %u, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), - devices[deviceCount].classOfDevice, devices[deviceCount].pageScanRepetitionMode, - devices[deviceCount].clockOffset, devices[deviceCount].rssi); - deviceCount++; - } - break; + case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:{ + numResponses = packet[2]; + int offset = 3; + for (i=0; i= 0) continue; // already in our list + memcpy(devices[deviceCount].address, addr, 6); + + devices[deviceCount].pageScanRepetitionMode = packet[offset]; + offset += 1; + + if (event == HCI_EVENT_INQUIRY_RESULT){ + offset += 2; // Reserved + Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2; + devices[deviceCount].rssi = 0; + } else { + offset += 1; // Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2 + devices[deviceCount].rssi = packet[offset]; + offset += 1; + } + devices[deviceCount].state = REMOTE_NAME_REQUEST; + printf("Device found: %s with COD: 0x%06x, pageScan %d, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), + devices[deviceCount].classOfDevice, devices[deviceCount].pageScanRepetitionMode, + devices[deviceCount].clockOffset, devices[deviceCount].rssi); + deviceCount++; + } + + break; + } case HCI_EVENT_INQUIRY_COMPLETE: for (i=0;i= 0) continue; // already in our list - memcpy(devices[deviceCount].address, addr, 6); - devices[deviceCount].pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1]; + + devices[deviceCount].pageScanRepetitionMode = packet[offset]; + offset += 1; + if (event == HCI_EVENT_INQUIRY_RESULT){ - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff; + offset += 2; // Reserved + Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2; devices[deviceCount].rssi = 0; } else { - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1]; + offset += 1; // Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2 + devices[deviceCount].rssi = packet[offset]; + offset += 1; } devices[deviceCount].state = REMOTE_NAME_REQUEST; printf("Device found: %s with COD: 0x%06x, pageScan %d, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), @@ -174,8 +185,9 @@ static void inquiry_packet_handler (uint8_t packet_type, uint8_t *packet, uint16 devices[deviceCount].clockOffset, devices[deviceCount].rssi); deviceCount++; } + break; - + } case HCI_EVENT_INQUIRY_COMPLETE: for (i=0;i #include "btstack-config.h" - #include #include +#include +#include #include "debug.h" #include "btstack_memory.h" #include "hci.h" #include "hci_dump.h" -#define MAX_DEVICES 10 -enum DEVICE_STATE { REMOTE_NAME_REQUEST, REMOTE_NAME_INQUIRED, REMOTE_NAME_FETCHED }; -struct device { - bd_addr_t address; - uint16_t clockOffset; - uint32_t classOfDevice; - uint8_t pageScanRepetitionMode; - uint8_t rssi; - enum DEVICE_STATE state; -}; +#define OPCODE(ogf, ocf) (ocf | ogf << 10) -#define INQUIRY_INTERVAL 5 -struct device devices[MAX_DEVICES]; -int deviceCount = 0; - - -enum STATE {INIT, W4_INQUIRY_MODE_COMPLETE, ACTIVE} ; +enum STATE {INIT, W4_1, W4_2, W4_3, DONE} ; enum STATE state = INIT; +static const hci_cmd_t hci_write_linkkey = { + OPCODE(OGF_CONTROLLER_BASEBAND, 0x11), "1BP" +}; -int getDeviceIndexForAddress( bd_addr_t addr){ - int j; - for (j=0; j< deviceCount; j++){ - if (BD_ADDR_CMP(addr, devices[j].address) == 0){ - return j; - } - } - return -1; -} - -void start_scan(void){ - printf("Starting inquiry scan..\n"); - hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); -} - -int has_more_remote_name_requests(void){ - int i; - for (i=0;i= 0) continue; // already in our list - - memcpy(devices[deviceCount].address, addr, 6); - devices[deviceCount].pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1]; - if (event == HCI_EVENT_INQUIRY_RESULT){ - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = 0; - } else { - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1]; - } - devices[deviceCount].state = REMOTE_NAME_REQUEST; - printf("Device found: %s with COD: 0x%06x, pageScan %d, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), - devices[deviceCount].classOfDevice, devices[deviceCount].pageScanRepetitionMode, - devices[deviceCount].clockOffset, devices[deviceCount].rssi); - deviceCount++; - } - break; - - case HCI_EVENT_INQUIRY_COMPLETE: - for (i=0;i= 0) { - if (packet[2] == 0) { - printf("Name: '%s'\n", &packet[9]); - devices[index].state = REMOTE_NAME_FETCHED; - } else { - printf("Failed to get name: page timeout\n"); - } - } - continue_remote_names(); - break; - - default: - break; + case W4_2: + if ( COMMAND_COMPLETE_EVENT(packet, hci_write_linkkey) ) { + a[0] = 4; + hci_send_cmd(&hci_write_linkkey, 1, a, linkkey); + state = W4_3; } break; - + case W4_3: + if ( COMMAND_COMPLETE_EVENT(packet, hci_write_linkkey) ) { + hci_send_cmd(&hci_read_linkkeys, a, 1); + state = DONE; + } + break; + case DONE: + break; default: break; } diff --git a/example/libusb/gap_inquiry_and_bond.c b/example/libusb/gap_inquiry_and_bond.c index 8edf4673c..95de63d5e 100644 --- a/example/libusb/gap_inquiry_and_bond.c +++ b/example/libusb/gap_inquiry_and_bond.c @@ -116,32 +116,44 @@ static void packet_handler (uint8_t packet_type, uint8_t *packet, uint16_t size) case ACTIVE: switch(event){ case HCI_EVENT_INQUIRY_RESULT: - case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI: + case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:{ numResponses = packet[2]; + int offset = 3; for (i=0; i= 0) continue; // already in our list - memcpy(devices[deviceCount].address, addr, 6); - devices[deviceCount].pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1]; + + devices[deviceCount].pageScanRepetitionMode = packet[offset]; + offset += 1; + if (event == HCI_EVENT_INQUIRY_RESULT){ - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff; + offset += 2; // Reserved + Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2; devices[deviceCount].rssi = 0; } else { - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1]; + offset += 1; // Reserved + devices[deviceCount].classOfDevice = READ_BT_24(packet, offset); + offset += 3; + devices[deviceCount].clockOffset = READ_BT_16(packet, offset) & 0x7fff; + offset += 2 + devices[deviceCount].rssi = packet[offset]; + offset += 1; } - devices[deviceCount].state = BONDING_REQUEST; + devices[deviceCount].state = REMOTE_NAME_REQUEST; printf("Device found: %s with COD: 0x%06x, pageScan %d, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), devices[deviceCount].classOfDevice, devices[deviceCount].pageScanRepetitionMode, devices[deviceCount].clockOffset, devices[deviceCount].rssi); deviceCount++; } + break; - + } case HCI_EVENT_INQUIRY_COMPLETE: continue_bonding(); break; diff --git a/example/libusb/gatt_browser.c b/example/libusb/gatt_browser.c index 4b363a203..37b52b492 100644 --- a/example/libusb/gatt_browser.c +++ b/example/libusb/gatt_browser.c @@ -211,15 +211,16 @@ static void handle_hci_event(void * connection, uint8_t packet_type, uint16_t ch } printf("BTstack activated, start scanning!\n"); state = TC_W4_SCAN_RESULT; + le_central_set_scan_parameters(0,0x0030, 0x0030); le_central_start_scan(); break; case GAP_LE_ADVERTISING_REPORT: if (state != TC_W4_SCAN_RESULT) return; - state = TC_W4_CONNECT; fill_advertising_report_from_packet(&report, packet); // stop scanning, and connect to the device - le_central_stop_scan(); - le_central_connect(&report.address,report.address_type); + // state = TC_W4_CONNECT; + //le_central_stop_scan(); + //le_central_connect(&report.address,report.address_type); break; case HCI_EVENT_LE_META: // wait for connection complete @@ -249,7 +250,7 @@ void setup(void){ run_loop_init(RUN_LOOP_POSIX); // use logger: format HCI_DUMP_PACKETLOGGER, HCI_DUMP_BLUEZ or HCI_DUMP_STDOUT - hci_dump_open("/tmp/ble_client.pklg", HCI_DUMP_PACKETLOGGER); + hci_dump_open("/tmp/gatt_browser.pklg", HCI_DUMP_PACKETLOGGER); // init HCI remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; @@ -293,7 +294,6 @@ int main(int argc, const char * argv[]) arg++; continue; } - usage(argv[0]); return 0; } diff --git a/src/hci.c b/src/hci.c index 947eb0f43..554a72bcc 100644 --- a/src/hci.c +++ b/src/hci.c @@ -1054,18 +1054,21 @@ static void event_handler(uint8_t *packet, int size){ break; case HCI_EVENT_INQUIRY_RESULT: - case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI: + case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:{ if (!hci_stack->remote_device_db) break; // first send inq result packet hci_stack->packet_handler(HCI_EVENT_PACKET, packet, size); // then send cached remote names + int offset = 3; for (i=0; iremote_device_db->get_name(&addr, &device_name)){ hci_emit_remote_name_cached(&addr, &device_name); } } return; + } #endif case HCI_EVENT_DISCONNECTION_COMPLETE: