你好,
为什么写Dev名和读Ori Dev名使用相同的索引?
DIS_IDX_IEEE_CHAR,
DIS_IDX_IEEE_VAL,
DIS_IDX_PNP_ID_CHAR,
DIS_IDX_PNP_ID_VAL,
DIS_IDX_NB,
// PnP ID特征声明
[DIS_IDX_PNP_ID_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(dis_pnp_id_char),
sizeof (diss_pnp_id_char), (uint8_t *) &diss_pnp_id_char},
// PnP ID特征值
[dis_idx_pnp_id_val] = {att_char_pnp_id, perm (rd, enable), dis_pnp_id_len, 0, null},
//读写Dev名称特征声明
[DIS_IDX_PNP_ID_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(dis_pnp_id_char),
sizeof (diss_pnp_id_char), (uint8_t *) &diss_pnp_id_char},
// Read Write Dev Name特征值
[dis_idx_pnp_id_val] = {att_char_pnp_id, perm (rd, enable), dis_pnp_id_len, 0, null},
//读取Dev名称特征声明
[DIS_IDX_PNP_ID_CHAR] = {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(dis_pnp_id_char),
sizeof (diss_pnp_id_char), (uint8_t *) &diss_pnp_id_char},
// Read Ori Dev Name特征值
[dis_idx_pnp_id_val] = {att_char_pnp_id, perm (rd, enable), dis_pnp_id_len, 0, null},
- 另一个问题:我可以在diss中添加一个128位的特征吗?
为什么?智能手机应用程序需要从一个128bit uuid读写dev名称。
我是否可以基于原始代码进行更改,或者我是否必须重写代码,如spotar_create_db_req_handler() ?
谢谢你!
嗨antony42,
我猜你想把这个设备的名字从智能手机改成智能手机,对吗?您必须将权限更改为适当的特征,并为特定IDX处理da的写命令,使用SAMPLE128作为引用(gattc_write_cmd_ind_handler)。我认为您可以,但是您要更改由SIG定义的概要文件。
由于MT_dialog
嗨,MT_dialog,
绝对正确!
我需要把这些信息保存起来。
你能给我一些建议吗?
非常感谢!
嗨antony42,
我建议您不要更改dis配置文件(您可能与其他设备存在兼容性问题),相反,您可以将它包含到您的服务中,并创建一个新的定制配置文件(SAMPLE128教程),其中包含您需要的额外信息。正如我之前提到的,dis是从蓝牙SIG定义的服务,您可以使用信标项目来处理您的消息的广告。
由于MT_dialog
嗨MT_dialog,
我尝试了,但在初始化数据时,我不能得到正确的句柄索引。
另一个问题:
为什么下列结构中的产品标题与第10页的AN-B-010不同?
从beacon ref项目:
#定义x1f000 PRODUCT_HEADER_POSITION 0
// SUOTA的产品头
struct product_header
{
uint8_t签名[2];
uint8_t版本[2];
uint32_t保留[4];
uint32_t config_offset;
};
struct product_header p_header;
spi_flash_read_data((uint8_t*)&p_header, (unsigned long)PRODUCT_HEADER_POSITION, (unsigned long)sizeof(struct product_header));
app_config_header_offset = p_header.config_offset;
我打印数据,看起来像:
0x70 0x52 0x0 0x1 0x0 0x80 0x0 0x0 0x0 0x30 0x1 0x0 0xff 0xff 0xff 0xff
与AN-B-010相同(签名7052,版本0100,偏移1,偏移2)
但p_header。config_offset = ?
struct config_header也不同于AN-B-010
谢谢你!
嗨antony42
“不一样”是什么意思?在“偏移#2”字段下看不到其他字段?这是因为Beacon应用程序没有使用其他字段。您不能读取config_offset,因为您必须在SPI中加载头才能读取它,您可以使用Smart Snippets专有头程序员来设置config_offset和信标配置。
谢谢MT_dialog。
嗨MT_dialog,
在UM-B-019(信标参考)9.7.1内存映射:
配置存储使用双映像引导加载程序的内存映射。更具体地说,它使用
Product Header中' Reserved '字段的前四个字节(字节偏移12),如
[6]的6.1节,定义配置区域的内存地址。地址必须指向
SPI Flash扇区的开始和其他信息必须存储在同一扇区。
[6]的第6.1节在哪里
UM说使用“保留”字段的前四个字节来存储配置地址,
struct product_header
{
uint8_t签名[2];
uint8_t版本[2];
uint32_t保留[4];
uint32_t config_offset;
};
现在我的头文件(.txt文件)是:
2 signature产品头部签名。必须包含0 x7052
2 version产品报头版本
4 offset1 LE格式图像头#1的内存偏移量
4 offset2 LE格式图像头2的内存偏移量
用专用头程序员打开并设置正确的值7052,0001,00800000,00300100。
谢谢你!
嗨antony42,
产品报头应该以辅助引导加载程序报头的形式出现。您可以使用12字节偏移(BDaddress)或放置一些填充和使用17字节(保留)偏移来放置配置头格式的地址。product_header。Config_offset将包含位于配置头地址的产品头的偏移量。您应该在product_header.txt中添加一个额外的字段,以便放置配置头文件的地址。配置偏移将指向配置头。配置数据以字节偏移64的方式放置在配置头的下面。
由于MT_dialog
嗨MT_Dialog,
我不太明白。
/ /产品头结构
typedef struct __productHeader {
uint8签名[2];
uint8版本[2];
uint32_t offset1;
uint32_t offset2;
} s_productHeader;
// SUOTA的产品头
struct product_header
{
uint8_t签名[2];
uint8_t版本[2];
uint32_t保留[4];
uint32_t config_offset;//为什么这个和上面的不一样?
};
似乎是完整的版本。
在这个文件中12-31被保留
32-37 BD地址…
谢谢你!
嗨antony42
以上两个结构体是不同的,因为在信标中我们不指定图像偏移量,我们只是添加一些
填充uint32_t保留[4]。
1-uint32_t for image offset1, 2-uint32_t for image offset2, 3-4 uint32_t for dbaddress和一些额外的
保留数据。
在信标应用程序中,如果启用了CONFIGURATION,则必须在产品中添加一个额外字段
头……configOffset为例。然后,在生成product_header.txt之后,就可以从智能上切换了
snippet工具并将值添加到相应的字段。app_read_config_header将找到
然后从app_read_config . Product_header中读取配置头......的config_offset
数据将用配置数据填充相应的结构。您可以使产品标题为
对应的结构如下:
创建一个product_header.txt文件并添加以下字段
产品头部签名(7052)
2 String Version产品报头版本号
16 Integer Reserved预留填充
4 Integer ConfigOffset Config
是的,我想你可以使用一个硬编码的地址,并从那里读取配置数据。
由于MT_dialog
嗨MT_Dialog,
我在app_connection_func中调用了led_on(),设置引脚低,
但是led只闪了一次,我找不到io输出设置的高?
app_adv_stop ();
开关(app_advertise_mode)
{
案例GAPM_ADV_NON_CONN:
app_advertise_mode = GAPM_ADV_UNDIRECT;
打破;
案例GAPM_ADV_UNDIRECT:
app_advertise_mode = GAPM_ADV_NON_CONN;
打破;
}
这将改变广告模式,但它不调用app_adv_start(),所以什么时候广告模式将改变?
你能解释更多关于app_asynch_trm()的内容吗?
这个func还有以下代码:
开关(app_advertise_mode)
{
案例GAPM_ADV_NON_CONN:
app_advertise_mode = GAPM_ADV_UNDIRECT;
打破;
案例GAPM_ADV_UNDIRECT:
app_advertise_mode = GAPM_ADV_NON_CONN;
打破;
}
我需要添加到按钮,以改变广告模式。
计时器立即被触发,然后我设置了一个标志,
在下面,工作良好,为什么?
app_adv_undirect_complete
{
如果(国旗){
set_timer ();
国旗= false;
}
在计时器处理程序中,我清除了另一个计时器,不好,
设置另一个像上面这样的标志,我成功地清除了计时器,为什么?
谢谢,
安东尼
嗨,安东尼,
您可以在da14580_config.h中定义您的设备将以可连接方式工作,检查您正在使用的开发工具包并定义CFG_CONNECTABLE_ADV_MODE在那里。如果定义了CFG_CONNECTABLE_ADV_MODE,则不需要一个按钮来更改为可连接模式,设备将在可连接模式和非可连接模式之间旋转。如果它没有定义,那么你必须使用一个按钮来改变adv模式(有一个定义)。我假设您正在使用sleep,当设备唤醒时,引脚返回到peripher_init()函数命令....的状态如果你想保持按钮点亮,你必须放置一个变量,将记住你的LED以前的状态,并设置相应的值,每次你的da醒来。在app_asynch_trm中,如果定义了正如我提到的,CFG_CONNECTABLE_ADV_MODE非连接模式和可连接模式之间的设备周期。设备再次开始发布,因为app_adv_undirect_complete()是由app_adv_stop()发出的检查app_task.c case GAPM_ADV_UNDIRECT;GAPM_ADV_NON_CONN。如果你试图从外部中断设置定时器,请建议在app_button_press_cb()函数的SmartTag参考设计,并检查这也是FAQhttp://support.dialog-semiconductor.com/faq-page#n1508.
由于MT_dialog
嗨MT_dialog
调用app_timer_set(APP_RESTART_ADV_TIMER, TASK_APP, timer_ticks)重启adv,
这是定期做广告的方法吗?
我设置了一个断点在这个func,似乎这个函数没有被调用,但app_adv_stop()将做。
它是由app_adv_stop()发出的",
现在我需要在一个数组中存储10个不同的adv数据,并发布数组[0],然后数组[1]…
每个是32字节。
我认为添加代码到app_adv_undirect_complete()是一个不错的选择,
我可以单独设置adv间隔,并在APP_RESTART_ADV_TIMER处理程序中更改adv数据。
那么如何让app_adv_undirect_complete()在每个广告之后被调用?
这是可能的还是其他更好的解决方案?
谢谢,
安东尼
嗨,安东尼,
app_adv_undirect()在adv_stop()完成后立即执行,并设置计时器,以便再次开始广告,刚刚测试,请在if语句上设置断点。是的,当广告停止时,您可以更改广告数据。每次停止广告时都会调用app_adv_undirect_complete。
由于MT_dialog
嗨MT_dialog
app_restart_adv_timer_handler:
app_adv_start ();
app_adv_stop ();//我可以在这里添加这个调用app_adv_undirect_complete吗?
返回(KE_MSG_CONSUMED);
我应该什么时候调用app_adv_stop()?
谢谢,
安东尼
嗨antony42,
当da靴子你可以开始宣传和启动一个计时器,当计时器过后你可以叫app_adv_stop(),当广告停止,app_adv_undirect_complete将执行(这个函数执行后调用app_adv_stop是否广告或间接融化non-connectable),然后你可以叫app_adv_start ();你可以在app_adv_func()中改变你的广告字符串,如果你喜欢广告字符串被填充的地方。
由于MT_dialog
嗨MT_dialog,
谢谢你的回复,我会试试看。
当我调用app_adv_start()时,广告开始,不是一次,它是连续的,
谢谢,
安东尼
嗨,安东尼,
广告过程是连续的,意思是,如果你不发送取消命令,广告将继续。如果你想在3个广告字符串之间旋转,你可以在广告功能中进行切换,检查当前的广告模式并切换到下一个模式(每个模式加载不同的广告字符串)。当设置了发布字符串时,还将设置一个定时器,该定时器指定设备将在特定模式下发布多长时间。当时间过了,改变广告模式,调用app_adv_stop当你收到广告停止的信号时,重新开始广告。
由于MT_dialog
嗨MT_dialog,
非常感谢!
它现在正在工作。
在app_adv_undirect_complete ()
{
app_set_timer (x, y);
app_adv_start ();
}
在定时器处理程序()
{
app_adv_stop ();
}
我将计时器设置为与反向间隔相同的值(100ms),
从嗅探器我可以看到,每个广告数据只广告一次!
谢谢,
安东尼
嗨MT_dialog,
谢谢你的回复。
现在它工作得很好,我在button_press_callback()中设置了标志,在app_adv_undirect_complete()中设置/clear计时器。
我还发现了两个古老但有用的话题:
http://support.dialog-semiconductor.com/ketimerset-not-executewhy
http://support.dialog-semiconductor.com/problem-about-wakeup-timer-inter..。
顺便说一下,如果我使用ext sleep,就不需要使用__attribute__((section("retention_mem_area0"),zero_init)
这是正确的吗?
谢谢,
安东尼
你好,
这是正确的。在扩展睡眠中,RAM中的所有数据,包括全局变量,都被保留。