メジャー フィールドとマイナー フィールドでタイム スタンプを送信する 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 桁の HEX) を抽出するふりをしているためです。char * バッファーを使用して char 文字列を使用しようとしましたが、後でデータを char から uint8_t に渡すのが難しいことがわかりました。
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;
}
}
はい、メジャーとマイナーが 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 つの完全なパケット (32*4 = AES で暗号化された 128 ビット) を送信したいと考えています。しかし、最初に、テストするためにタイムスタンプを送信する必要があります。それで、それらをバイトに変換する方法を知るための例またはスニペットはありますか? しかし、最後に uint8_t は必要ないのでしょうか? ファームウェアをアップロードしてもデバイスが動作しないため、間違ったタイプのデータが原因であるに違いないと推測します