配置BLE外设为中心

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support..我们将在未来几天修复bug /优化搜索和标记。
26个帖子/ 0新
最后一篇
Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
配置BLE外设为中心

亲爱的Dialog_Support,

我使用BLE外围作为我的项目的参考代码。BLE外设代码是作为广告设备,但我想将其配置为扫描设备(中心)。现在,我已经在现有的示例中做了以下更改。
1.在user_config.h
静态const struct gapm_configuration
///设备角色:中央,外设,观察者或广播公司
。role = gap_central_mst,
struct scan_configuration {
///操作代码。
UINT8_T代码;
///自己的BD地址源
UINT8_T ADDR_SRC;
///扫描间隔
uint16_t间隔;
///扫描窗口大小
uint16_t窗口;
/ / /扫描模式
UINT8_T模式;
///扫描过滤策略
uint8_t filt_policy;
///扫描重复过滤策略
uint8_t filter_duplic;
};

static const struct scan_configuration user_scan_conf = {
///操作代码。
.code = gapm_scan_passive,
///自己的BD地址源
.addr_src = GAPM_PUBLIC_ADDR,
///扫描间隔
.Interval = 10,
///扫描窗口大小
.window = 5,
/ / /扫描模式
.mode = GAP_GEN_DISCOVERY,
///扫描过滤策略
.filt_policy = SCAN_ALLOW_ADV_ALL,
///扫描重复过滤策略
.filter_duplic = scan_filt_duplic_en.
};

2.在user_callback_config.h
static const struct app_callbacks user_app_callbacks = {
.app_on_connection = user_app_connection,
.app_on_disconnect = user_app_disconnect,
.app_on_update_params_rejected = null,
.app_on_update_params_complete = null,
.app_on_set_dev_config_complete = default_app_on_set_dev_config_complete,
.app_on_adv_nonconn_complete =零,
.app_on_adv_undirect_complete = user_app_add_undirect_complete,
.app_on_adv_direct_complete = null,
.app_on_db_init_complete = default_app_on_db_init_complete,
.app_on_scanning_completed = user_on_scanning_completed,
.app_on_adv_report_ind = user_on_adv_report_ind,
#if(ble_app_sec)
.app_on_pairing_request = null,
.app_on_tk_exch_nomitm = null,
.app_on_irk_exch = null,
.app_on_csrk_exch =零,
.app_on_ltk_exch =零,
.app_on_pairing_succeded = null,
.app_on_encrypt_ind = null,
.app_on_mitm_passcode_req =零,
.app_on_encrypt_req_ind = null,
.app_on_security_req_ind = null,
#endif //(ble_app_sec)
};

3.我已经在user_peripheral.c文件中添加了这些函数
无效user_on_scanning_completed (uint8_t status)
{
if(status == gap_err_canceled)
{
app_easy_gap_start_connection_to();
connection_timer = app_easy_timer(user_con_timeout,user_gapm_cancel);
}
别的
{
user_scan_start();
}
返回;
}
静态孔隙user_scan_start(空白)
{
struct gapm_start_scan_cmd * cmd = ke_msg_alloc(gapm_start_scan_cmd,
task_gapm,task_app,
gapm_start_scan_cmd);

cmd-> op.code = user_scan_conf.code;
cmd - > op。addr_src = user_scan_conf.addr_src;
cmd-> interval = user_scan_conf.interval;
cmd窗口- > = user_scan_conf.window;
cmd-> mode = user_scan_conf.mode;
cmd - > filt_policy = user_scan_conf.filt_policy;
cmd - > filter_duplic = user_scan_conf.filter_duplic;

//发送消息
ke_msg_send(cmd);

//我们现在是可连接的
ke_state_set(task_app,app_connectable);
}

我已经尝试过上面的备受尊重文件的更改,但随着我运行程序,它进入NMI_Handler.c。
我错过了什么?或者我做错了什么配置?请使用适当的步骤指导我配置BLE外设作为中央。

先感谢您。

带着敬意,
Ruchi Patel.

设备:
MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

当设备准备开始(配置,设置并准备好)广告或扫描命令都从.default_operation_Adv,所以在那个挂钩中,您应该在准备好的情况下放置您想要的设备。所以我假设如果你在那个钩子中放置user_start_scan()函数而不是user_app_adv_start()你的设备将开始扫描过程。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
谢谢你的建议

谢谢你的建议。

我已经尝试过上述解决方案,但我仍然得到同样的问题。当我运行程序时,它进入nmi_handler.h。是我在user_config.h中完成的上述配置,user_callback_config.h和user_peripher.cl文件是正确的?您可以提供详细的解决方案或示例代码,展示中央功能。

带着敬意,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

如果触发user_scan_start()函数,请检查调试器,如果触发完成,请检查完成回调,如果它是拨打的错误代码是什么,如果它是一个GAP_ERROR_TIMEOUT,则在大约8秒的活动之后得到它您正在扫描,并且当您到达扫描过程的完成回调时触发NMI。关于您粘贴的文件和代码,我没有看到它们的任何问题,你得到的nmi意味着代码保持相当于困境的时间(如果有的话可以是主循环中的wfi()休眠禁用,没有BLE活动超过2.6秒,这是看门狗可以测量的最长时间)。据一个例子是关注,我想你已经熟悉来自主机侧的DSPS代码。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
你好MT_Dialog,

你好MT_Dialog,

感谢您的回复。现在我可以将ble_app_peripheral与我的中心设备连接起来。下一个任务是从中心设备发送一个命令到ble_app_peripheral来切换LED。我可以使用自定义配置文件特征发送命令ble_app_peripheral从中心设备,因为我们正在做从BLE扫描仪应用程序?

带着敬意,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

与来自中心的自定义配置文件进行交互,需要在中心侧实现,因为当设备连接时,中央应开始发现过程,以便发现可用的服务和特性。在中央发现外围侧的特性之后,它可以开始写入和读取数据,因为中央需要知道应在外围侧读取或写入的手柄。简而言之,是的,你可以将数据写入自定义特征,只要特征是可写的,但您必须实现中心侧的发现过程,然后您将能够编写数据。DSP主机侧实现了DSP配置文件的发现过程,您可以将其视为参考。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
谢谢你的快速

感谢您的快速回复。

我需要实现自定义服务和特征的发现过程。我没有找到关于发现过程的明确步骤。我也经历了DSP榜样,但由于其复杂性,我无法妥善理解它。

1.您可以列出详细信息中发现程序的步骤吗?
2.参考DSP,提到哪些文件发现相关信息?
3.哪些功能对发现自定义服务和特征有用?

带着敬意,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

1.我无法提及在这个论坛上提及发现程序的每一个细节,你应该检查这个规范,以便获得广泛的发现程序,我可以提到关于这个过程的一些关键步骤,还可以提到一些关键步骤在DSPS源代码中为您提供几个代码片段,以便遵循。此外,一个非常有用的文档将是RW-BLE-GATT-IS.PDF文档包括应向堆栈和从堆栈发出的所有命令/响应,以便完成发现过程。

  • 关于发现过程,先从发现服务开始,找到所有服务后,设备开始寻找每个服务的可用特征,然后是描述符。
  • 关于DSPS代码和实现:
    • 整个过程在连接设备时启动,因此发生连接的回调并启用DSPS主机配置文件,因此函数user_sps_enable()是启动整个过程的原因。
    • user_sps_enable()函数触发sps_client_enable_req消息,因此处理程序sps_client_enable_req_handler()被触发。
    • 如果启用了发现标志,则主机将发送(通过prf_disc_svc_send_128())使用gattc_disc_by_uuuid_svc参数的gattc_disc_cmd,此命令将发现与uuid相对应的服务,它将其作为对消息的参数传递,并将回复使用gattc_disc_svc_ind(一旦找到服务),并且只要命令结束,就会使用gattc_cmp_evt。
    • 因此,服务发现的关键功能是上述消息的相应处理程序(Gattc_disc_svc_ind_handler()和gattc_cmp_evt_handler())
    • gattc_cmp_evt_handler()是一个非常关键的函数,因为这是通过每个状态推动服务发现的实现(服务 - 特性 - 描述符)。
    • 当设备从服务与当然的相应消息进行特征发现时,遵循类似的过程。
    • 以上所有信息都包含在RW-BLE-GATT-IS.pdf中,所以请花些时间研究该文件。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
hello dialog_support,

hello dialog_support,

感谢客户端配置步骤。我跟着你的步骤,但我得到了错误。
1 ... \ src \ custom_profile \ user_custs_config.c(47):错误:#29:预期表达式
struct attm_desc_128 custs1_att_db [cust1_idx_nb] = {};

const struct cust_prf_func_callbacks cust_prf_funcs [] =
{
#如果(BLE_CUSTOM1_SERVER)
{task_custs1,
custs1_att_db,
cust1_idx_nb,
#如果(BLE_APP_PRESENT)
app_custs1_create_db,app_custs1_enable,
#别的
null,null,
#万一
custs1_init,null.
},
#万一
#if(ble_custom2_server)
{task_custs2,
空,
0,
#如果(BLE_APP_PRESENT)
app_custs2_create_db app_custs2_enable,
#别的
null,null,
#万一
custs2_init,零
},
#万一
{task_none, null, 0, null, null, null}, //不移动。必须总是最后一个
};
我在user_custs_config.c中声明了上面的函数
在user_custs1_def.h中
extern struct attm_desc_128 custs1_att_db [cust1_idx_nb];

2.我应该写什么代替#if (BLE_SPS_CLIENT)

带着敬意,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

1.显然您已将DSP主机放在DSPS中,Custs1.h包括为包括自定义配置文件,并且您尚未将任何内容声明为数据库,请检查例如BLE_APP_PERITIVELAL示例并检查该数组中的内部内部。

2.但是我不理解第二个问题,这只是为了包含SPS客户端功能的一个定义。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
非常感谢你

非常感谢你的步骤。它有助于我们很多。经过长时间,我能够发现服务和特征。现在我的下一个任务是客户端和服务器之间的数据传输。您能告诉我哪个自定义函数启动数据传输程序?

感谢致敬,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

你的意思是,你想从核心到外围的特征来表演写字吗?您可以使用DSP示例实现的PRF_Gatt_Write()命令,关闭函数该函数向堆栈发送特定消息,该堆栈是Gattc_Write_cmd,您将能够在RW-BLE-GATT中找到额外的信息.pdf在支撑场上。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
是的,我想从...写下数据

嗨mt_dialog,

是的,我想把数据从中心写入外设的特征。
正如您建议使用“prf_gatt_write()”命令,我在DSPS示例中检查了它。据我所知,有一个名为“sps_client_data_tx_req_handler”的特定处理程序,它使用“prf_gatt_write()”命令处理传输请求。因此,在理想情况下,当中央抛出写(数据tx)请求时,应该调用该处理程序。但是,我不知道如何调用tx_req_handler。我如何确切地调用一个内置函数或编写自己的函数,它将调用“sps_client_data_tx_req_handler”?

感谢致敬,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

你看到的处理程序是DSPS引用应用程序的实现,如果你想通过发送消息和通过消息处理事件而不是直接调用一个函数调用来触发写入事件,你可以实现类似DSPS项目的东西。当DSPS希望发送数据时,它实现一个名为SPS_CLIENT_DATA_TX_REQ的消息并将其发送到堆栈,然后堆栈一旦消息被处理就会触发相应的处理程序,SPS_CLIENT_DATA_TX_REQ消息通过user_send_ble_data()函数发送,由该消息触发的处理程序声明在sps_client_connected数组中的sps_client_task.c文件中,您可以将其作为一个引用。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50


嗨mt_dialog,

最初我还考虑过使用“user_send_ble_data()”函数通过BLE发送数据。这个函数需要数据和data_length作为参数。然后它将数据发送到一个预先确定的特征。但在我的情况下,我不想总是将数据发送到固定的特征。

例如:
假设我有一个名为“cust_service_1”的自定义服务。在该服务中,我有一些自定义特征,如“LED_1_Brightness”,“LED_2_Brightness”等,它具有没有附加的响应属性。
现在,我想将0x57发送到“led_1_亮度”特性。
所以我想到的是一个简单的函数,它接受以下参数:

UINT8_T数据[1] = {0x57};
UINT8_T长度= 1;
void my_function_to_send_data(服务名称cust_service_1,Charecteristic_NameLED_1_BRIGHTS,data_value.*数据,data_length.长度);

由于“user_send_ble_data()”功能仅接受数据和数据长度;如何确保我的数据被发送到我想要的正确特征?我应该附加用于服务名称和特征名称的其他参数,如上面的示例所示?或者在某些变量中首先在外部设置外部的任何其他方法,然后调用“user_send_ble_data()”功能,以便将数据发送到所需的特性?请帮我解决一下这个。

感谢致敬,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

如上所述,user_send_ble_data()是DSP使用的函数,它不是通用功能,以便将数据发送到服务上可用的任何特征。实际发送数据的处理程序是sps_client_data_tx_req_handler()和实际发送数据的函数是prf_gatt_write()。由于这是实际发送在另一侧数据的函数,因此这也是扭动数据将要发送的特征的句柄的函数。因此,通过使用相应的句柄参数调用prf_gatt_write()将更新正确的特征值。在DSP的情况下,sps_client_data_tx_req_handler始终使用的特征句柄是spsc_env-> sps.chars [spsc_srv_rx_data_char] .val_hdl。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
嗨mt_dialog,

嗨mt_dialog,

正如你在之前的评论中正确提到的,sps_client_data_tx_req_handler()是实际发送数据的函数。我想要一个简单的应用程序,用户按下按钮,它会触发中断例程。在中断例程内,我想调用sps_client_data_tx_req_handler()函数发送一些数据。该函数需要以下参数:

Static int sps_client_data_tx_req_handler(ke_msg_id_t const msgid,
struct sps_client_data_tx_req const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

但是,我没有太多了解在每个参数中传递的内容,以便将我的数据发送到特定的特征。你能给我更多的洞察力吗?

感谢致敬,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

您可以添加额外的成员sps_client_data_tx_req结构并传递你想从这个成员的特点,所以当你分配一个sps_client_data_tx_req消息你也应该通过在请求你想执行的特点写,例如,当消息在发送之前被分配时,结构当前已经填充了三个成员(conhdl、length和data),因此添加一个额外的成员来保存您想要编写的特征。当调用sps_client_data_tx_req_handler()时,可以传递在sps_client_data_tx_req结构中添加的额外成员的值,而不是prf_gatt_write()中的固定值。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
嗨mt_dialog,

嗨mt_dialog,

谢谢你的帮助。我成功地将数据写入特定的特征。我用略有不同的方法比你建议的方法略有不同,但是因为它做了我不介意的工作。以下是我的程序所做的摘要:

  1. 它连接到所提到的特定地址user_advertise_data.(dsp)一样
  2. 它启用客户端模式
  3. 然后它找到服务,特征及其描述符
  4. 一旦完成此项,程序会等待用户按钮中断
  5. 当用户按下一个按钮,我们将亮度值发送到外设使用的特定特性prf_gatt_write.功能
  6. 该值被成功接收,LED亮度也随之改变

因此,我目前可以将数据从1个BLE客户端发送到1个BLE外围设备。注意,它们在整个会话中始终是连接的。

现在,我的项目还剩下最后一步。有1个客户端(我正在工作),有4个外围设备。我有4个不同的用户输入按钮,根据按下的按钮,我想把数据从我的BLE客户端发送到一个特定的BLE外围设备。这是我现在想要实现的示例流程:

  1. 用户按下一个按钮(例如,按钮2)
  2. 我的ble客户应该连接到BLE外围号码-2的特定地址
  3. 启用客户端模式(与之前的情况相同)
  4. 查找服务、特征及其描述符(与前面的案例相同)
  5. 然后,它应该将亮度值发送到外围设备的特定特性prf_gatt_write.功能
  6. 这个值应该被接收,并且BLE外设-2上的LED亮度应该相应地改变
  7. 最后,客户应该这样做断开从外围和等待另一个按钮按事件

请注意,我不希望同时连接,我只需要连接到特定的设备,发送数据然后断开连接。

我需要紧急实施这一点。所以我希望一个具体的详细解决方案。请帮忙..!!

提前谢谢,
Ruchi Patel.

MT_dialog
离线
最后一次露面:3个月3周前
职员
加入:2015-06-08 34
嗨Ruchi Patel,

嗨Ruchi Patel,

您的用例是非常具体的,我无法在本论坛上留下或记录每种特定细节,请查看我的建议。

为了通过中央连接到外围设备,需要广告外设(需要广告,以便外围设备接收连接请求,仅用于扫描设备的中心,所以您将假设您的外围设备将在那里并发出没有扫描过程的连接请求,或者您也将扫描?我想您将要为您的设备使用公共地址,因为SPEG定义的静态地址,它们应该在每个重启外设的重新启动时更改,并且随机可解析需要与每个单独的设备绑定。所以假设您正在使用公共地址,并且据我所知,您的中央地址是有两个选项:

1)假设设备已经有和没有扫描过程从中央,当按钮被按下可以发出一个连接通过app_easy_gap_start_connection_to_set()和app_easy_gap_start_connection_to()以启动连接过程中,但同样,你必须确保设备在做广告,如果没有,连接过程不会超时,如果没有人回应,你就必须通过应用程序超时。因此,一旦设备连接起来,发现过程就会开始,设备会做它连接时做的任何事情。一旦交换了数据,就可以调用app_easy_gap_disconnect()以断开外围设备与中心设备的连接,当连接发生时,禁用并清理概要文件结构(取决于您如何实现自定义概要文件)。断开连接请求可以通过外设发出,也可以通过中央发出。

2)关于第二个选项,您可以按下按钮并存储在全局变量中,您想要连接的相应的BD地址,因此当扫描过程返回指示标准的特定地址时,您可以发出连接请求。除了所有的剩余部分都保持不变。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
嗨mt_dialog,

嗨mt_dialog,

我的最终目标是设计一个可编程BLE Remote.用于控制多个调光灯。因此,遥控器最初保留在外围模式中并与Android应用程序连接。那么该应用程序将判断哪个按钮应该做哪些功能。BLE遥控器仅仍然存在于外围模式。但是一旦用户按下按钮,让我们说按钮-1,它执行以下操作:

  1. 它将切换模式周边到中央
  2. 它会连接使用Dimmer-1(因为按下按钮-1)。Dimmer-1是已经处于广告模式的BLE外围设备。
  3. 现在遥控器会发送一个新的亮度值调光器-1
  4. 它会断开从dimmer-1
  5. 它会将角色转回外围

我仍然不知道如何在运行时进行角色转换。所以目前,我的可编程BLE遥控器总是处于中央模式。

为了操作我的BLE遥控器上的按钮按下调光器,我写了以下代码:

BOOL GBOOLD1CONNECT = FALSE;
空白user_button_pressed(空白)
{
gboolD1Connect = true;
// user_on_adv_report_ind(param-> rapth.adv_addr_type:0x01);
if (dimmer1_connected == true) //只有在整个连接过程完成后才为true
{
uint8_t my_data [1];
my_data [0] = 0 x14;/ /亮度值
uint16_t my_length;
my_length = 1;
//此功能将数据从交换机发送到调光器
prf_gatt_write(con_info, val_hdl, uint8_t *)my_data, sizeof(uint8_t * my_length, GATTC_WRITE);
}
}


//这是Inbuilt函数,我已修改,以便在Gboold1Connect为真时才能连接到Dimmer-1
void user_on_adv_report_ind(struct gapm_adv_report_ind const * param)
{
if(gboold1connect)
{
if(!memcmp(&param-> report.data [3],user_advertise_data,user_advertise_data_len)))
{
ARCH_PRINTF(“连接%02x%02x%02x%02x%02x%02x”,
param - > report.adv_addr.addr [5],
param-> eport.addr.addr [4],
param - > report.adv_addr.addr [3],
param - > report.adv_addr.addr [2],
param-> eport.addr.addr [1],
param-> report.adddr.addr [0]);
app_easy_gap_start_connection_to_set(param-> rapth.adv_addr_type,(uint8_t *)&param-> report.adv_ddr.addr,ms_to_doubleslots(12.5));
user_gapm_cancel();
}
}
}

上述实现工作,但它有一个问题。当我第一次按下遥控器的按钮,它会设置gboold1connect.返回true,然后退出函数,因为dimmer1_connection.还没有真。之后,在背景中,何时user_on_adv_report_ind ()运行,它将与Dimmer-1连接。连接完成后,将发现所有服务,ChareCertics和描述符。最后,就在描述符发现完成后,我在内置函数中插入了一行以制作dimmer1_connected = true.整个过程需要2-3秒。所以3秒后,当我再次按下按钮时,它最终会进入dimmer1_connected == true部分并发送亮度值。所以你可以看到,我得按两次按钮(1号用于连接,2号用于发送数据)能够发送数据。这个问题发生,因为每当我给一个命令,以连接到一个调光器设备(通过制作gboold1connect.为真,或使用app_easy_gap_start_connection_to_set()功能),我必须退出中断例程并允许主程序运行,以便发生实际连接。但由于我退出了我的中断例程,我将如何重新输入它并在连接外围设备时发送数据?

所以我有两个需要帮助的问题:

  1. 在此代码示例中,我可以在此代码中进行哪些更改,以便仅按下按钮一次操作调光器?
  2. 如何从核心到外围切换角色是什么,反之亦然?

在此先感谢您的帮助,
Ruchi Patel.

mhv_dialog
离线
最后一次露面:3个月2周前
职员
加入:2013-12-06 15:10
嗨Ruchi,

嗨Ruchi,

我可以建议你看看无附庸的样本应用程序(https://support.dialog-seminiondionder.com/connectivity/reference-design/smartbond-codeless-serial-link.)。

这个应用程序演示了中心设备和外围设备的各个方面,以及如何在角色之间切换。

/ MHv

Ruchi Patel.
离线
最后一次露面:2年7个月前
加入:2017-03-29 10:50
嗨mhv,

嗨mhv,

您提出的建议真的很好,我很高兴能够继续执行它。但看看文档,我知道它的实现主要需要两件事:

(1)DA1458x BLE模块,用于命令固件
(2)第三方微控制器来控制BLE模块

但在我的情况下,我在单个芯片上只有一个DA1458x BLE模块。我没有特权在同一芯片上添加另一个第三方控制器以控制BLE模块。

我希望我的DA1458X BLE模块具有固件,然后逻辑调用AT命令本身的序列以独立方式运行。

所以,是否可以在不需要终端,Android应用程序或第三方控制器等外部控制机制的情况下实现AT命令方法?

谢谢,
Ruchi Patel.

mhv_dialog
离线
最后一次露面:3个月2周前
职员
加入:2013-12-06 15:10
嗨Ruchi,

嗨Ruchi,

实现应该只是用于指导如何完成不同的事情。通过运行代码,并使用调试器逐步执行各种命令,您将能够了解看似复杂的任务是如何实现的。这里有一些例子:

  • 角色转移(中央和外围之间)
  • 开始,停止和改变广告数据和间隔
  • 配置、设置和读取gpio的状态
  • 将特定围绕设备连接为中心,发现服务和交换数据
  • 通过I2C与外部传感器接口

无附加的实现是在命令触发不同动作的命令,但应该可以编写自己的逻辑来驱动相同的功能(您可能只将应用程序的代码复制到您的项目中的无附带部分)

/ MHv

chenpenglai
离线
最后一次露面:两个月三个星期前
加入:2018-12-24 02:24
我无法发现

我无法发现特征,但我可以发现服务,我的项目BLE_APP_PERITERAL

你能告诉我如何发现特征?

非常感谢你!

PM_Dialog
离线
最后一次露面:13小时30分钟前
职员
加入:2018-02-08 11:03
嗨Chenpenglai,

嗨Chenpenglai,

这个论坛线程很古老,所以我建议你创造一个新的。如果您不知道您应该遵循的程序以创建新的论坛线程,请告诉我,我将为您提供所有步骤。所以请创建一个新的论坛帖子和复制你的问题。

关于你的问题,你使用的是哪个版本的SDK ?你在SDK的ble_app_peripheral例子中做了任何修改吗?

谢谢,PM_Dialog