查看了一下官方的Service,发现一个Serial Port Service。非常适合做自定义的数据传输。
首先,包含头文件,定义一系列回调函数, 增加服务。
ddc_cb.rx_data = ddc_rx_data_cb;
ddc_cb.set_flow_control = ddc_ctrl_key_cb;
ddc_cb.tx_done = ddc_tx_done_cb;
ddc = sps_init(&ddc_cb);
ble_service_add(ddc);
服务指针是全局变量,因为后面主动传输数据需要用到。不需要主动传输数据的服务一般不需要保存全局变量。
在回调函数中,如ddc_rx_data_cb,可以对数据进行处理,并进行相关操作。
在App处理连接等任务时,可以将Connect index保存用于后续数据传输时的参数。并启动定时发送数据的定时器。
active_conn_idx = evt->conn_idx;
OS_TIMER_START(sns_tim, OS_TIMER_FOREVER);
在手机上用BLE 测试工具就可以看到数据传输了。
然而,数据传输时发现一个问题。就是发现有延时。找了很多地方,后来发现主要是连接参数配置上可以优化。估计当时这个APP这么设计是为了功耗更好。
#if 0 //by zhw
#define defaultBLE_PPCP_INTERVAL_MIN (BLE_CONN_INTERVAL_FROM_MS(500)) // 500 ms
#define defaultBLE_PPCP_INTERVAL_MAX (BLE_CONN_INTERVAL_FROM_MS(750)) // 750 ms
#define defaultBLE_PPCP_SLAVE_LATENCY (0) // 0 events
#define defaultBLE_PPCP_SUP_TIMEOUT (BLE_SUPERVISION_TMO_FROM_MS(6000)) // 6000 ms
#else
#define defaultBLE_PPCP_INTERVAL_MIN (BLE_CONN_INTERVAL_FROM_MS(2.5)) // 2.5 ms
#define defaultBLE_PPCP_INTERVAL_MAX (BLE_CONN_INTERVAL_FROM_MS(5)) // 7.5 ms
#define defaultBLE_PPCP_SLAVE_LATENCY (0) // 0 events
#define defaultBLE_PPCP_SUP_TIMEOUT (BLE_SUPERVISION_TMO_FROM_MS(200)) // 100 ms
#endif
改完就正常了,数据可以即时响应。