嗨对话框
我们正在使用基于DA14681的自定义板。在我们的应用程序中,正常的Scnerio是设备记录温度并将其存储在EEPROM中。在用户使用BLE应用程序连接设备后几天后。所有脱机数据都被转移到手机。
我们的EEPROM大小为256KB,数据包大小为10字节,因此我们需要发送25600个数据包,现在我们通过BLE服务传输数据。
这是流程:
1 - 移动应用程序与设备连接。
2 - 移动应用请求读取特定服务的读取特性。
3 - DA14681返回请求的数据字节。
因此,移动应用程序不断使读取请求和固件发送值。
在这种方法中,数据传输的速度非常慢。每秒大概2个数据包,这意味着将所有数据包发送到移动应用程序需要3.5小时。
我的问题是,有什么快速的方法来做到吗?因为256 kb的数据在几小时内没有太大。我在这里缺少一些东西..
关键词:
设备:
嗨mahmed106,
请您可以共享您使用的代码片段,以便通过BLE传输数据?我假设您正在使用BLE通知或迹象。
谢谢,PM_DIALOG.
我正在使用应用程序侧的读取请求来读取数据。
这是该代码
静态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上发送大块数据的方法
嗨mahmed106,
感谢您的答复。让我检查一下,我会回复你/
谢谢,PM_DIALOG.
嗨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,因为将修改设备配置,这将导致清除当前属性数据库(如果存在)。
一些纯粹的表现可能以下意义的几件事:
谢谢,PM_DIALOG.
谢谢你的详细回复。现在我明白了。根据您的问题,以下是答案:
1 - 750ms是连接间隔
2 - 从等待时间为0
3 - Central是一个智能手机
所以它意味着我将连接间隔减少到7ms,我的吞吐量会增加?
嗨mahmed106,
是的,请尝试使用比750ms更小的连接间隔并通过通知发送数据。根据BLE规范,连接间隔应为7.5ms(CONN_INTERVAL_MIN)到5SEC(CONN_INTERVAL_MAX)。
谢谢,PM_DIALOG.