我正在修改DSPS示例代码,并且在更改设备播发的名称时遇到了问题。name常量列在.NVDS\u TAG\u DEVICE\u name下面,似乎有8个字节的长度限制,但我需要10个字节。我试着换衣服#define avd_data_len 0x1f(在co_bt.h中)再加上2位,但这会破坏代码
特别是31字节广告消息的内容是什么?我只能看到设备名称设备名称\u长度
另外,我认为BLE堆栈有限的数据包到20个字节,广告是否有一个不同的规则,或者它只是发送了两个数据包吗?
你好,
一个BLE广告包除了6字节的蓝牙设备地址(总共37字节)外,实际上还可以承载31字节的有效负载。
在DSP实现中,3个字节用于标记,18个字节用于唯一的服务ID(包括长度的一个字节和类型为一个字节)。这将留出10字节的名称(1字节),名称的数据类型(1byte)和名称本身。正如您所能将此限制为8Bytes /字符。
但不要惊慌;o)
您不必在广告数据中输入唯一的服务ID。你可以把它取下来。应用内\u sps\u设备\u项目.h更改
#define APP \u DFLT \u ADV \u DATA“\x11\x07\xb7\x5c\x49\xd2\x04\xa3\x40\x71\xa0\xb5\x35\x85\x3e\xb0\x83\x07”#定义应用程序数据长度(18)
到
#define app_dflt_adv_data“\ x04 \ xffhi!”#define app_dflt_adv_data_len(5)
这会将公布的数据更改为特定于制造商的短语“Hi!”的数据集。您可以在NVDS中扩展蓝牙设备名称,如下所示:
.nvds_tag_device_name =“da1458x123”,//这是10个字符长.nvds_tag_bd_address = {0xcc,0x00,0x00,0xca,0xea,0xcc},。adv_data_tag_len = 27,.SCAN\u RESP\u DATA\u TAG\u LEN=10,.device_name_tag_len = 10,
我希望有所帮助。
谢谢你的对话!这肯定有助于澄清我的问题,我能够得到工作。我对APP\u DFLT\u ADV\u数据定义的第二个字节很好奇。在此之前,它被标记为0x07,在代码中被注释为“*x07-可用的128位uuid的完整列表”,您将其更改为0xFF,并将其描述为特定于制造商的数据集。你能再解释一下你为什么要改变它以及它的含义吗?谢谢你的帮助,克里斯
你可以在广告中加入不同的数据段。有时告诉世界你的设备提供什么样的服务是有用的。比如说,智能手机可以扫描设备,只列出提供适用于智能手机应用程序的特定服务(如心率服务)的设备。您可以拥有空间允许的任意多个数据段。每个部分的组织如下:
<段长度> <段>
段的长度包括类型和数据的一个字节。对于标志,类型可以是0x02;对于蓝牙设备名称,类型可以是0x09;对于制造商特定的数据,类型可以是0xFF。您可以在BT SIG的网站上看到所有数据类型:https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile.
因此,为了允许您为您的设备名称提供更多空间,我必须用不需要多个字节的东西替换“128bit ...”的完整列表。我们也可以将您的BD名称放在扫描响应数据包中。在这样做时,您必须按照如上所述的格式遵循格式,并且只有在活动模式下扫描的设备只能检测到BD名称。
你好,如何从智能手机应用程序更改.NVDS\u TAG\u DEVICE\u NAME当da14580从应用程序接收数据时,例如:新的设备名称,如何替换旧的?谢谢您!
嗨,红熊
您可以使用以下CMDS到BLE低层(您可以在GAPM_TASK.H中找到所有命令列表)
GAPM\u SET\u DEV\u NAME\u CMD;
GAPM\u GET\u DEV\u NAME\u CMD;
gapm_get_dev_bdaddr_cmd;
有关命令的详细信息,请参见以下链接:
http://support.dialog-semicondiondiondum/resource/gap-Interface-pecification.
以下是一些代码供您参考:
1下面的函数集\u设备\u名称来自HCI主机====================
/*内部*/
void set\设备\名称(void)
{
struct gapm_set_dev_name_cmd * req = blemsgalloc(gapm_set_dev_name_cmd,task_gapm,task_app,9 + sizeof(struct gapm_set_dev_name_cmd));
请求->操作=GAPM\u SET\u DEV\u NAME;
req->长度= 10;
sprintf((char*)请求->名称,“DialogDemo”);
BlesendMsg((void *)REQ);
}
==============================.
对于BleSendMsg,BleMsgAlloc请检查ble_msg.c文件中的代码
我们的句柄GAPM\u SET\u DEV\u NAME代码如下:
========================================
案例GAPM\u SET\u DEV\u NAME:
UINT8_T status =(uint8_t)gap_err_not_supported;
#如果(请注意)
/*更新名称*/
status = attmdb_att_set_value(gapm_get_att_handle(gap_idx_devname),param->长度,
(UINT8_T *)&(param-> name [0]));
#endif/*BLE附件*/
/ *使用状态代码发送命令完成事件* /
gapm_send_complete_evt(gapm_cfg_op,status);
谢谢你的对话
嗨,谢谢你的回复。
我在SDK中找到了BLE_MSG.C,而不是在DA14580_DIALOGBEACON_3.40.6中,我需要将所有需要的文件复制到当前项目吗?还有别的办法吗?我从app\u task.c中找到以下代码:案例GAPM_RESET:{//设置设备配置struct gapm_set_dev_config_cmd * cmd = ke_msg_alloc(gapm_set_dev_config_cmd,任务\u GAPM,任务\u APP,GAPM \u set \u dev \u config \u cmd);应用程序配置功能(dest\u id,cmd);ke_msg_send(cmd);}//--------------------------------------------------------我加了这些,似乎不起作用:案例GAPM\u SET\u DEV\u NAME:attmdb\u att\u set\u value(GAPM\u GET\u att\u HANDLE(GAP\u IDX\u DEVNAME)),7,“da14580”);//我不知道如何在msg下面获取名称表格,所以......中断;在应用程序中添加:void app_set_dev_name(const uint8_t * name){struct gapm_set_dev_name_cmd * cmd = ke_msg_alloc(gapm_set_dev_name_cmd,task_gapm,task_app,gapm_set_dev_name_cmd);cmd->operation=GAPM\u SET\u DEV\u NAME;cmd->长度= 7;Memcpy(&cmd->名称,名称,7);ke_msg_send(cmd);}
按钮回调将调用app\u set\u dev\u name(name);//-------------------------------------------------------而且,即使在关闭电源之后,我需要保存新的配置数据(Dev Name,Adv Interval,UUID,用户定义CMD等)。期待你的回复。谢谢您!
嗨,安东尼42,
请尝试以下内容,
只需在项目中放置如下函数:
void set\设备\名称(void){结构gapm\u set\u dev\u name\u cmd*req=KE\u MSG\u ALLOC(gapm\u set\u dev\u name\u cmd,任务\u GAPM,任务应用程序,gapm_set_dev_name_cmd.);请求->操作=GAPM\u SET\u DEV\u NAME;req->长度= 6;memcpy(req-> name,“对话框”,6);发送消息(请求);}
在文件app\u task.c中捕获完成事件GAPM\u SET\u DEV\u NAME:
案例GAPM\u SET\u DEV\u NAME:{app_set_dev_name();}中断;
使用void app_set_dev_name(void){return}
在实现中,我使用了一个计时器而不是在连接后一段时间触发的按钮。
嗨,MT\u dialog,谢谢您的回复,我试过了,成功了!谢谢您!
我需要从智能手机配置信标,这些数据应存储在闪存中。我在CFG\u PRF\u DEVICE\u CONFIG中找到:struct app_beacon_config_tag.{UINT8_T UUID [16];uint16_t专业;uint16 t小调;UINT16_T 雷电竞下载appCOMPANY_ID;uint16高级集成;uint8_t力量;uint8\t垫;};我可以将一些物品添加到这个结构吗?例如:DEV名称,LED控件和几个用户定义的参数。
谢谢安东尼
嗨Antony42,
是的,您可以在struct中添加其他字段,以便将它们存储在Flash中,还应在App_Dialog_Beacon_Proj.c文件中添加Beacon_Params数组中的结构的特定字段。
请注意,在分配gapm\u set\u dev\u name\u cmd时,可能应该使用KE\u MSG\u ALLOC\DYN而不是KE\u MSG\u ALLOC,以避免损坏内存,例如(对于长度为6的名称):
ke_msg_alloc_dyn(gapm_set_dev_name_cmd,task_gapm,task_app,gapm_set_dev_name_cmd,6);
你好,乔奇姆,感谢您的回复,你是对的!今天我测试set_dev_name func,有时系统被诅咒,然后我记得你的答案,用KE\ u MSG\ u ALLOC\ n工作正常。为什么 ?在参考代码中,keu MSG\u ALLOC被大量使用。
在API文档中,您可以看到一些消息结构以动态大小的阵列结束,例如GapM_Set_Dev_name_cmd,GapM_White_List_mgt_cmd等,因为SizeOf(这样的结构)假定阵列中的0个元素,它们占用必须添加以及为消息分配的大小。
你好,
一个BLE广告包除了6字节的蓝牙设备地址(总共37字节)外,实际上还可以承载31字节的有效负载。
在DSP实现中,3个字节用于标记,18个字节用于唯一的服务ID(包括长度的一个字节和类型为一个字节)。这将留出10字节的名称(1字节),名称的数据类型(1byte)和名称本身。正如您所能将此限制为8Bytes /字符。
但不要惊慌;o)
您不必在广告数据中输入唯一的服务ID。你可以把它取下来。应用内\u sps\u设备\u项目.h更改
#define APP \u DFLT \u ADV \u DATA“\x11\x07\xb7\x5c\x49\xd2\x04\xa3\x40\x71\xa0\xb5\x35\x85\x3e\xb0\x83\x07”
#定义应用程序数据长度(18)
到
#define app_dflt_adv_data“\ x04 \ xffhi!”
#define app_dflt_adv_data_len(5)
这会将公布的数据更改为特定于制造商的短语“Hi!”的数据集。您可以在NVDS中扩展蓝牙设备名称,如下所示:
.nvds_tag_device_name =“da1458x123”,//这是10个字符长
.nvds_tag_bd_address = {0xcc,0x00,0x00,0xca,0xea,0xcc},
。adv_data_tag_len = 27,
.SCAN\u RESP\u DATA\u TAG\u LEN=10,
.device_name_tag_len = 10,
我希望有所帮助。
谢谢你的对话!这肯定有助于澄清我的问题,我能够得到工作。我对APP\u DFLT\u ADV\u数据定义的第二个字节很好奇。在此之前,它被标记为0x07,在代码中被注释为“*x07-可用的128位uuid的完整列表”,您将其更改为0xFF,并将其描述为特定于制造商的数据集。你能再解释一下你为什么要改变它以及它的含义吗?谢谢你的帮助,克里斯
你好,
你可以在广告中加入不同的数据段。有时告诉世界你的设备提供什么样的服务是有用的。比如说,智能手机可以扫描设备,只列出提供适用于智能手机应用程序的特定服务(如心率服务)的设备。您可以拥有空间允许的任意多个数据段。每个部分的组织如下:
<段长度> <段>
段的长度包括类型和数据的一个字节。对于标志,类型可以是0x02;对于蓝牙设备名称,类型可以是0x09;对于制造商特定的数据,类型可以是0xFF。您可以在BT SIG的网站上看到所有数据类型:https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile.
因此,为了允许您为您的设备名称提供更多空间,我必须用不需要多个字节的东西替换“128bit ...”的完整列表。我们也可以将您的BD名称放在扫描响应数据包中。在这样做时,您必须按照如上所述的格式遵循格式,并且只有在活动模式下扫描的设备只能检测到BD名称。
你好,
如何从智能手机应用程序更改.NVDS\u TAG\u DEVICE\u NAME
当da14580从应用程序接收数据时,例如:新的设备名称,如何替换旧的?
谢谢您!
嗨,红熊
您可以使用以下CMDS到BLE低层(您可以在GAPM_TASK.H中找到所有命令列表)
GAPM\u SET\u DEV\u NAME\u CMD;
GAPM\u GET\u DEV\u NAME\u CMD;
gapm_get_dev_bdaddr_cmd;
有关命令的详细信息,请参见以下链接:
http://support.dialog-semicondiondiondum/resource/gap-Interface-pecification.
以下是一些代码供您参考:
1下面的函数集\u设备\u名称来自HCI主机====================
/*内部*/
void set\设备\名称(void)
{
struct gapm_set_dev_name_cmd * req = blemsgalloc(gapm_set_dev_name_cmd,task_gapm,task_app,9 + sizeof(struct gapm_set_dev_name_cmd));
请求->操作=GAPM\u SET\u DEV\u NAME;
req->长度= 10;
sprintf((char*)请求->名称,“DialogDemo”);
BlesendMsg((void *)REQ);
}
==============================.
对于BleSendMsg,BleMsgAlloc请检查ble_msg.c文件中的代码
==============================.
我们的句柄GAPM\u SET\u DEV\u NAME代码如下:
========================================
案例GAPM\u SET\u DEV\u NAME:
{
UINT8_T status =(uint8_t)gap_err_not_supported;
#如果(请注意)
/*更新名称*/
status = attmdb_att_set_value(gapm_get_att_handle(gap_idx_devname),param->长度,
(UINT8_T *)&(param-> name [0]));
#endif/*BLE附件*/
/ *使用状态代码发送命令完成事件* /
gapm_send_complete_evt(gapm_cfg_op,status);
}
谢谢你的对话
嗨,谢谢你的回复。
我在SDK中找到了BLE_MSG.C,而不是在DA14580_DIALOGBEACON_3.40.6中,
我需要将所有需要的文件复制到当前项目吗?还有别的办法吗?
我从app\u task.c中找到以下代码:
案例GAPM_RESET:
{
//设置设备配置
struct gapm_set_dev_config_cmd * cmd = ke_msg_alloc(gapm_set_dev_config_cmd,
任务\u GAPM,任务\u APP,GAPM \u set \u dev \u config \u cmd);
应用程序配置功能(dest\u id,cmd);
ke_msg_send(cmd);
}
//--------------------------------------------------------
我加了这些,似乎不起作用:
案例GAPM\u SET\u DEV\u NAME:
attmdb\u att\u set\u value(GAPM\u GET\u att\u HANDLE(GAP\u IDX\u DEVNAME)),7,
“da14580”);//我不知道如何在msg下面获取名称表格,所以......
中断;
在应用程序中添加:
void app_set_dev_name(const uint8_t * name)
{
struct gapm_set_dev_name_cmd * cmd = ke_msg_alloc(gapm_set_dev_name_cmd,
task_gapm,task_app,gapm_set_dev_name_cmd);
cmd->operation=GAPM\u SET\u DEV\u NAME;
cmd->长度= 7;
Memcpy(&cmd->名称,名称,7);
ke_msg_send(cmd);
}
按钮回调将调用app\u set\u dev\u name(name);
//-------------------------------------------------------
而且,即使在关闭电源之后,我需要保存新的配置数据(Dev Name,Adv Interval,UUID,用户定义CMD等)。
期待你的回复。
谢谢您!
嗨,安东尼42,
请尝试以下内容,
只需在项目中放置如下函数:
void set\设备\名称(void)
{
结构gapm\u set\u dev\u name\u cmd*req=KE\u MSG\u ALLOC(gapm\u set\u dev\u name\u cmd,
任务\u GAPM,
任务应用程序,
gapm_set_dev_name_cmd.
);
请求->操作=GAPM\u SET\u DEV\u NAME;
req->长度= 6;
memcpy(req-> name,“对话框”,6);
发送消息(请求);
}
在文件app\u task.c中捕获完成事件GAPM\u SET\u DEV\u NAME:
案例GAPM\u SET\u DEV\u NAME:
{
app_set_dev_name();
}
中断;
使用void app_set_dev_name(void){return}
在实现中,我使用了一个计时器而不是在连接后一段时间触发的按钮。
谢谢你的对话
嗨,MT\u dialog,
谢谢您的回复,
我试过了,成功了!谢谢您!
我需要从智能手机配置信标,
这些数据应存储在闪存中。
我在CFG\u PRF\u DEVICE\u CONFIG中找到:
struct app_beacon_config_tag.
{
UINT8_T UUID [16];
uint16_t专业;
uint16 t小调;
UINT16_T 雷电竞下载appCOMPANY_ID;
uint16高级集成;
uint8_t力量;
uint8\t垫;
};
我可以将一些物品添加到这个结构吗?
例如:DEV名称,LED控件和几个用户定义的参数。
谢谢安东尼
嗨Antony42,
是的,您可以在struct中添加其他字段,以便将它们存储在Flash中,还应在App_Dialog_Beacon_Proj.c文件中添加Beacon_Params数组中的结构的特定字段。
谢谢你的对话
请注意,在分配gapm\u set\u dev\u name\u cmd时,可能应该使用KE\u MSG\u ALLOC\DYN而不是KE\u MSG\u ALLOC,以避免损坏内存,例如(对于长度为6的名称):
ke_msg_alloc_dyn(gapm_set_dev_name_cmd,task_gapm,task_app,gapm_set_dev_name_cmd,6);
你好,乔奇姆,
感谢您的回复,
你是对的!
今天我测试set_dev_name func,有时系统被诅咒,
然后我记得你的答案,用KE\ u MSG\ u ALLOC\ n工作正常。
为什么 ?
在参考代码中,keu MSG\u ALLOC被大量使用。
在API文档中,您可以看到一些消息结构以动态大小的阵列结束,例如GapM_Set_Dev_name_cmd,GapM_White_List_mgt_cmd等,因为SizeOf(这样的结构)假定阵列中的0个元素,它们占用必须添加以及为消息分配的大小。