使开发工具包板成为加密狗的问题

8个职位/0个新职位
最后一篇文章
文康
离线
最后一次见到:4年4个月前
已加入:2016-06-23 13:01
使开发工具包板成为加密狗的问题

嗨,对话,

我试图写一个固件,使开发工具包板(基本)的狗。
我已经写了一个桌面软件,将通过串口与主板进行通信。
我希望当软件向板发送命令时,板能够做出相应的响应。e、 g.扫描对等设备、连接到对等设备等。安装在板中的固件还可以发现它连接到的对等设备的服务和属性,并通过串行端口将这些报告给PC上的软件。它还可以从连接的对等设备接收通知数据,并再次向PC软件报告。
我读过DSPS的例子,但是它发现了对等设备,并通过设备名(在代码中预先给定)连接到给定的设备。你能帮我个忙,给我写一条指导方针吗?谢谢!

我试着修改user\u sps\u host.c中的代码,将user\u on\u adv\u report\u ind函数修改如下,还修改了user\u on\u scanning\u completed函数,目的是在获得5台设备时停止扫描。

void user\ on\ u adv\ u report\ u ind(struct gapm\ u adv\ u report\ u ind const*param)
{
//获取设备名称
uint8 i=0,j=0;
uint8 len=sizeof(参数->报表数据);
char dn[20]=“”;
对于(i=0;i报表.data[i]>=0x20&¶m->报表.data[i]<=0x7E)
{
dn[j++]=参数->报表数据[i];
}
}
//获取设备地址
len=sizeof(参数->report.adv\u addr.addr);
char add_buffer[13]=“”;
j=0;
对于(i=0;i报告高级地址[len-i-1]);
添加缓冲区[j]=缓冲区[0];
加上_buffer[j+1]=buffer[1];
j=j+2;
}
//获取RSSI
字符rssi[3];
sprintf(rssi,“%d”,param->report.rssi);
//形成通过UART2发送到PC的数据包
字符包[44];
j=0;
数据包[j++]='*';
packet[j++]='D';
packet[j++]=“N';
数据包[j++]=':';
对于(i=0;i<20;i++)
{
如果(dn[i]!=0x00)
{
数据包[j++]=dn[i];
}
}
数据包[j++]=',';
对于(i=0;i<13;i++)
{
如果(添加缓冲区[i]!=0x00)
{
packet[j++]=添加缓冲区[i];
}
}
数据包[j++]=',';
对于(i=0;i<3;i++)
{
如果(添加缓冲区[i]!=0x00)
{
packet[j++]=添加缓冲区[i];
}
}
packet[j++]='\r';
packet[j++]='\n';
//将数据包发送到PC
打印字符串(数据包);

}

无效用户\u on \u扫描\u完成(uint8\t状态)
{
设备计数++;
如果(设备计数<=5)
{
用户_scan_start();
}
其他的
{
用户_wait_for_cmd();
}
返回;
}

在这里,我添加了一个名为user \u wait \u for \u cmd()的函数,用于读取命令,实现如下,uart2 read completed回调用于调用user \u wait \u for \u cmd()。但是,程序出现了一个JLINK错误,即在CPU运行时不能读取寄存器。这个实现的问题是什么?

void user \u wait \u for \u cmd(void)
{
uint8读取长度=25;
而(!阅读(成功)
{
uart2\u read((uint8\u t*)缓冲区,读取长度,uart2\u read\u completion\u cb);
}
}

博尔阅读成功;
无效uart2\读取\完成\ cb(uint8\ t状态)
{
if(buffer[0]=='C'&&buffer[1]=='M'&&buffer[2]=='D')
{
read_success=真;
打印字符串(缓冲区);
}
其他的
{
read_success=false;
用户_wait_for_cmd();
}
}

顺便问一下,在哪里可以买到DA14580的加密狗?

关键词:
设备:
MT\u对话框
离线
最后一次见到:2个月2周前
工作人员
已加入:2015-06-08 11:34
你好,文康,

你好,文康,

据我所知,它与专业开发工具包,我不认为是单独出售。关于您粘贴的代码的一些注释,我可以看到您正在计算在调用user \u on \u scanning \u completed()时发现的设备,这意味着您正在计算设备的扫描周期,每个扫描周期都会持续几秒钟,当您取消扫描过程或扫描操作完成时,会调用用户\u on \u scanning \u complete。每次设备获取新的广告字符串时,广告消息都会作为指示发送给用户\u adv\u report \u ind()。因此,为了计算扫描的设备数,您必须检查当前广告字符串的bd地址,并检查日志中的条目(保存记录设备的位置),然后在日志中放置新条目时进行计数。关于在应用代码进行读取时遇到的错误,我不认为是您的实现造成的,请检查设备的默认睡眠模式,并确保禁用了睡眠模式(不能同时启用和调试睡眠模式)。此外,您还必须考虑这样一个事实,即580休眠时,所有外围设备(包括UART)都断电,例如,DSP使用a流控制方案,以便在允许或不允许发送数据时向外部MCU发送信号,因为如果在580休眠时发送数据,它们将丢失。

谢谢你的对话

文康
离线
最后一次见到:4年4个月前
已加入:2016-06-23 13:01
谢谢,但是我的目标不是

谢谢,先生,

关于这个话题我有更多的问题,因为我的目标不仅仅是计算附近的设备。

一号。在da1458x_config_basic.h中,睡眠模式已配置为激活:

#未定义CFG\u MEM\u MAP\u EXT\u SLEEP
#undef CFG\u MEM\u MAP\u DEEP\u睡眠

然后我向DB发送了一个扫描命令(CMD\u SCAN),固件调用了用户\u SCAN\u start(),并将函数运行到底。但是,在那之后,没有触发用户在报告上的用户,而且,当我发送连接命令(CMD\u CONNECT)时,程序名为user\u CONNECT\u to,但是用户在报告上的用户扫描完成,用户在连接上的用户没有触发。。。所以在这种情况下,我的实现有什么问题。

我修改了uart2\u read\u completion\u cb函数如下
字符缓冲区[25];
静态uint8\u t uart2\u read\u in\u progress=0;

无效uart2\读取\完成\ cb(uint8\ t状态)
{
if(buffer[0]=='C'&&buffer[1]=='M'&&buffer[2]=='D')
{
uart2\u read\u in\u progress=0;
打印字符串(缓冲区);
对命令()执行操作;
}
其他的
{
用户_wait_for_cmd();
}
}

void user \u wait \u for \u cmd(void)
{
uint8读取长度=25;
uart2\u read\u in\u progress=1;
uart2\u read((uint8\u t*)缓冲区,读取长度,uart2\u read\u completion\u cb);
while(uart2读取进行中);
}
对接收到的命令的操作如下
void action \u on \u命令(void)
{
char cmdid[]={buffer[4],buffer[5]};
uint8 CMD\u ID=(uint8)strtol(cmdid,NULL,16);
uint8 hexdata[16]={0};
uint8 i=7;
而((缓冲区[i]='\\'&&buffer[i+1]=='r'))
{
hexdata[i-7]=缓冲区[i];
i++;
}
开关(CMD\u ID)
{
case CMD\u扫描:
{
//0x00个
用户_scan_start();
中断;
}
case CMD\u连接:
{
//0x01型
uint8对等地址[6]={0x00};
对于(i=0;i<6;i++)
{
char temp[]={hexdata[2*i],hexdata[2*i+1]};
uint8 part\u add=(uint8)strtol(temp,NULL,16);
对等地址[5-i]=部分地址;
}
用户连接到(0x00,对等地址);
中断;
}
}
}
连接到的用户如下
void user\u connect\u to(uint8\u t peer\u addr\u type,uint8\u t*peer\u addr)
{
app_easy_gap_start_connection_to_set(peer_addr_type,peer_addr,MS_to_DOUBLESLOTS(USER_CON_INTV));
app_easy_gap_start_connection_to();
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二。然后我想到了另一个主意。也就是说,即使我解决了上述问题,它仍然不能令人满意。因为我希望DA14580至少可以异步处理两个任务,也就是说,它一直监视PC发送的命令(DA14580应该一直监视PC发送的命令),同时做其他事情。
例如,它监视来自PC的命令,同时接收连接的外围设备发送的通知数据,并将数据发送到PC。
另一个示例:当DB接收到通知数据时,我向DB发送stop notifying命令。DB应停止上传接收到的通知数据,并向所连接的外围设备发送停止通知命令,所连接的外围设备将相应地动作。
为此,如果我想使用DSPS项目,我应该怎么做?问题是集中在中心端(加密狗),外围端的任务已经完成^_^

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第三。由于加密狗不是单独出售的,你能推荐一个适合DA14580的吗?连接蓝色?

谢谢!

MT\u对话框
离线
最后一次见到:2个月2周前
工作人员
已加入:2015-06-08 11:34
你好,文康,

你好,文康,

NO1:您更改的定义会影响设备的内存映射,而不会影响睡眠模式(在上面的“睡眠模式内存映射配置”注释中提到),要更改默认睡眠模式,您必须在关闭ARCH\u Sleep\u的情况下更改user\u config.h文件中的app\u default\u Sleep\u mode,这就是JLink在调试模式下几秒钟后报告错误的原因。关于没有触发用户\u在\u adv \u report \u ind上的事实(我假设您正试图通过使用断点捕捉广告指示),如果新的扫描过程已经启动,你将无法通过断点捕捉广告事件,因为你的调试器已经从你的580上卸载。请检查以上内容,如果你确实禁用了睡眠,并且在UART发送相应命令时调用了正确的函数,请检查广告设备是否正常实际上是广告,可以接受连接。

NO3:dialog提供的加密狗不是一个通用的加密狗,您可以连接到windows机器并被识别为蓝牙模块,它只是一个带有ATMEL微控制器的580,用作USB端口的桥接器,并且只接受GTL(一种专用协议)上的UART命令。我怀疑一个通用的BLE模块是你想要的,虽然我不能提出一个建议,我想任何支持4.0规范的BLE加密狗都可以,但是在我们的大多数应用程序(测试)中,我们使用的是android手机。雷竞技安卓下载

NO2:DSPS示例监视UART并服务于DSPS\u任务(从中心发送通知和接受写命令)。当UART中的数据可用时,会发生中断,执行ISR,代码负责UART的FIFO并正确处理数据,它不会轮询UART以将此视为附加任务。您可以以这个实现为例进行研究。

谢谢你的对话

文康
离线
最后一次见到:4年4个月前
已加入:2016-06-23 13:01
谢谢你,MT

谢谢你,MT

至于NO2,您提到的ISR是UART2.c中的UART2\u Handler(void),接收数据的DSPS\u任务是UART2\u rec\u data\u avail\u ISR吗?如果是的话,我应该把我定义的操作放在哪里?你的意思是我应该直接修改uart2\u rec\u data\u avail\u isr吗?

你能详细解释一下DSPS\u任务吗?

非常感谢你!

文康
离线
最后一次见到:4年4个月前
已加入:2016-06-23 13:01
当我读到

当我通读代码时,我发现uart2_env.rx.callback是在uart2_read中分配的,当接收到可用时,uart2_rec_data_avail_isr()被执行,并且定义的回调被执行。然后在uart2\u rec\u data\u avail\u isr()中,回调指针将被清除。如果我的理解是对的?如果是这样,是否意味着我需要调用uart2\u read来接收命令,而不是在PC上发送命令并调用操作\u on \u command()?

MT\u对话框
离线
最后一次见到:2个月2周前
工作人员
已加入:2015-06-08 11:34
你好,文康,

你好,文康,

dsp和实现的去bugging机制使用不同的UART(580中有两个相同UART模块的实例),因此每个UART都有单独的ISR处理程序。如何处理中断和数据取决于应用程序和实现方式。关于DSPS_任务(更确切地说是TASK_SPS_SERVER)是DSPS设备的配置文件任务,您可以在UM-B-038串行端口服务应用程序文档中找到更多信息。

是的,您的理解是正确的,当uart2得到您标记的数据后,回调将被清除,您只需调用uart2\u read()继续做您正在做的事情,当您的UART中有数据时,中断将继续发生,当您设置的数据大小达到时,您的回调(您在调用uart read时设置的回调)将被调用,并通知您指定的数据已经到达,uart中断将被禁用。这意味着,如果命令具有指定的大小,则可以在等待命令时设置每个命令的大小,也可以指定一种命令格式,将第一个字节读取为命令大小(将一个字节读取为大小),然后根据该特定的大小命令设置回调,或者您可以一直只等待一个字节,然后等待命令的一个终端字符(表示命令已结束),有很多种方法可以实现,但正如我上面提到的,这取决于您希望实现的方式。

谢谢你的对话

文康
离线
最后一次见到:4年4个月前
已加入:2016-06-23 13:01
谢谢,先生,

谢谢,先生,

所以为了监视UART,我必须经常调用uart2_read(),我对数据包大小的解决方案是,我使用一个固定长度的数据包(如代码中所示为25),并且命令将被预处理,使其长度始终为25(在数据包的末尾加0,使其长度为25)。我正在努力完成中心任务。