我正在尝试更改iBeacon的广告,在主要和次要字段中发送时间戳。 在示例代码中,Major和Minor是一个uint8_t,所以为了得到日期,例如我使用它:
uint8_t getConcatTimestamp(){
time_t rawtime;
struct tm * timeinfo;
char *bufferyear;
char *buffermon;
char *bufferday;
char *bufferhour;
char *buffermin;
uint8_t segundos=0x10;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
bufferyear = (char *) malloc( sizeof(char) *4);
buffermon = (char *) malloc( sizeof(char) *4);
bufferday = (char *) malloc( sizeof(char) *4);
bufferhour = (char *) malloc( sizeof(char) *4);
buffermin = (char *) malloc( sizeof(char) *4);
strftime (bufferyear,4,"%y",timeinfo);
strftime (buffermon,4,"%m",timeinfo);
strftime (bufferday,4,"%d",timeinfo);
strftime (bufferhour,4,"%H",timeinfo);
strftime (buffermin,4,"%M",timeinfo);
segundos=(uint8_t)(timeinfo->tm_sec);
//segundos=0x10;
//return buffer;
return(segundos);
}
尽管使用segundos作为0x10它不起作用但我不知道为什么。但是想法是使用例如segundos =(uint8_t)(timeinfo-> tm_sec);因为我假装提取每个16位数据(0x00,2个十六进制数字)以在Major和Minor中使用它们。我尝试使用char *缓冲区使用char字符串,但我发现以后很难从char传递到uint8_t数据,也许更容易使用我可以从提供的结构中获取的int:
struct tm {
int tm_sec; /* seconds, range 0 to 59 */
int tm_min; /* minutes, range 0 to 59 */
int tm_hour; /* hours, range 0 to 23 */
int tm_mday; /* day of the month, range 1 to 31 */
int tm_mon; /* month, range 0 to 11 */
int tm_year; /* The number of years since 1900 */
int tm_wday; /* day of the week, range 0 to 6 */
int tm_yday; /* day in the year, range 0 to 365 */
int tm_isdst; /* daylight saving time */
};
在主要类中使用iBeacon进行广告的无限之处如下:
// Enter main loop.
for (;;)
{
seconds=getConcatTimestamp();
if(cont<2)
{
flash_db_t tmp;
tmp.data.major_value[0] = clbeacon_info[18] = 0x00;
tmp.data.major_value[1] = clbeacon_info[19] = 0x01;
tmp.data.minor_value[0] = clbeacon_info[20] = 0x00;
if(cont==0)
{
//tmp.data.minor_value[1] = clbeacon_info[21] = aesstruct.key[0];
tmp.data.minor_value[1] = clbeacon_info[21] = seconds;
}
else
{
tmp.data.minor_value[1] = clbeacon_info[21] = aesstruct.key[1];
}
err_code = pstorage_clear(&pstorage_block_id, sizeof(flash_db_t));
APP_ERROR_CHECK(err_code);
err_code = pstorage_store(&pstorage_block_id, (uint8_t *)&tmp, sizeof(flash_db_t), 0);
APP_ERROR_CHECK(err_code);
err_code = pstorage_access_wait();
APP_ERROR_CHECK(err_code);
advertising_init(beacon_mode_normal);
s_leds_bit_mask |= BEACON_MODE_LED_MSK;
//Solo esto estaba dentro del for(;;)
app_sched_execute();
power_manage();
cont++;
}
else
cont=0;
}
}
是的,我知道Major和Minor是16位,但是当这个iBeacon固件构建时,它使用一个带有2个字段的uint8_t数组,两个字段都有16位。这实际上或多或少是我使用的数据结构:
typedef struct
{
uint8_t magic_byte;
uint8_t beacon_uuid[16];
uint8_t major_value[2];
uint8_t minor_value[2];
uint8_t measured_rssi;
}flash_db_layout_t;
这就是为什么我需要数据en uint8_t。我想发送128位,4个包含Minor和Major的完整数据包(32 * 4 = 128位,用AES加密)。但首先我需要发送时间戳才能进行测试。那么,是否有任何示例或片段知道将它们变成字节?但我最终还是不需要uint8_t?因为当我上传固件时,设备无法正常工作,我想这一定是因为数据类型错误