当前网关nordic52840的代码,主机的连接是一主一从
计划增加nordic52840的连接能力,参考SDK一主八从的代码修改
nRF5_SDK_15.2.0_9412b96\examples\ble_central\ble_app_multilink_central
本文记录需要修改的地方
修改文件 \nRF5_SDK_15.2.0_9412b96\examples\GW_Nordic_nrf52832\mc_nxin_gw_ble\pca10056\s140\config\sdk_config.h
#define NRF_SDH_BLE_CENTRAL_LINK_COUNT 8
#define NRF_SDH_BLE_TOTAL_LINK_COUNT 8
此处修改主机连接N个从机
修改文件 \DA145xx_SDK_for_handover\DA145xx_SDK\BACK\nRF5_SDK_15.2.0_9412b96\components\ble\ble_db_discovery\ble_db_discovery.h
#define BLE_DB_DISCOVERY_MAX_SRV 1 /**< Maximum number of services supported by this module. This also indicates the maximum number of users allowed to be registered to this module (one user per service). */
此处修改不是必须的
这里的意思是 从机中的服务的数量
在一个主机连接N从机的情形中 有可能A从机是nus服务 B从机是lbs服务 C从机是nus+lbs服务这样
此时就需要支持2个服务 因为我们从机都是统一的nus服务 因此可以写为1 这样全局的数组更小一些
修改文件 \nRF5_SDK_15.2.0_9412b96\examples\GW_Nordic_nrf52832\mc_nxin_gw_ble\main.c
1>
BLE_NUS_C_ARRAY_DEF(m_ble_nus_c, NRF_SDH_BLE_CENTRAL_LINK_COUNT);
BLE_DB_DISCOVERY_ARRAY_DEF(m_db_disc, NRF_SDH_BLE_CENTRAL_LINK_COUNT);
//BLE_NUS_C_DEF(m_ble_nus_c); /**< BLE Nordic UART Service (NUS) client instance. */ /**< GATT module instance. */
//BLE_DB_DISCOVERY_DEF(m_db_disc);
此处修改是单个变为数组 一个从机对应一个nus的实例同时需要一个发现服务
后面基本都是解决此处修改带来的编译错误
2>
//static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
//{
// //NRF_LOG_INFO("[BLE] db_disc_handler");
// ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
//}
static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
NRF_LOG_DEBUG("call to ble_lbs_on_db_disc_evt for instance %d and link 0x%x!",
p_evt->conn_handle,
p_evt->conn_handle);
ble_nus_c_on_db_disc_evt(&m_ble_nus_c[p_evt->conn_handle], p_evt);
}
3>
static void ble_nus_chars_received_uart_print(uint8_t * p_data, uint16_t data_len)
该函数接口需要升级 需要一个参数来区分消息TX给哪一个从机
static void ble_nus_chars_received_uart_print(ble_nus_c_t * p_ble_nus_c,uint8_t * p_data, uint16_t data_len)
XXXXX
//ret_val = ble_nus_c_string_send(&m_ble_nus_c, send_pack, 6);
ret_val = ble_nus_c_string_send(p_ble_nus_c, send_pack, 6);
4>
case BLE_NUS_C_EVT_NUS_TX_EVT:
ble_nus_chars_received_uart_print(p_ble_nus_c,p_ble_nus_evt->p_data, p_ble_nus_evt->data_len);
break;
修改上述函数的调用
5>
static void ble_nus_c_evt_handler(ble_nus_c_t * p_ble_nus_c, ble_nus_c_evt_t const * p_ble_nus_evt)
XXXXXXXXX
err_code = ble_nus_c_string_send(p_ble_nus_c, send_pack, sizeof(send_pack));
6>
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
// err_code = ble_nus_c_handles_assign(&m_ble_nus_c, p_ble_evt->evt.gap_evt.conn_handle, NULL);
err_code = ble_nus_c_handles_assign(&m_ble_nus_c[p_gap_evt->conn_handle],
p_gap_evt->conn_handle,
NULL);
// err_code = ble_db_discovery_start(&m_db_disc, p_ble_evt->evt.gap_evt.conn_handle);
err_code = ble_db_discovery_start(&m_db_disc[p_gap_evt->conn_handle],
p_gap_evt->conn_handle);
7>
static void nus_c_init(void)
{
ret_code_t err_code;
ble_nus_c_init_t init;
init.evt_handler = ble_nus_c_evt_handler;
//err_code = ble_nus_c_init(&m_ble_nus_c, &init);
//APP_ERROR_CHECK(err_code);
for (uint32_t i = 0; i < NRF_SDH_BLE_CENTRAL_LINK_COUNT; i++)
{
err_code = ble_nus_c_init(&m_ble_nus_c[i], &init);
APP_ERROR_CHECK(err_code);
}
}
此时代码修改完毕 直接run 会看到出错log
[00:00:00.320,068] <warning> nrf_sdh_ble: Insufficient RAM allocated for the SoftDevice.
[00:00:00.320,098] <warning> nrf_sdh_ble: Change the RAM start location from 0x200029E0 to 0x200051C8.
[00:00:00.320,129] <warning> nrf_sdh_ble: Maximum RAM size for application is 0x3AE38.
需要修改KEIL
from 0x200029E0 to 0x200086F8
参考
https://my.oschina.net/u/4392850/blog/4657652
多nus服务一主多从
最新推荐文章于 2023-03-14 10:58:01 发布