256KB数据传输通过BLE, DA14681

了解更多常见问题教程

8个帖子/ 0个新
最后发表
mahmed106
离线
最后看到:2周4天前
加入:2019-05-03所
256KB数据传输通过BLE, DA14681

嗨对话框

我们正在开发一个基于DA14681的定制板。在我们的应用程序中,正常的场景是设备记录温度并将其存储在eeprom中。几天后,当用户将设备连接到BLE应用程序时,所有离线数据都会传输到手机上。

我们的eeprom大小是256KB,数据包大小是10字节,所以我们需要发送25600个数据包,现在我们正在通过BLE服务传输数据。

下面是流程:

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

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

DA14681返回被请求的数据字节。

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

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

我的问题是,有没有快速的方法? ?因为256kb的数据不会太大,不能在几个小时内发送。我遗漏了一些东西…

设备:
PM_Dialog
离线
最后看到:24分钟38秒前
工作人员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

您能分享一下您正在使用的代码片段,以便通过BLE传输数据吗?我假设您正在使用BLE通知或指示。

谢谢,PM_Dialog

mahmed106
离线
最后看到:2周4天前
加入:2019-05-03所
我用的是读请求

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

这是代码

静态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->temperature_count_h)
{
//get_sf_temp_num_records_device();

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

//我们是小端,可以直接从uint16_t写入
# # # # # # # # # # # # # # # # # # #
sizeof (ccc_val) &ccc_val);

否则if (evt->handle == sftemps->温度数据)
{
// uint32_t ccc_val = rand()%100;//get_sf_temp_records_device();

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

//我们是小端,可以直接从uint16_t写入

if(ReadPacketNumber==0) //第一个报头//添加重启但flash中数据的例外
{
/ / ReadPacketNumFromFlash = read_packetNumbers_from_Flash ();
// printf("PN %d",ReadPacketNumFromFlash);
#如果NoFlashDummyCode
R_PTR_PacketNumber = 50;//rand()%100;
M24ElapsedTime = R_PTR_PacketNumber*3;
memset (0 x00 LoggingPacket, sizeof (LoggingPacket));
LoggingPacket [0] = 0 xcd;
LoggingPacket [1] = 0 x11;
LoggingPacket [2] = 0 x12;
logingpacket [3]=M24ElapsedTime >> 24;
logingpacket [4]=M24ElapsedTime >> 16;
logingpacket [5]=M24ElapsedTime >> 8;
LoggingPacket[6]=M24ElapsedTime & 0xFF;
LoggingPacket [7] = R_PTR_PacketNumber > > 8;
LoggingPacket [8] = R_PTR_PacketNumber&0xFF;
LoggingPacket [9] = LoggingPacket [0];
= 1 (int;通过< 9;+ +)
{
LoggingPacket [9] ^ = LoggingPacket[的];

//读取下一次迭代的下一个数据包
R_PTR_ChipNo = 1;//选择芯片1,因为它是开始
R_PTR_ReadAddress = 0;//0xF9C9;//从芯片0和地址0开始
其他#
R_PTR_PacketNumber = read_packetNumbers_from_M24Flash();
M24ElapsedTime = readelapsedtimefrommm24flash ();
memset (0 x00 LoggingPacket, sizeof (LoggingPacket));
LoggingPacket [0] = 0 xcd;
LoggingPacket [1] = 0 x11;
LoggingPacket [2] = 0 x12;
logingpacket [3]=M24ElapsedTime >> 24;
logingpacket [4]=M24ElapsedTime >> 16;
logingpacket [5]=M24ElapsedTime >> 8;
LoggingPacket[6]=M24ElapsedTime & 0xFF;
LoggingPacket [7] = R_PTR_PacketNumber > > 8;
LoggingPacket [8] = R_PTR_PacketNumber&0xFF;
LoggingPacket [9] = LoggingPacket [0];
= 1 (int;通过< 9;+ +)
{
LoggingPacket [9] ^ = LoggingPacket[的];

//读取下一次迭代的下一个数据包
R_PTR_ChipNo = 1;//选择芯片1,因为它是开始
R_PTR_ReadAddress = 0;//0xF9C9;//从芯片0和地址0开始
# endif

如果1号
else if(ReadPacketNumber>0 && (ReadPacketNumber{
#如果NoFlashDummyCode
Dummy_R_PTR_PacketNumber = ReadPacketNumber;
Dummy_M24ElapsedTime = Dummy_R_PTR_PacketNumber * 3;
memset (0 x00 LoggingPacket, sizeof (LoggingPacket));
LoggingPacket [0] = 0 xcd;
LoggingPacket [1] = 0 x12;
LoggingPacket [2] = 0 * 13;
memset (0 x00 M24CurrentPacket, sizeof (M24CurrentPacket));
LoggingPacket [3] = 0;
LoggingPacket [4] = Dummy_R_PTR_PacketNumber + +;
logggingpacket [5]=Dummy_M24ElapsedTime >> 24;
logggingpacket [6]=Dummy_M24ElapsedTime >> 16;
logingpacket [7]=Dummy_M24ElapsedTime >> 8;
LoggingPacket [8] = Dummy_M24ElapsedTime;
LoggingPacket [9] = rand () % 60;
LoggingPacket [10] = rand () % 9;
LoggingPacket [11] = LoggingPacket [0];
= 1 (int;通过< 11;+ +)
{
LoggingPacket [11] ^ = LoggingPacket[的];

//读取下一次迭代的下一个数据包
其他#
memset (0 x00 LoggingPacket, sizeof (LoggingPacket));
LoggingPacket [0] = 0 xcd;
LoggingPacket [1] = 0 x12;
LoggingPacket [2] = 0 * 13;
memset (0 x00 M24CurrentPacket, sizeof (M24CurrentPacket));
// printf("CN %d - Add %d",R_PTR_ChipNo,R_PTR_ReadAddress);
/ /。fflush (stdout);
SequentialReadM24Flash(((R_PTR_ReadAddress & 0xFF00)>>8),(R_PTR_ReadAddress),8,R_PTR_ChipNo);
R_PTR_ReadAddress + = 8;
(uint8_t TempBuffFill = 3; TempBuffFill < 11; TempBuffFill + +)
{
LoggingPacket[TempBuffFill] = M24CurrentPacket[TempBuffFill-3];
// LoggingPacket[TempBuffFill] = 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];
= 1 (int;通过< 11;+ +)
{
LoggingPacket [11] ^ = LoggingPacket[的];

//读取下一次迭代的下一个数据包
if(R_PTR_ReadAddress>=0xF9F6 && R_PTR_ChipNo<4) // 0xF9F6是最后一个64k的地址/15 = 4266
{
R_PTR_ChipNo + +;
R_PTR_ReadAddress = 0;

# endif

else if(ReadPacketNumber>R_PTR_PacketNumber)//页脚
{
#如果NoFlashDummyCode
memset (0 x00 LoggingPacket, sizeof (LoggingPacket));
LoggingPacket [0] = 0 xcd;
LoggingPacket [1] = 0 * 13;
LoggingPacket [2] = 0 x14;
LoggingPacket [3] = 0 xda;
ReadPacketNumber = 0;
LoggingStatus = LoggingStopped;
其他#
memset (0 x00 LoggingPacket, sizeof (LoggingPacket));
LoggingPacket [0] = 0 xcd;
LoggingPacket [1] = 0 * 13;
LoggingPacket [2] = 0 x14;
LoggingPacket [3] = 0 xda;
如果(PassCodeVerification = = 1)
{
M24FlashPacketNumber = 0;
ResetPacketNumberInM24Flash();//注意高速读取应用程序可能会抢占它
LoggingStatus = LoggingStopped;
FLASH_FULL = 0;
ResetElaspedTimeInM24Flash();//注意从应用程序高速读取可能会抢占它
M24ElapsedTime = 0;
PauseElapsedTimeCounting = ET_PAUSE;
ResetChipNoInM24Flash();//注意,高速读取应用程序可能会抢占它

ReadPacketNumber = 0;

/ / FlashPacketNumber = 1;
/ / Elapsed_Time = 0;
# endif

# endif
# # # # # # # # # # # # # # # # # # #
sizeof (LoggingPacket) &LoggingPacket);
#如果ENABLE_UART_PRINTF
printf (" FLSH-RD % d % d \ n”,ReadPacketNumber, R_PTR_PacketNumber);
# endif

其他的
{

bl_gatts_read_cfm (evt->conn_idx, evt->handle, att_error_read_not_allowed, 0,
零);

应用程序不断发出读请求,DA14681发送数据作为响应。

我也尝试过通知方法,它比上面的方法更好,但也花了很多时间。我想知道使用DA14681通过表发送大块数据的推荐方法

PM_Dialog
离线
最后看到:24分钟38秒前
工作人员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

谢谢你的回复。让我查一下,然后给你回电话

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:24分钟38秒前
工作人员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

设备在连接间隔期间可以发送的数据量与中央允许外设发送的数据包数量密切相关。要做到这一点,你能检查一下当有一个数据交易时,交换了多少个数据包吗?是否有可能使用BLE嗅探工具,以便我们可以了解在事务期间空中发生的事情?在第一次读取请求后是否启用了通知?

请注意,根据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
离线
最后看到:2周4天前
加入:2019-05-03所
感谢您的详细回复

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

1 - 750ms是连接间隔

2 -从机延迟为0

3 -中环是一部智能手机

mahmed106
离线
最后看到:2周4天前
加入:2019-05-03所
这意味着i化简

这意味着如果我把连接间隔减少到7ms,我的吞吐量会增加吗?

PM_Dialog
离线
最后看到:24分钟38秒前
工作人员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

是的,请尝试使用小于750毫秒的连接间隔,并通过通知发送数据。根据BLE规范,连接间隔应该在7.5ms (Conn_Interval_Min)到5sec (Conn_Interval_Max)之间。

谢谢,PM_Dialog