support for iBeacon in Arduino port

This commit is contained in:
Matthias Ringwald 2015-04-28 22:15:43 +02:00
parent e02c7f3ec2
commit 6ac3d2d4a8
3 changed files with 68 additions and 12 deletions

View File

@ -33,17 +33,6 @@
extern "C" void embedded_execute_once(void);
extern "C" void hal_uart_dma_process(void);
// HAL TICK Implementation
extern "C" void hal_tick_init(void){
}
extern "C" void hal_tick_set_handler(void (*tick_handler)(void)){
}
extern "C" int hal_tick_get_tick_period_in_ms(void){
return 250;
}
// btstack state
static int btstack_state;
@ -52,6 +41,8 @@ extern "C" void hal_cpu_disable_irqs(void){ }
extern "C" void hal_cpu_enable_irqs(void) { }
extern "C" void hal_cpu_enable_irqs_and_sleep(void) { }
static const uint8_t iBeaconAdvertisement01[] = { 0x02, 0x01 };
static const uint8_t iBeaconAdvertisement38[] = { 0x1a, 0xff, 0x4c, 0x00, 0x02, 0x15 };
static const uint8_t adv_data_default[] = { 02, 01, 05, 03, 02, 0xf0, 0xff };
static const uint8_t * adv_data = adv_data_default;
static uint16_t adv_data_len = sizeof(adv_data_default);
@ -377,6 +368,25 @@ bool BLEAdvertisement::nameHasPrefix(const char * namePrefix){
return false;
};
bool BLEAdvertisement::isIBeacon(){
return ((memcmp(iBeaconAdvertisement01, data, sizeof(iBeaconAdvertisement01)) == 0)
&& (memcmp(iBeaconAdvertisement38, &data[3], sizeof(iBeaconAdvertisement38)) == 0));
}
const UUID * BLEAdvertisement::getIBeaconUUID(){
return new UUID(&data[9]);
};
uint16_t BLEAdvertisement::getIBeaconMajorID(){
return READ_NET_16(data, 25);
};
uint16_t BLEAdvertisement::getIBecaonMinorID(){
return READ_NET_16(data, 27);
};
uint8_t BLEAdvertisement::getiBeaconMeasuredPower(){
return data[29];
}
BLECharacteristic::BLECharacteristic() {
}

View File

@ -64,7 +64,12 @@ public:
int getRssi();
bool containsService(UUID * service);
bool nameHasPrefix(const char * namePrefix);
const uint8_t * getAdvData();
const uint8_t * getAdvData();
bool isIBeacon();
const UUID * getIBeaconUUID();
uint16_t getIBeaconMajorID();
uint16_t getIBecaonMinorID();
uint8_t getiBeaconMeasuredPower();
};
class BLECharacteristic {

View File

@ -0,0 +1,41 @@
#include <BTstack.h>
#include <SPI.h>
// setup printf
static FILE uartout = {0} ;
static int uart_putchar (char c, FILE *stream) {
Serial.write(c);
return 0;
}
static void setup_printf(int baud) {
Serial.begin(baud);
fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
stdout = &uartout;
}
void setup() {
setup_printf(9600);
BTstack.setBLEAdvertisementCallback(advertisementCallback);
BTstack.setup();
BTstack.bleStartScanning();
}
void loop() {
BTstack.loop();
}
void advertisementCallback(BLEAdvertisement *adv) {
if (adv->isIBeacon()) {
printf("iBeacon found %s, RSSI %d, UUID %s, MajorID %u, MinorID %u, Measured Power %0x\n",
adv->getBdAddr()->getAddressString(), adv->getRssi() ,
adv->getIBeaconUUID()->getUuidString(), adv->getIBeaconMajorID(), adv->getIBecaonMinorID(),
adv->getiBeaconMeasuredPower());
} else {
printf("Device discovered: %s, RSSI: %d\n", adv->getBdAddr()->getAddressString(), adv->getRssi() );
}
}