256KB数据传输通过BLE,DA14681

了解更多常见问题解答教程

8个帖子/ 0新
最后一篇
Mahmed106.
离线
最后一次露面:1个月1周前
加入:2019-05-03 17:28
256KB数据传输通过BLE,DA14681

嗨对话框

我们正在使用基于DA14681的自定义板。在我们的应用程序中,正常的Scnerio是设备记录温度并将其存储在EEPROM中。在用户使用BLE应用程序连接设备后几天后。所有脱机数据都被转移到手机。

我们的EEPROM大小为256KB,数据包大小为10字节,因此我们需要发送25600个数据包,现在我们通过BLE服务传输数据。

这是流程:

1 - 移动应用程序与设备连接。

2 - 移动应用请求读取特定服务的读取特性。

3 - DA14681返回请求的数据字节。

因此,移动应用程序不断使读取请求和固件发送值。

在这种方法中,数据传输的速度非常慢。每秒大概2个数据包,这意味着将所有数据包发送到移动应用程序需要3.5小时。

我的问题是,有什么快速的方法来做到吗?因为256 kb的数据在几小时内没有太大。我在这里缺少一些东西..

设备:
PM_DIALOG.
离线
最后一次露面:1小时18分钟前
职员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

请您可以共享您使用的代码片段,以便通过BLE传输数据?我假设您正在使用BLE通知或迹象。

谢谢,PM_DIALOG.

Mahmed106.
离线
最后一次露面:1个月1周前
加入:2019-05-03 17:28
我正在使用读取请求

我正在使用应用程序侧的读取请求来读取数据。

这是该代码

静态void handle_read_req(ble_service_t * svc,const ble_evt_gatts_read_req_t * evt){
sftemps_service_t * sftemps =(sftemps_service_t *)svc;

if(evt-> handle == sftemps-> purlature_count_h)
{
uint16_t ccc_val = rand()%100; // get_sf_temp_num_records_device();

// ble_storage_get_u16(evt-> conn_idx,bcs-> bcs_ccc_h,&ccc_val);

//我们很少 - endian,好的,直接从uint16_t写
ble_gatts_read_cfm(EVT-> CONN_IDX,EVT->句柄,ATT_ERROR_OK,
sizeof(ccc_val),&ccc_val);
}
否则if(evt-> handle == sftemps-> wheremer_data_h)
{
// uint32_t ccc_val = rand()%100; // get_sf_temp_records_device();

// ble_storage_get_u16(evt-> conn_idx,bcs-> bcs_ccc_h,&ccc_val);

//我们很少 - endian,好的,直接从uint16_t写

if(readpacketnumber == 0)//第1包标题//添加重启异常但闪存中的数据
{
// readpacketnumfromflash = read_packetnumbers_from_flash();
// printf(“pn%d”,ReadPacketNumfromFlash);
#if noflashdummycode.
r_ptr_packetnumber = 50; // rand()%100;
m24elapsedtime = r_ptr_packetnumber * 3;
Memset(LoggingPacket,0x00,sizeof(logingpacket));
loggingpacket [0] = 0xcd;
loggingpacket [1] = 0x11;
loggingpacket [2] = 0x12;
loggingpacket [3] = M24 elapsedtime >> 24;
loggingpacket [4] = M24 elapeTime >> 16;
loggingpacket [5] = m24 elapsedtime >> 8;
loggingpacket [6] = m24elapsedtime&0xff;
loggingpacket [7] = r_ptr_packetnumber >> 8;
loggingpacket [8] = r_ptr_packetnumber&0xff;
loggingpacket [9] = loggingpacket [0];
for(int by = 1; by <9; by ++)
{
loggingpacket [9] ^ = loggingpacket [by];
}
ReadPacketNumber ++; //在下次迭代中读取下一个数据包
r_ptr_chipno = 1;//选择芯片一个,因为它是开始
r_ptr_readaddress = 0; // 0xF9C9;//从芯片0开始和地址0
#别的
r_ptr_packetnumber = read_packetnumbers_from_m24flash();
m24elapsedtime = Readelapsedtimefromm24Flash();
Memset(LoggingPacket,0x00,sizeof(logingpacket));
loggingpacket [0] = 0xcd;
loggingpacket [1] = 0x11;
loggingpacket [2] = 0x12;
loggingpacket [3] = M24 elapsedtime >> 24;
loggingpacket [4] = M24 elapeTime >> 16;
loggingpacket [5] = m24 elapsedtime >> 8;
loggingpacket [6] = m24elapsedtime&0xff;
loggingpacket [7] = r_ptr_packetnumber >> 8;
loggingpacket [8] = r_ptr_packetnumber&0xff;
loggingpacket [9] = loggingpacket [0];
for(int by = 1; by <9; by ++)
{
loggingpacket [9] ^ = loggingpacket [by];
}
ReadPacketNumber ++; //在下次迭代中读取下一个数据包
r_ptr_chipno = 1;//选择芯片一个,因为它是开始
r_ptr_readaddress = 0; // 0xF9C9;//从芯片0开始和地址0
#万一
}
#if 1
否则if(ReadPacketNumber> 0 &&(ReadPacketNumber {
#if noflashdummycode.
dummy_r_ptr_packetnumber = ReadPacketNumber;
dummy_m24elapsedtime = dummy_r_ptr_packetnumber * 3;
Memset(LoggingPacket,0x00,sizeof(logingpacket));
loggingpacket [0] = 0xcd;
loggingpacket [1] = 0x12;
loggingpacket [2] = 0x13;
MEMSET(M24CurrentPacket,0x00,Sizeof(M24CurrentPacket));
loggingpacket [3] = 0;
loggingpacket [4] = dummy_r_ptr_packetnumber ++;
loggingpacket [5] = dummy_m24elapsedtime >> 24;
loggingpacket [6] = dummy_m24elapsedtime >> 16;
loggingpacket [7] = dummy_m24 elaptime >> 8;
loggingpacket [8] = dummy_m24elapedtime;
loggingpacket [9] = rand()%60;
loggingpacket [10] = rand()%9;
loggingpacket [11] = loggingpacket [0];
for(int by = 1; by <11; by ++)
{
loggingpacket [11] ^ = loggingpacket [by];
}
ReadPacketNumber ++; //在下次迭代中读取下一个数据包
#别的
Memset(LoggingPacket,0x00,sizeof(logingpacket));
loggingpacket [0] = 0xcd;
loggingpacket [1] = 0x12;
loggingpacket [2] = 0x13;
MEMSET(M24CurrentPacket,0x00,Sizeof(M24CurrentPacket));
// printf(“cn%d - 添加%d”,r_ptr_chipno,r_ptr_readaddress);
// fflush(stdout);
SequentialReadM24FLASH(((r_ptreadaddress&0xff00)>> 8),(r_ptr_readddress),8,r_ptr_chipno);
r_ptr_readaddress + = 8;
for(Uint8_t tempbufffill = 3; tempbufffille <11; tempbufffille ++)
{
loggingpacket [tempbufffille] = m24currentpacket [tempbufffill-3];
// loggingpacket [tempbufffille] = m24_i2c_ad_read((r_ptr_readaddress&0xff),(r_ptr_readaddress&0xff00),r_ptr_chipno);
// printf(“\ n%d”,r_ptr_readaddress);
// r_ptr_readaddress ++;
}
// readpacketnumber =(loggingpacket [3] * 10)+ loggingpacket [4];//如果数据包编号写入和读取索引之间存在不匹配
loggingpacket [11] = loggingpacket [0];
for(int by = 1; by <11; by ++)
{
loggingpacket [11] ^ = loggingpacket [by];
}
ReadPacketNumber ++; //在下次迭代中读取下一个数据包
if(r_ptr_readaddress> = 0xf9f6 && r_ptr_chipno <4)// 0xf9f6是最后64k / 15 = 4266的地址
{
r_ptr_chipno ++;
r_ptr_readaddress = 0;
}
#万一
}
否则if(readpacketnumber> r_ptr_packetnumber)//页脚
{
#if noflashdummycode.
Memset(LoggingPacket,0x00,sizeof(logingpacket));
loggingpacket [0] = 0xcd;
loggingpacket [1] = 0x13;
loggingpacket [2] = 0x14;
loggingpacket [3] = 0xDA;
ReadPacketNumber = 0;
loggingstatus = loggingstopped;
#别的
Memset(LoggingPacket,0x00,sizeof(logingpacket));
loggingpacket [0] = 0xcd;
loggingpacket [1] = 0x13;
loggingpacket [2] = 0x14;
loggingpacket [3] = 0xDA;
if(PassCodeVerification == 1)
{
m24flashpacketnumber = 0;
resetpacketnumberinm24flash(); //照顾从应用程序中读取的高速可以预防它
loggingstatus = loggingstopped;
flash_full = 0;
resetelaspedtimeinm24flash(); //按照从应用程序读取的高速读取可能会预先删除它
m24 elapsedtime = 0;
PauseLapaedTimecounting = et_pause;
Resetchipnoinm24Flash(); //按照从应用程序读取的高速读取可能会预防它
}
ReadPacketNumber = 0;

// flashpacketnumber = 1;
// Elapsed_time = 0;
#万一
}
#万一
ble_gatts_read_cfm(EVT-> CONN_IDX,EVT->句柄,ATT_ERROR_OK,
sizeof(loggingpacket)和loggingpacket);
#if enable_uart_printf.
printf(“Flsh-RD%d-%d \ n”,ReadPacketNumber,R_PTR_PacketNumber);
#万一
}
别的
{

BLE_GATTS_READ_CFM(EVT-> CONN_IDX,EVT->句柄,ATT_ERROR_READ_NOT_PERMITTED,0,
空值);
}

应用程序持续读取读取请求和DA14681以响应发送数据。

我还尝试了通知方法,它比上述方法更好,但也需要很多时间。我想知道使用DA14681在BLE上发送大块数据的方法

PM_DIALOG.
离线
最后一次露面:1小时18分钟前
职员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

感谢您的答复。让我检查一下,我会回复你/

谢谢,PM_DIALOG.

PM_DIALOG.
离线
最后一次露面:1小时18分钟前
职员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

在连接间隔期间,设备可以发送的数据量密切相关,密切依赖于中央允许外设发送的数据包数。要这样做,请检查数据事务时是否会在交换有多少数据包?是否有可能使用BLE Sniffer工具,以便我们可以了解交易期间在空中发生的情况?在第一个读取请求之后是否有通知使能?

请记住,根据BLE规范,可以在一个数据包中发送多达251个字节的一个数据包。收到/传输数据包的最大数据长度是多少?所以检查dg_configble_data_length_rx_max和dg_configble_data_length_tx_max宏。BLE_GAP_MTU_SIZE_SET()可用于设置适当的MTU_SIZE。请注意,应在属性数据库创建之前调用特定API,因为将修改设备配置,这将导致清除当前属性数据库(如果存在)。

一些纯粹的表现可能以下意义的几件事:

  • 连接间隔。可以使用的最低允许间隔为7.5ms。应用程序代码中使用的连接间隔是什么?中央可以设置连接间隔或外围设备可以请求具有特定的连接间隔,并且它可以接受或不接受(连接更新参数)。
  • 从延迟。你有什么表明这是什么?可以使用等于零(0)的最低延迟值。
  • 每个连接间隔的数据包数。这可能受到中央的限制并影响性能。什么是中央?它是另一个da14681还是智能手机?

谢谢,PM_DIALOG.

Mahmed106.
离线
最后一次露面:1个月1周前
加入:2019-05-03 17:28
谢谢你的详细回复

谢谢你的详细回复。现在我明白了。根据您的问题,以下是答案:

1 - 750ms是连接间隔

2 - 从等待时间为0

3 - Central是一个智能手机

Mahmed106.
离线
最后一次露面:1个月1周前
加入:2019-05-03 17:28
所以这意味着我减少了我的

所以它意味着我将连接间隔减少到7ms,我的吞吐量会增加?

PM_DIALOG.
离线
最后一次露面:1小时18分钟前
职员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

是的,请尝试使用比750ms更小的连接间隔并通过通知发送数据。根据BLE规范,连接间隔应为7.5ms(CONN_INTERVAL_MIN)到5SEC(CONN_INTERVAL_MAX)。

谢谢,PM_DIALOG.