历史的帷幕徐徐落下,新的时代即将到来,从此人类踏入了新纪元...
在btstack/example目录下,每个文件都是一个示例程序,每个示例程序都有一个btstack_main函数,每个示例程序可以扮演client、service、可以是包含电池服务的外围设备或心跳服务的外围设备等等。
本文分析以le_data_channel_client.c为例,其btstack_main定义如下:
int btstack_main(int argc, const char * argv[]){#ifdef HAVE_BTSTACK_STDINint arg = 1;cmdline_addr_found = 0;while (arg < argc) {if(!strcmp(argv[arg], "-a") || !strcmp(argv[arg], "--address")){arg++;cmdline_addr_found = sscanf_bd_addr(argv[arg], cmdline_addr);arg++;if (!cmdline_addr_found) exit(1);continue;}usage(argv[0]);return 0;}
#else(void)argc;(void)argv;
#endifl2cap_init();// Initialize GATT client gatt_client_init();sm_init();sm_set_io_capabilities(IO_CAPABILITY_NO_INPUT_NO_OUTPUT);hci_event_callback_registration.callback = &packet_handler;hci_add_event_handler(&hci_event_callback_registration);btstack_stdin_setup(stdin_process);// turn on!hci_power_control(HCI_POWER_ON);return 0;
}
//l2cap初始化
l2cap_init();//gatt client 初始化
gatt_client_init();//安全管理模块初始化
sm_init();
sm_set_io_capabilities(IO_CAPABILITY_NO_INPUT_NO_OUTPUT);
这些先不具体分析,后面的章节再详细介绍,先主要分析下:
// turn on!
hci_power_control(HCI_POWER_ON);
hci_power_control根据hci_stack->state的值进入相应的分支,当前hci_stack->state = HCI_STATE_OFF,所以执行如下:
int hci_power_control(HCI_POWER_MODE power_mode){log_info("hci_power_control: %d, current mode %u", power_mode, hci_stack->state);int err = 0;switch (hci_stack->state){case HCI_STATE_OFF:switch (power_mode){case HCI_POWER_ON:err = hci_power_control_on();if (err) {log_error("hci_power_control_on() error %d", err);return err;}hci_power_transition_to_initializing();break;case HCI_POWER_OFF:// do nothingbreak; case HCI_POWER_SLEEP:// do nothing (with SLEEP == OFF)break;}break;...}// create internal eventhci_emit_state();// trigger next/first actionhci_run();return 0;
}
上述过程中,usb被重新打开:
hci_power_control_on();
hci_stack->hci_transport->init(hci_stack->config);
hci_stack->hci_transport->open();hci_stack相关状态设置:
hci_power_transition_to_initializing();
hci_stack->state = HCI_STATE_INITIALIZING;
hci_stack->substate = HCI_INIT_SEND_RESET;创建内部事件:
hci_emit_state();
event[0] = BTSTACK_EVENT_STATE; // BTSTACK_EVENT_STATE = 0x60
event[1] = sizeof(event) - 2;
event[2] = hci_stack->state;
hci_emit_event(event, sizeof(event), 1);btstack_linked_list_iterator_init(&it, &hci_stack->event_handlers);while (btstack_linked_list_iterator_has_next(&it)){btstack_packet_callback_registration_t * entry = (btstack_packet_callback_registration_t*) btstack_linked_list_iterator_next(&it);entry->callback(HCI_EVENT_PACKET, 0, event, size); //HCI_EVENT_PACKET = 0x04}运行
// trigger next/first action
hci_run();
hci_run是根据hci_stack结构体的各种状态值条件执行的,在运行hci_run()之前,hci_stack主要的状态值如下:
hci_stack->state = HCI_STATE_INITIALIZING;
hci_stack->substate = HCI_INIT_SEND_RESET;
乱花渐欲迷人眼,先来看看我军的摆兵布阵(还画不出来/(ㄒoㄒ)/~~):