我正在修改DSPS示例代码,并遇到了问题,改变设备广告的名称。名称常量列在. nvds_tag_device_name下,长度限制似乎是8字节,但我需要10字节。我试着改变#define ad_data_len 0x1F (in co_bt.h)多了两个比特的东西但这破解了密码
具体来说,这个31字节的广告信息的内容是什么?我只能看到设备名称device_name_length
我还认为BLE堆栈限制包20字节,广告有一个不同的规则或它只是发送两个包?
你好,
一个BLE广告包实际上可以携带31字节的有效载荷,除了6字节的蓝牙设备地址——总共37字节。
在DSPS实现中,3个字节用于标志,18个字节用于唯一的服务ID(包括一个字节用于长度,一个字节用于类型)。这为名称的长度(1字节)、名称的数据类型(1字节)和名称本身留下了10个字节。正如您所看到的,这将名称限制为8字节/字符。
但不要惊慌;o)
您不必在广告数据中添加唯一的服务ID。你可以直接删除它。在app_sps_device_project.h变化
#定义APP_DFLT_ADV_DATA " \ x11 \ x07 \ xb7 \ x5c \ x49 \ xd2 \ x71 \ \ x04 \ xa3 \ x40 xa0 \ xb5 \ x35 \ x85 \ x3e \ xb0 \ x83 \ x07”#定义APP_DFLT_ADV_DATA_LEN (18)
来
#定义APP_DFLT_ADV_DATA“\ x04 \ xFFHi !”#定义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_RESP_DATA_TAG_LEN = 10,.DEVICE_NAME_TAG_LEN = 10,
我希望这能有所帮助。
谢谢你MHv_dialog !这绝对有助于澄清我的问题,我能够得到它的工作。我对APP_DFLT_ADV_DATA定义的第二个字节很好奇。在此之前,它被标记为0x07,在代码中被注释为“* x07 - 128位uuid可用的完整列表”,您将其更改为0xFF,并将其描述为特定于制造商的数据集。你能解释一下为什么你要改变它,它意味着什么吗?谢谢你的帮助,~Chris
你可以在广告中加入不同的数据。有时告诉世界你的设备提供什么样的服务是有用的。这允许,比如说,智能手机扫描设备,并只列出提供特定服务的设备适用于智能手机应用程序-如心率服务。您可以拥有空间允许的任意数量的数据段。每一部分的组织方式如下:
<段>的长度<段>的类型<数据>
段的长度包括类型和数据的一个字节。类型可以是0x02(标志),0x09(蓝牙设备名称)或0xFF(制造商特定数据)。你可以在BT SIG的网站上看到所有的数据类型:https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile。
所以为了给你的设备名提供更多的空间,我必须用一些不需要那么多字节的东西来替换“128bit的Complete list…”我们也可以将您的BD名称放入扫描响应包中。在这样做的时候,您必须遵循上面描述的格式,并且BD名称只能被在活动模式下扫描的设备检测到。
你好,如何从智能手机应用中修改。nvds_tag_device_name ?da14580从app接收数据时,例如:新的dev名称,如何替换旧的?谢谢你!
嗨redbear
您可以使用以下cmd来BLE底层,(您可以在gapm_task.h中找到所有命令列表)
GAPM_SET_DEV_NAME_CMD;
GAPM_GET_DEV_NAME_CMD;
GAPM_GET_DEV_BDADDR_CMD;
有关命令的详情,请参阅以下连结:
http://support.dialog-semiconductor.com/resource/gap-interface-specification
以下是一些代码供您参考:
1.以下函数set_device_name HCI主机 ====================
/ * * /
空白set_device_name(空白)
{
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_SET_DEV_NAME;
申请- >长度= 10;
sprintf ((char *)请求- >名称,“DialogDemo”);
BleSendMsg ((void *)要求);
}
==============================
bleesendmsg, BleMsgAlloc请检查文件ble_msg.c中的代码
我们的句柄GAPM_SET_DEV_NAME代码如下:
========================================
案例GAPM_SET_DEV_NAME:
uint8_t status = (uint8_t) GAP_ERR_NOT_SUPPORTED;
#如果(BLE_ATTS)
/* update name */更新名称
status = attmdb_att_set_value(GAPM_GET_ATT_HANDLE(GAP_IDX_DEVNAME), param->length,
(uint8_t *) & (param - >名称[0]));
#endif /* BLE_ATTS */
/*发送命令完成事件与状态代码*/
gapm_send_complete_evt (GAPM_CFG_OP、状态);
由于MT_dialog
你好,谢谢你的回复。
我发现ble_msg.c在sdk,而不是在DA14580_DialogBeacon_3.40.6,我需要复制所有需要的文件到当前项目吗?其他方式吗?我从app_task.c中找到了这些代码:案例GAPM_RESET:{//设置设备配置struct gapm_set_dev_config_cmd* cmd = KE_MSG_ALLOC(gapm_set_dev_config_cmd,TASK_GAPM、TASK_APP gapm_set_dev_config_cmd);app_configuration_func (dest_id cmd);ke_msg_send (cmd);}//--------------------------------------------------------我加了这些,似乎不工作:案例GAPM_SET_DEV_NAME:attmdb_att_set_value (GAPM_GET_ATT_HANDLE (GAP_IDX_DEVNAME) 7“da14580”);//我不知道如何得到msg下面的名字形式,所以…打破;在app_dia_xx_proj.c添加: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 - >操作= GAPM_SET_DEV_NAME;cmd - >长度= 7;memcpy (cmd - >名称、名称、7);ke_msg_send (cmd);}
一个按钮回调将调用app_set_dev_name(名称);//-------------------------------------------------------并且,我需要保存新的配置数据(dev名称,adv间隔,UUID,用户定义的cmd等),甚至在断电后。期待您的回复。谢谢你!
嗨antony42,
请尝试以下方法,
就像这样在你的项目中放置一个函数:
空白set_device_name(空白){struct gapm_set_dev_name_cmd *req = KE_MSG_ALLOC(gapm_set_dev_name_cmd,TASK_GAPM,TASK_APP,gapm_set_dev_name_cmd);申请- >操作= GAPM_SET_DEV_NAME;申请- >长度= 6;memcpy(请求- >名称,“对话框”,6);ke_msg_send(要求的);}
在app_task.c文件中捕获GAPM_SET_DEV_NAME完成事件:
案例GAPM_SET_DEV_NAME:{app_set_dev_name ();}打破;
使用void app_set_dev_name(void){return}函数
在实现中,我使用了一个计时器,而不是一个按钮,谁是在连接后一段时间触发。
嗨MT_dialog,感谢您的回复,我试过了,成功了!谢谢你!
我需要配置智能手机的信标,这些数据应该存储在闪存里。我在CFG_PRF_DEVICE_CONFIG中发现:struct app_beacon_config_tag{uint8_t uuid [16];uint16_t主要;uint16_t小;uint16_t 雷电竞下载appcompany_id;uint16_t adv_int;uint8_t权力;uint8_t垫;};我可以在这个结构中添加一些项目吗?例如:dev名称,led控制和一些用户定义的参数。
由于安东尼
嗨Antony42,
是的,你可以在结构中添加额外的字段,以便在flash中存储它们,你也应该在app_dialog_beacon_project .c文件的beacon_params数组中添加结构的特定字段。
注意,当你分配gapm_set_dev_name_cmd时,你可能应该使用KE_MSG_ALLOC_DYN而不是KE_MSG_ALLOC来避免破坏内存,就像这样(对于长度为6的名称):
KE_MSG_ALLOC_DYN(GAPM_SET_DEV_NAME_CMD, TASK_GAPM, TASK_APP, GAPM_SET_DEV_NAME_CMD,6);
嗨Joacimwe,感谢您的回复,你是对的!今天我测试set_dev_name func,有时系统损坏,然后我记得你的答案,使用KE_MSG_ALLOC_DYN工作良好。为什么?在参考代码中KE_MSG_ALLOC被大量使用。
在API文档中,您可以看到一些消息结构以动态大小的数组结束,例如GAPM_SET_DEV_NAME_CMD、GAPM_WHITE_LIST_MGT_CMD、GAPM_RESOLV_ADDR_CMD等。由于sizeof(这样的结构体)假设数组中的元素为0,因此它们占用的大小也必须添加到为消息分配的大小中。
你好,
一个BLE广告包实际上可以携带31字节的有效载荷,除了6字节的蓝牙设备地址——总共37字节。
在DSPS实现中,3个字节用于标志,18个字节用于唯一的服务ID(包括一个字节用于长度,一个字节用于类型)。这为名称的长度(1字节)、名称的数据类型(1字节)和名称本身留下了10个字节。正如您所看到的,这将名称限制为8字节/字符。
但不要惊慌;o)
您不必在广告数据中添加唯一的服务ID。你可以直接删除它。在app_sps_device_project.h变化
#定义APP_DFLT_ADV_DATA " \ x11 \ x07 \ xb7 \ x5c \ x49 \ xd2 \ x71 \ \ x04 \ xa3 \ x40 xa0 \ xb5 \ x35 \ x85 \ x3e \ xb0 \ x83 \ x07”
#定义APP_DFLT_ADV_DATA_LEN (18)
来
#定义APP_DFLT_ADV_DATA“\ x04 \ xFFHi !”
#定义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_RESP_DATA_TAG_LEN = 10,
.DEVICE_NAME_TAG_LEN = 10,
我希望这能有所帮助。
谢谢你MHv_dialog !这绝对有助于澄清我的问题,我能够得到它的工作。我对APP_DFLT_ADV_DATA定义的第二个字节很好奇。在此之前,它被标记为0x07,在代码中被注释为“* x07 - 128位uuid可用的完整列表”,您将其更改为0xFF,并将其描述为特定于制造商的数据集。你能解释一下为什么你要改变它,它意味着什么吗?谢谢你的帮助,~Chris
你好,
你可以在广告中加入不同的数据。有时告诉世界你的设备提供什么样的服务是有用的。这允许,比如说,智能手机扫描设备,并只列出提供特定服务的设备适用于智能手机应用程序-如心率服务。您可以拥有空间允许的任意数量的数据段。每一部分的组织方式如下:
<段>的长度<段>的类型<数据>
段的长度包括类型和数据的一个字节。类型可以是0x02(标志),0x09(蓝牙设备名称)或0xFF(制造商特定数据)。你可以在BT SIG的网站上看到所有的数据类型:https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile。
所以为了给你的设备名提供更多的空间,我必须用一些不需要那么多字节的东西来替换“128bit的Complete list…”我们也可以将您的BD名称放入扫描响应包中。在这样做的时候,您必须遵循上面描述的格式,并且BD名称只能被在活动模式下扫描的设备检测到。
你好,
如何从智能手机应用中修改。nvds_tag_device_name ?
da14580从app接收数据时,例如:新的dev名称,如何替换旧的?
谢谢你!
嗨redbear
您可以使用以下cmd来BLE底层,(您可以在gapm_task.h中找到所有命令列表)
GAPM_SET_DEV_NAME_CMD;
GAPM_GET_DEV_NAME_CMD;
GAPM_GET_DEV_BDADDR_CMD;
有关命令的详情,请参阅以下连结:
http://support.dialog-semiconductor.com/resource/gap-interface-specification
以下是一些代码供您参考:
1.以下函数set_device_name HCI主机 ====================
/ * * /
空白set_device_name(空白)
{
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_SET_DEV_NAME;
申请- >长度= 10;
sprintf ((char *)请求- >名称,“DialogDemo”);
BleSendMsg ((void *)要求);
}
==============================
bleesendmsg, BleMsgAlloc请检查文件ble_msg.c中的代码
==============================
我们的句柄GAPM_SET_DEV_NAME代码如下:
========================================
案例GAPM_SET_DEV_NAME:
{
uint8_t status = (uint8_t) GAP_ERR_NOT_SUPPORTED;
#如果(BLE_ATTS)
/* update name */更新名称
status = attmdb_att_set_value(GAPM_GET_ATT_HANDLE(GAP_IDX_DEVNAME), param->length,
(uint8_t *) & (param - >名称[0]));
#endif /* BLE_ATTS */
/*发送命令完成事件与状态代码*/
gapm_send_complete_evt (GAPM_CFG_OP、状态);
}
由于MT_dialog
你好,谢谢你的回复。
我发现ble_msg.c在sdk,而不是在DA14580_DialogBeacon_3.40.6,
我需要复制所有需要的文件到当前项目吗?其他方式吗?
我从app_task.c中找到了这些代码:
案例GAPM_RESET:
{
//设置设备配置
struct gapm_set_dev_config_cmd* cmd = KE_MSG_ALLOC(gapm_set_dev_config_cmd,
TASK_GAPM、TASK_APP gapm_set_dev_config_cmd);
app_configuration_func (dest_id cmd);
ke_msg_send (cmd);
}
//--------------------------------------------------------
我加了这些,似乎不工作:
案例GAPM_SET_DEV_NAME:
attmdb_att_set_value (GAPM_GET_ATT_HANDLE (GAP_IDX_DEVNAME) 7
“da14580”);//我不知道如何得到msg下面的名字形式,所以…
打破;
在app_dia_xx_proj.c添加:
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 - >操作= GAPM_SET_DEV_NAME;
cmd - >长度= 7;
memcpy (cmd - >名称、名称、7);
ke_msg_send (cmd);
}
一个按钮回调将调用app_set_dev_name(名称);
//-------------------------------------------------------
并且,我需要保存新的配置数据(dev名称,adv间隔,UUID,用户定义的cmd等),甚至在断电后。
期待您的回复。
谢谢你!
嗨antony42,
请尝试以下方法,
就像这样在你的项目中放置一个函数:
空白set_device_name(空白)
{
struct gapm_set_dev_name_cmd *req = KE_MSG_ALLOC(gapm_set_dev_name_cmd,
TASK_GAPM,
TASK_APP,
gapm_set_dev_name_cmd
);
申请- >操作= GAPM_SET_DEV_NAME;
申请- >长度= 6;
memcpy(请求- >名称,“对话框”,6);
ke_msg_send(要求的);
}
在app_task.c文件中捕获GAPM_SET_DEV_NAME完成事件:
案例GAPM_SET_DEV_NAME:
{
app_set_dev_name ();
}
打破;
使用void app_set_dev_name(void){return}函数
在实现中,我使用了一个计时器,而不是一个按钮,谁是在连接后一段时间触发。
由于MT_dialog
嗨MT_dialog,
感谢您的回复,
我试过了,成功了!谢谢你!
我需要配置智能手机的信标,
这些数据应该存储在闪存里。
我在CFG_PRF_DEVICE_CONFIG中发现:
struct app_beacon_config_tag
{
uint8_t uuid [16];
uint16_t主要;
uint16_t小;
uint16_t 雷电竞下载appcompany_id;
uint16_t adv_int;
uint8_t权力;
uint8_t垫;
};
我可以在这个结构中添加一些项目吗?
例如:dev名称,led控制和一些用户定义的参数。
由于安东尼
嗨Antony42,
是的,你可以在结构中添加额外的字段,以便在flash中存储它们,你也应该在app_dialog_beacon_project .c文件的beacon_params数组中添加结构的特定字段。
由于MT_dialog
注意,当你分配gapm_set_dev_name_cmd时,你可能应该使用KE_MSG_ALLOC_DYN而不是KE_MSG_ALLOC来避免破坏内存,就像这样(对于长度为6的名称):
KE_MSG_ALLOC_DYN(GAPM_SET_DEV_NAME_CMD, TASK_GAPM, TASK_APP, GAPM_SET_DEV_NAME_CMD,6);
嗨Joacimwe,
感谢您的回复,
你是对的!
今天我测试set_dev_name func,有时系统损坏,
然后我记得你的答案,使用KE_MSG_ALLOC_DYN工作良好。
为什么?
在参考代码中KE_MSG_ALLOC被大量使用。
在API文档中,您可以看到一些消息结构以动态大小的数组结束,例如GAPM_SET_DEV_NAME_CMD、GAPM_WHITE_LIST_MGT_CMD、GAPM_RESOLV_ADDR_CMD等。由于sizeof(这样的结构体)假设数组中的元素为0,因此它们占用的大小也必须添加到为消息分配的大小中。