iOS + nRF51822 = iBeacon?

У меня есть несколько датчиков nRF51822, и я хотел бы начать играть с настройкой iOS iBeacon. Проблемы, с которыми я сталкиваюсь, заключаются в том, чтобы сделать

- (id)initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier;

нужно знать датчики ProximityUUID. Глядя на документы CLBeacon, кажется, что это атрибут датчика только для чтения, но как/где я могу прочитать это из

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

и я вижу kCBAdvDataServiceUUID с одной строкой 2500, но я не думаю, что это все. У кого-нибудь есть направление или понимание?

Спасибо


person user2812463    schedule 24.09.2013    source источник
comment
Поговорите с сотрудниками KS Technologies: kstechnologies.com . Возможно, они захотят поделиться тем, как они заработали на nRF51822. Я видел это в действии от них, и, похоже, это работает хорошо, хотя это пока неопубликованный профиль.   -  person Brad Larson    schedule 02.10.2013
comment
Ответ здесь также может вас заинтересовать: stackoverflow.com/a/19040616/19679 . Исходя из этого, вы можете создать свой собственный рекламный пакет для устройств nRF51822.   -  person Brad Larson    schedule 02.10.2013


Ответы (3)


Устройства, которые вы создаете с датчиками nRF51822, будут сообщать о близости UUID через протокол iBeacon, который, насколько я понимаю, еще не опубликован. До тех пор самый простой способ поиграть — это использовать другое устройство iOS, которое сообщает о своем присутствии. Сам UUID определяется вы.

Эта статья дает довольно хороший обзор того, что вам нужно сделать.

person neilco    schedule 24.09.2013

Вам также может быть полезно просмотреть этот фрагмент кода, впервые опубликованный на Собственный сайт вопросов и ответов Nordic:

typedef __packed struct
{
    uint16_t unknown1;
    uint8_t uuid[16];
    uint16_t major;
    uint16_t minor;
    uint8_t unknown2;
} clbeacon_info_t;
...
static void advertising_init(void)
{
    uint32_t      err_code;
    uint8_t       flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;
    ble_advdata_t advdata;

    uint8_t uuid[16] = {0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0};

    clbeacon_info_t beacon_info;
    beacon_info.unknown1 = 0x1502;
    memcpy(&beacon_info.uuid, &uuid, sizeof(uuid));
    beacon_info.major = 0x3412;
    beacon_info.minor = 0x7798;
    beacon_info.unknown2 = 0xC5;

    ble_advdata_manuf_data_t manuf_specific_data;
    manuf_specific_data.company_identifier = 0x004C;
    manuf_specific_data.data.p_data        = (uint8_t *) &beacon_info;
    manuf_specific_data.data.size          = sizeof(beacon_info);

    // Build and set advertising data
    memset(&advdata, 0, sizeof(advdata));

    advdata.name_type               = BLE_ADVDATA_NO_NAME;
    advdata.flags.size              = sizeof(flags);
    advdata.flags.p_data            = &flags;
    advdata.p_manuf_specific_data   = &manuf_specific_data;

    err_code = ble_advdata_set(&advdata, NULL);
    APP_ERROR_CHECK(err_code);
}


/**@brief Start advertising.
 */
static void advertising_start(void)
{
    uint32_t             err_code;
    ble_gap_adv_params_t adv_params;

    // Start advertising
    memset(&adv_params, 0, sizeof(adv_params));

    adv_params.type        = BLE_GAP_ADV_TYPE_ADV_NONCONN_IND;
    adv_params.p_peer_addr = NULL;
    adv_params.fp          = BLE_GAP_ADV_FP_ANY;
    adv_params.interval    = APP_ADV_INTERVAL;
    adv_params.timeout     = APP_ADV_TIMEOUT_IN_SECONDS;

    err_code = sd_ble_gap_adv_start(&adv_params);
    APP_ERROR_CHECK(err_code);
    nrf_gpio_pin_set(ADVERTISING_LED_PIN_NO);
}

...
person hlnd    schedule 28.10.2013

UUID должен быть установлен в рекламных данных устройства BLE Вот запись в блоге, описывающая обратное проектирование рекламного пакета. С помощью этого формата вы можете сделать прошивку для своих датчиков BLE, которая распознается iOS как iBeacon.

Если у вас есть работающее оборудование маяка, UUID которого вы знаете, вы можете найти его с помощью - (void)startMonitoringForRegion:(CLRegion *)region из CLLocationManager

person Jonas_W    schedule 17.10.2013