esp32 bluetooth beacon bulk buy nrf51822 ibeacon suppliers
Hej jag heter Will och idag ska jag
visa dig hur du skriver ett litet Swift -program
som använder iBeacon. Vår app kommer att hitta
den närmaste fyren till enheten och
ändra skärmfärgen för att matcha färgen på den
fyren. Vi kommer inte att använda några SDK: er, vi
kommer bara att interagera direkt med CoreLocation
API: er för att upptäcka fyrar, och jag tror att du kommer
bli förvånad över hur lite kod, hur lite
pannplatta som krävs för att komma igång
med iBeacon. Så låt oss komma igång. Fortsätt
och elda upp Xcode så ska vi skapa
ett nytt projekt, en enda vy -applikation.
Jag kommer att kalla detta ‘närmaste-varning-demo’.
Se till att ditt språk är Swift, det är vad
vi ska arbeta med idag. Och enheter,
välj bara vilken du faktiskt har.
För att få följa den här demon behöver du
ett par saker. Först behöver du fyrar för
att faktiskt interagera med appen. För
det andra behöver du en enhet och ett betalt utvecklarkonto
för att faktiskt ladda appen till
din enhet. Anledningen är att vi upptäcker
bluetooth -signaler, och din Mac överlämnar inte
sin bluetooth -hårdvara till simulatorn, så
du kommer faktiskt inte att upptäcka några fyrar
med simulatorn. Okej, fortsätt och tryck på Nästa
och spara det. Vi kommer i stort sett
uteslutande att arbeta i vår View Controller
så fortsätt och öppna det. Nu, för att interagera
med iBeacon kommer vi att använda CoreLocation,
så det första vi ska göra är att importera
det biblioteket högst upp, precis under UIKit.
Nästa sak vi behöver göra är att berätta för vår klass
vilka delegatmetoder den kommer att ha tillgänglig
för den, så vi ska skapa en LocationManagerDelegate
och få alla dessa metoder levererade
hit. Så direkt efter att UIViewController här
lägger till ett komma så lägger vi till i ‘CLLocationManagerDelegate’,
och det kommer att berätta för klassen vilka
delegatmetoder det har tillgängligt för det. Nästa sak
vi faktiskt behöver för att skapa en Location Manager,
det är detta som samordnar alla
platstjänster för oss. Så fortsätt och definiera en
locationManager, och det här kommer att vara en
instans av ‘CLLocationManager ()’, precis
så. Därefter måste vi berätta för locationManager
vad dess delegat är och var den ska
leverera delegatmetoderna, så direkt inuti viewDidLoad (),
låt oss berätta för locationManager att dess delegat
är ‘själv’, denna View Controller. Ok, nu när
vi har gjort det, för att faktiskt kunna börja
använda locationManager, finns det ett par
saker vi måste göra. Du kanske har märkt
från när du använder appar att de måste be om
ditt tillstånd för att få åtkomst till GPS. Samma
sak gäller med iBeacon -teknik. Du kan inte
börja leta och nosa efter bluetooth -signaler
utan deras tillstånd. Så det finns ett par
saker vi måste göra för att göra det. Först kommer
vi att anropa en metod på vår locationManger
för ‘requestWhenInUseAuthorization ()’. Så
det finns ett par olika alternativ du kan
använda, så det finns två alternativ: det finns requestAlwaysAuthorization (),
som ger dig tillgång till platstjänster
även när du är i bakgrunden, och du
kan väcka din app och svara på dessa
meddelanden. Eller requestWhenInUseAuthorization (),
och detta begränsar din åtkomst till endast när
du är i förgrunden och användaren använder
din applikation aktivt. Eftersom vi
ändrar skärmfärgen som reaktion på den närmaste
fyren är det vettigt för oss att begära närInUseAuthorization ().
Så den andra delen av requestWhenInUseAuthorization ()
och requestAlwaysAuthorization () är när de
godkänner detta behöver du inte fortsätta att fråga,
och faktiskt kommer systemet inte att fortsätta fråga
med dialogrutan. Men för att vara ansvarig
tror jag att vi lägger till en liten incheckning här.
Så för att kontrollera vad vår behörighetsstatus
är, finns det en klassmetod på CLLocationManager
(du kommer att märka att detta är den faktiska CLLocationManager
-klassen, inte vår locationManager -instans här).
Om du ringer till AuthorityStatus () om detta
kommer det att returnera ett nummer. Så låt oss säga
om det här är något annat än CLAuthorizationStatus.AuthorizedWhenInUse,
vilket är vad vi går efter, om det inte är
detta, om det är nekat, eller bara inte har frågat
ännu, låt oss be om denna requestWhenInUseAuthorization ().
Så nu om vi faktiskt eldar upp vår simulator
här kommer du att märka att ingenting händer. Laddningsskärmen
försvann, så det här är vår tomma skärm,
viewDidLoad () avfyrades, men vi blir inte
ombedda om tillstånd. Det är för att det
finns en sak kvar som vi måste göra. Så i
våra stödfiler hittar du din info.plist.
Vi måste lägga till en rad här som
definierar meddelandet/resonemanget eller din vädjan till
användaren om varför de ska godkänna. Så låt oss
lägga till ytterligare en rad längst ner, och
det här är också en typ av gotcha, eftersom detta inte
kommer att slutföras automatiskt och det är inte särskilt
väl dokumenterat, men du måste lägga till den här
nyckeln: ‘NSLocationWhenInUseUsageDescription’.
Det är en munsbit. Så det är nyckeln,
närInUseUsageDescription, och värdet
kommer att vara det som visas i prompten. Så
jag tänker säga “Upptäck fyrar och
visa färgen på den närmaste.” Så nu
när vi har det i vår plist, låt oss köra igen.
Nu ser du så snart den laddningsskärmen försvann,
vi får faktiskt vår uppmaning och
det står “Upptäck fyrar och visa färgen
på den närmaste.” Det är precis vad vi
just skrev in i vår plist. Så nu när du
trycker på “Tillåt” kommer du faktiskt att kunna komma
åt delegatmetoderna, du har faktiskt
kontroll med din locationManager för att börja
göra saker. Så nu när vi har vår
auktoriseringsstatus auktoriserad kan vi börja lyssna
på fyrar faktiskt. Så det första vi behöver
göra är att skapa en region. En region är ett sätt att
berätta för din platshanterare vilka fyrar du
bryr dig om. Du kan föreställa dig att i ett trångt
område eller i en tunnelbana eller någonstans kan det
finnas många fyrar runt en användare, och du
vill inte utlösa saker i din applikation
från en annan persons fyrar. Så du behöver
ett sätt att berätta för locationManager vilka fyrar som
är dina. Nu har varje fyren en UUID -sträng
som är tänkt att vara unik för dina fyrar.
Det är precis vad du använder för att definiera en region.
Så låt oss börja med att skapa en region, det här
kommer att vara en instans av en CLBeaconRegion
och det finns två saker som vi kommer att skicka
till detta: en närhets -UUID och en identifierare.
Nu UUID, jag använder Estimote fyrar
och alla levereras med samma, så jag gick
och letade upp det, och jag har bara en liten
text expander här som kommer att fylla
i det. Du kommer att se detta kommer att vara i formatet
för en NSUUID och skapad med en
UUIDString här, men beroende på vilka fyrar du
använder, eller om du har gjort din egen, borde du
förmodligen känna till den UUID som sänds,
och det är vad du bör fylla i här, det är
specifikt för dig. Identifieraren är bara en
sträng som kommer att berätta vilken region
det här är. Om du övervakar flera regioner kan
du komma åt den här identifieraren när du får
tillbaka händelser. Så jag kommer bara att kalla detta
“uppskattningar”, och det är det för regionen.
Nästa sak vi behöver göra med denna region
är faktiskt att berätta för vår instans av locationManager
att använda denna region och börja leta. Så
det finns en instansmetod på locationManager
för startRangingBeaconsInRegion (), och vi
kommer att passera i vår region som vi just definierat.
Så nu ska vi faktiskt kunna
börja lyssna på fyrar och det betyder att
våra delegatmetoder kommer att börja
kallas. Så om du börjar skriva in locationManager
ser du autoslutförandet här för
alla delegatmetoder vi har tillgängliga för
oss. Det här är det vi bryr oss om här: didRangeBeacons: inRegion.
Så för att börja, låt oss faktiskt bara logga ut
utmatningen. Du ser att fyrarna som kommer
tillbaka bara är en uppsättning [AnyObject], så låt oss
bara skriva ut det här. Och det här är så
långt du skulle ha kunnat gå med
simulatorn, det är dags att byta till en riktig enhet.
Så jag ska ladda upp det här på min telefon
och låt oss titta på loggutmatningen här.
Så det laddas upp, vi tillåter åtkomst, och nu
börjar vi få tillbaka en hel massa fyrar.
Så låt oss stoppa detta för en sekund, och vi kommer
att titta närmare. Jag har 3 fyrar runt
mig, så varje gång detta returneras borde
det skriva ut 3 fyrar i en array. Vi
ser vår UUID här, vi ser ett stort värde och
ett mindre värde för var och en, närhet och
rssi. Och vi ser det här, det var ett, det här
är två, och det är tre i gruppen. Så
ett par saker här: varje fyr kommer åtminstone
att ha dessa tre identifierare sända
: UUID, major och minor -värden, så här
identifierar du dina fyrar. Och då är
närheten intressant, närhet är ett nummer som
kommer tillbaka som 0, 1, 2 eller 3. Detta är bara
i allmänhet ett sätt att berätta hur nära
din fyr är. Så 0 betyder att den inte vet,
1 betyder att den är extremt nära, 2 betyder att den är
lite längre bort och 3 betyder att den är långt
borta. RSSI är ett mått på den faktiska
signalstyrkan. Ju närmare 0 detta är, desto starkare
är det, så rssi på -49 är närmare
0 än -51, och detta matchar med -51. Nu
vill jag nämna att i mina tester har jag gjort
en hel massa byten och tittat på stockar,
och den här gruppen kommer alltid tillbaka till mig
sorterad närmast längst av rssi. Så du
ser att närheten är 2 på alla dessa, det är
lite svårt att se med alla dessa stockar tillsammans
här, men närheten kommer tillbaka som
2, så i allmänhet kan du inte avgöra vilken
som är närmast , men att använda RSSI eller
signalstyrka är ett annat sätt att differentiera sig på
en mer finkornig nivå genom att kontrollera vilken
RSSI som ligger närmast 0. Gotcha är att
en okänd rssi rapporteras som 0, och
kommer tillbaka längst fram i detta array, så du
kan inte bara räkna med att ta den första
i arrayen eftersom en okänd är mycket
osannolik att vara närmare än en känd, särskilt
om det finns ett gäng som kommer tillbaka. Så det är
ett par saker vi vill göra med den här matrisen
nu. Det första vi vill göra är att rengöra
det, vilket betyder att för min användning här ska jag bara
ta den första i gruppen och anta
att den är närmast, men innan jag gör det vill
jag rensa bort alla okända. Och jag
vill påpeka att om du skickar en
produktionsapplikation ska du inte lita på att den
första kommer tillbaka för att vara den närmaste. Bara i
min testning har jag funnit det, så för den här handledningen kommer
vi att gå efter det, men det finns inget
i Apples dokumentation som lovar att det
kommer att vara så för alltid, eller att det kommer
att vara så. Så låt oss rensa denna beacons
-array som kommer tillbaka genom att skapa en ny array som
kallas knownBeacons och vi kommer att kalla
en filtermetod på vår mokosmart beacons -array som
kommer tillbaka från denna delegatmetod här.
Så här inne vill vi säga, låt oss kontrollera
varje objekt i den här matrisen, och om dess närhet inte är lika med CLProximity.
,
kan du stanna i den här matrisen, eller så
kommer fyrarna att skjuta det här objektet till det kända Beacons -arrayet
så länge närheten inte är okänd. Så
nu har vi en knownBeacons -array som
innehåller samma sortering som den andra arrayen,
minus alla okända fyrar. Så nu är det
säkert, för våra syften, att bara ta den
första i gruppen. Så det enda jag
vill göra innan vi gör det är att se till
att det faktiskt finns minst en kvar
här, så så länge räkningen är större än
0 kommer vi att låta den närmaste Beacon vara
den första kända Beacon, och vi måste kasta
detta till en CLBeacon, så att den vet vad
det är. Det enda som återstår att göra är att faktiskt
ställa in vår bakgrundsfärg till färgen på den här
fyren. Jag kommer att gå tillbaka hit och jag
har en annan text expander för att skapa den här
matrisen där nyckeln motsvarar de mindre
värdena för mina fyrar, så här kommer jag
att identifiera dem, jag fick reda på de mindre värdena
för alla mina fyrar tidigare, och associerade
dem med en UIColor som jag tyckte var ganska
nära. Så vad vi ska göra här är att vi
kommer att säga self.view.backgroundColor
kommer att vara lika med vår färger array,
och nyckeln kommer att vara vårt närmasteBeacon.minor
värde, gjutet till dess integerValue. Så vi kommer att
spara och köra
och när det dyker upp kommer jag att lägga den gröna fyren riktigt nära den och
vi får se färgen på skärmen är grön.
Byt den för blått och skärmen ändras blå,
byt den mot lila och skärmen ändras
lila. Så vi kan fortsätta göra detta hela dagen
och se färgen förändras ganska snabbt
när vi flyttar fyrar närmare och längre bort
från vår enhet, eftersom det fungerar.
Okej så det är det grundläggande exemplet här
på hur du kommer igång med iBeacon
med Swift och iOS8. Om du har några frågor
kan du lämna dem i kommentarerna på YouTube
eller hitta mig på Twitter, jag är @willdages. Jag vill
gärna höra från dig, speciellt om det här
hjälper dig. Tack!