Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Wi-Fi RTTによる屋内測位アプリを作ろう
Search
napplecomputer
February 08, 2019
Programming
18k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Wi-Fi RTTによる屋内測位アプリを作ろう
napplecomputer
February 08, 2019
More Decks by napplecomputer
See All by napplecomputer
Kotlin2.0対応などでビルド時間を45%削減したぞ!
napplecomputer
0
1.2k
EmojiPicker触ってみた
napplecomputer
0
770
compileSdkVersion33でgetSerializable/getParcelableがつらい話
napplecomputer
13
5.9k
式年遷Target SDK Version
napplecomputer
0
470
Target SDK Versionを上げない Notification runtime permission対応
napplecomputer
0
510
通知がOFFだとToastは表示されな… されてる!?
napplecomputer
0
1.2k
Photo Pickerを触って比較してみた
napplecomputer
0
2.2k
Android Qのストレージの話
napplecomputer
3
1.2k
Other Decks in Programming
See All in Programming
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
140
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Agentic UI
manfredsteyer
PRO
0
150
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
750
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
160
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
100
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
120
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
970
Into the Great Unknown - MozCon
thekraken
41
2.6k
GraphQLとの向き合い方2022年版
quramy
50
15k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Speed Design
sergeychernyshev
33
1.8k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Six Lessons from altMBA
skipperchong
29
4.3k
Amusing Abliteration
ianozsvald
1
200
Transcript
8J'J355ʹΑΔଌҐΞϓϦ Λ࡞Ζ͏ !OBQQMFDPNQVUFS 1
ࣗݾհ • ͳͬͽʔ • !OBQQMFDPNQVUFS • גࣜձࣾσΟʔɾΤψɾΤʔॴଐ • .07ͷϢʔβʔΞϓϦ։ൃ 2
࣍ 3 ͖͔͚ͬ 8J'J355ͷ༷ ࡞ͬͯΈͨ ਫ਼Λ্͛ΔͨΊͷΞΠσΟΞ
͖͔͚ͬ 4
5 )PXUPHFUPOFNFUFSMPDBUJPOBDDVSBDZ GSPN"OESPJEEFWJDFT (PPHMF*0` IUUQTZPVUVCFWZX(H4S(0%6
8J'J355ͷ༷ 6
"OESPJEͷҐஔใऔಘํ๏ 7
'VTFE-PDBUJPO 8
'VTFE-PDBUJPOͳ͠ 9 ΞϓϦ ηϯαʔ" ΞϓϦ ηϯαʔ$ ηϯαʔ#
'VTFE-PDBUJPO͋Γ 10 ΞϓϦ ηϯαʔ" ΞϓϦ ηϯαʔ$ ηϯαʔ# (PPHMF1MBZ 4FSWJDFT
'VTFE-PDBUJPO 11 (14 8J'J 344* ΩϟϦΞجہ ਫ਼ ϝʔτϧ ϝʔτϧ ϝʔτϧʁ
! " " ҐஔଌҐ༻ " ! ʁ
'VTFE-PDBUJPO 12 (14 8J'J 344* ΩϟϦΞجہ 8J'J 355 ਫ਼ ϝʔτϧ
ϝʔτϧ ϝʔτϧʁ ϝʔτϧ ! " " " ҐஔଌҐ༻ " ! ʁ "
'VTFE-PDBUJPO 13 (14 8J'J 344* ΩϟϦΞجہ 8J'J 355 ਫ਼ ϝʔτϧ
ϝʔτϧ ϝʔτϧʁ ϝʔτϧ ! " " " ҐஔଌҐ༻ " ! ʁ " /&8
8J'J355ͷ༷ 14
8J'J355 • 3553PVOE5SJQ5JNFͷུ • *&&&NDͰఆٛ • *&&&NDʹରԠ͍ͯ͠ΔΞΫηεϙΠϯτͱɺ *&&&NDʹରԠ͍ͯ͠Δ͕ඞཁ • ௨৴͔࣌ؒΒڑΛܭଌ͢Δ
15
ڑܭଌ 16 ΞΫηεϙΠϯτ ڑτʔλϧ࣌ؒʷޫͷ͞ D ̎
ڑܭଌͬͱৄ͘͠ 17 ΞΫηεϙΠϯτ '5.3FRVFTU '5. U U "$, U
U U U ڑ UU UU ʷޫͷ͞ D ࣌ؒ
ͷҐஔΛܭࢉ͢Δ 18
ͷҐஔΛࢉग़͢Δ • 355ͰऔΕΔͷΞΫηεϙΠϯτ·Ͱͷڑ͚ͩ • ͷҐஔใͷࢉग़355ͷൣғ֎ • ࣗͰܭࢉ͢Δ • ΞΫηεϙΠϯτͷҐஔใ355ͷൣғ֎ •
ΞΫηεϙΠϯτ͕ͭ͋ΕҐஔͷಛఆ͕Մೳ • ਫ਼Λग़͢ͳΒͭ΄͍͠ 19
ΞΫηεϙΠϯτ͕ͭͷ߹ 20
ΞΫηεϙΠϯτ͕ͭͷ߹ 21
ΞΫηεϙΠϯτ͕ͭͷ߹ 22
࣮ࡍʹᘳͳ औಘͰ͖ͳ͍ 23
ݱ࣮ 24
25
(PPHMF*0Ͱհ͞Ε͍ͯͨํ๏ • ࣍ݩަ࠲ඪʹͱΞΫηεϙΠϯτΛஔ͘ • ϐλΰϥεͷఆཧΛͬͯํఔࣜͰදݱ͢Δ • ͭͷ࣍ํఔࣜΛͭͷ࿈ཱํఔࣜʹͯ͠ղ͘ • ͭͷ࣍ํఔࣜʹͳΔ •
ͭͷ࣍ํఔࣜͷͰଟ֯ܗΛ࡞Γɺͦͷଟ֯ܗͷ த৺ΛͷҐஔͱ͢Δ 26
࣍ݩަ࠲ඪʹͱΞΫηεϙΠϯτΛஔ͘ 27
28 x1 y1 r1 x, y (x − x1 )2
+ (y − y1 )2 = r2 1 ϐλΰϥεͷఆཧΛͬͯํఔࣜͰදݱ͢Δ
ϐλΰϥεͷఆཧΛͬͯํఔࣜͰදݱ͢Δ 29 (x − x1 )2 + (y − y1
)2 = r2 1 (x − x3 )2 + (y − y3 )2 = r2 3 (x − x2 )2 + (y − y2 )2 = r2 2 (x − x4 )2 + (y − y4 )2 = r2 4
࣍ํఔࣜΛඳը͢Δ 30 (x − x1 )2 + (y − y1
)2 = r2 1 (x − x3 )2 + (y − y3 )2 = r2 3 (x − x2 )2 + (y − y2 )2 = r2 2 (x − x4 )2 + (y − y4 )2 = r2 4
ଟ֯ܗͷਅΜதΛͷॴͱ͢Δ 31 (x − x1 )2 + (y − y1
)2 = r2 1 (x − x3 )2 + (y − y3 )2 = r2 3 (x − x2 )2 + (y − y2 )2 = r2 2 (x − x4 )2 + (y − y4 )2 = r2 4
"OESPJEͷ8J'J355"1* 32
"OESPJEͰͷ8J'J355 • 04ͱͯ͠"OESPJE "1*-FWFM ͔ΒରԠ • ͱͯ͠1JYFM 9-ؚΉ ͕ରԠ͍ͯ͠Δ •
*0Ͱ1JYFMTͱݴͬͯͨͷͰ1JYFM1JYFMର Ԡͯ͠Δ͔ 33
ಛ • ΞΫηεϙΠϯτʹ8J'Jͱͯ͠ଓ͠ͳͯ͑͘Δ • ଞͷΞΫηεϙΠϯτʹ8J'Jͱͯ͠ଓதͰ͑Δ • ̍ͷ"1*ͷ࣮ߦͰ'5.Λෳճ͛ͯɺฏۉɺඪ४ ภࠩΤϥʔΛฦͯ͘͠ΕΔ • كʹϚΠφεͷڑ͕ฦͬͯ͘Δʜ
• ߴස NT͘Β͍ʣͰ͏ͱࢮ͵ 34
Δ͜ͱ • 8J'JΞΫηεϙΠϯτΛεΩϟϯ͢Δ • εΩϟϯͯ͠ಘΒΕͨΞΫηεϙΠϯτͷதʹ8J'J 355ରԠ͍ͯ͠ΔΞΫηεϙΠϯτ͕͋Δ͔֬ೝ͢Δ • 8J'J355ରԠΞΫηεϙΠϯτͱ8J'J355ͷ ΓͱΓΛͯ݁͠ՌΛಘΔ 35
ඞཁͳ1FSNJTTJPO <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 36
8J'JΞΫηεϙΠϯτΛεΩϟϯ val receiver = object: BroadcastReceiver() { override fun onReceive(context:
Context, intent: Intent) { when(intent.action) { WifiManager.SCAN_RESULTS_AVAILABLE_ACTION -> { // Wi-FiͷεΩϟϯ͕ྃͨ͠ } } } } val filter = IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) registerReceiver(receiver, filter) 37
8J'JΞΫηεϙΠϯτΛεΩϟϯ val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager wifiManager.startScan() 38
8J'JΞΫηεϙΠϯτΛεΩϟϯ val scanResults = wifiManager.scanResults.filter { it.is80211mcResponder } 39
ΞΫηεϙΠϯτ·ͰͷڑΛऔಘ val rangingRequest = RangingRequest.Builder() .addAccessPoints(scanResults) .build() val rttManager =
getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager val resultCallback = object : RangingResultCallback() { override fun onRangingResults(results: MutableList<RangingResult>) { val ragingResults = results.filter { it.status == STATUS_SUCCESS } } override fun onRangingFailure(code: Int) { } } rttManager.startRanging(rangingRequest, executor, resultCallback) 40
TUBSU4DBOͷ༷มߋ • 8JGJ.BOBHFSTUBSU4DBO ͕"1*-FWFM͔ Β৭ʑมߋ • ಥવͷEFQSFDBUFE • ͔͠ସखஈࠓͷͱ͜Ζͳͦ͞͏ •
όοΫάϥϯυΞϓϦͰʹճ͔͠ݺͳ͍ • ϑΥΞάϥϯυΞϓϦͰʹճ͔͠ݺͳ͍ 41
8J'J"XBSFʹΑΔ355 42
8J'J"XBSFʹΑΔ355 • 8J'J"XBSFΛ͏ͱ"OESPJEಉ࢜Ͱ355Λ ߦ͑Δ • "1*-FWFM͔Β • 8J'J"XBSF͢Ε͕͍ͪ௨৴ͷΑ͏ͳػೳΛ࣮ݱ Ͱ͖Δ •
8J'J"XBSFͰଓޙɺ355༻ͷϝιουΛݺͿ 43
࡞ͬͯΈͨ 44
࡞ΔࡍʹΔ͜ͱ • ΞΫηεϙΠϯτͷબఆ • ॴͷબఆ • ਤͷೖख • ΞΫηεϙΠϯτͷઃஔ •
ΞΫηεϙΠϯτͷҢܦͷऔಘ • ΞϓϦͷ࡞ 45
ΞΫηεϙΠϯτͷબఆ 46
ΞΫηεϙΠϯτͷબఆ • *&&&NDʹରԠͨ͠8J'JΞΫηεϙΠϯτ • 8J'J"XBSF • ͭ·Γ1JYFM 47
*&&&NDରԠΛ ᨳ͍ͬͯΔΞΫηεϙΠϯτ 48
ແ͍ 49
ແ͍ ˞ͳͬͽʔௐ 50
51 (PPHMF8J'J
(PPHMF8J'J • (PPHMF*0Ͱ(PPHMF8J'J͕XJMMTPPO ͰରԠ͢Δͱݴ͍ͬͯͨ • (PPHMF8J'JͷϦϦʔεϊʔτΛҎ্ࢹ͠ଓ͚ ͕ͨ*&&&NDͷ͜ͱҰॻ͔Ε͍ͯͳ͍ • XJMMTPPOͱԿͩͬͨͷ͔ 52
(PPHMF8J'J • %SPJE,BJHJͷొஃܾ·ͬͨͷͰɺ(PPHMF8J'J ͕͍ͭߋ৽͞Ε͍͍ͯΑ͏ʹങ݄ͬͯʹηοςΟϯ άͨ͠ • ՈͰ8J'J355ͷ"OESPJE"1*Λࢼͨ͠Β8J'J 355ରԠ͍ͯ͠ΔΞΫηεϙΠϯτ͕ݟ͔ͭͬͨ • (PPHMF8J'J͕͠ΕͬͱରԠ͍ͯͨ͠
53
(PPHMF8J'J • ରԠ͍ͯ͠Δͷͷ(PPHMF 8J'Jͷઃఆ߲ʹ8J'J 355ͳ͍ • (PPHMF*0Ͱ8J'J355σϑΥϧτͰΦϯͱݴͬ ͍͕ͯͨΦϑʹͰ͖ͳ͍ • օ͞Μ͕͓͍ͷ(PPHMF8J'J'5.SFRVFTUΛ
ૹΔͱ'5.ฦͯ͘͠Ε·͢ 54
ॴͷબఆ 55
ॴͷબఆ • ී௨ܭଌ͍ͨ͠ॴ͕͋Δͱ͜Ζ͔Β࢝·ΔͷͰ ॴ͕ܾ·ͬͨঢ়ଶͰ࢝·Δʢͣʣ • ࠓճܭଌ͢Δ͜ͱ͕తͳͷͰɺॴͷબఆ͕ඞཁ 56
ॴͷ݅ • ͍ॴ • ڱ͍ॴਫ਼తʹແཧ • ݐͷେ͖͕͞ਖ਼֬ͳਤ͕͋Δ • ݐͷҢܦΛʢϝδϟʔͰଌΔͳͲͷํ๏Ͱʣ Δ͜ͱ͕Ͱ͖Δ
• ΞΫηεϙΠϯτͷҢܦʹਖ਼֬ͳ͕ඞཁ 57
ࠓճͷॴ • ࠓճࣗͷՈʹͨ͠ • ͋ͱ͔ΒݟΔͱ͜Εࣦഊ • ڱ͍ • σϞಈըͰΞϓϦͷը໘ͱॴΛऩΊ͔͕ͨͬͨɺ ՈͷதΛ%SPJE,BJHJͰࡽ͢༐ؾͳ͔ͬͨ
58
ਤͷೖख 59
ਤͷೖख • ϢʔβʔʹݟͤΔͱ͖ͱΞΫηεϙΠϯτͷઃஔʹ ༻͢Δ • ͷਤ͕ͳ͍ͳΒଌҐ͢Δҙຯ͋·Γͳ͍ • ਖ਼֬ͳਤͰͳ͚Εਖ਼֬ͳଌҐͰ͖ͳ͍ • ࠓճؒऔΓਤΛ༻
60
ΞΫηεϙΠϯτͷઃஔ 61
ΞΫηεϙΠϯτͷઃஔ • ձͷେ͖͞ʹ߹Θͤͯ·ΜΜͳ͘ઃஔ͢Δ • ΞΫηεϙΠϯτʹғ·Ε͍ͯΔΑ͏ͳঢ়ଶʹ͢Δ • ઢͰ݁ΔΑ͏ͳஔͰਫ਼͕ग़ͳ͍ • ࢛͍֯෦ͳΒ࢛۱ͱਅΜத͕ྑͦ͞͏ •
ࠓճׂͱࡶ 62
ΞΫηεϙΠϯτͷҢܦ 63
ΞΫηεϙΠϯτͷҢܦͷऔಘ • ਤͳͲΛͬͯΞΫηεϙΠϯτͷҢܦΛؤுͬ ׂͯΓग़͢ • େม 64
ΞϓϦͷ࡞ 65
ΞϓϦͷ࡞ • (PPHMF.BQ4%,Λ͏͔Θͳ͍͔ΛܾΊΔ • Θͳ͍߹ɺਤతͳૢ࡞ࣗલ࣮͕ඞཁ • Θͳ͍߹ɺҢܦͳ͍͍ͯ͘ • Ψοͱؾ߹Ͱ࣮͢Δ •
ਫ਼Λؾʹ͠ͳ͚Ε؆୯ʹ࣮Ͱ͖Δ • ਫ਼Λؾʹ͢Δͱແݶʹ͕͔͔࣌ؒΔ 66
ਫ਼Λ্͛ΔΞΠσΟΞ 67
ਫ਼Λ্͛Δ • ߴ͞Λ͏ • ΞΫηεϙΠϯτ͕ఱҪʹ͋Δ߹ͳͲߟྀͨ͠ ΄͏͕ྑͦ͞͏ • ΞΫηεϙΠϯτͷઃஔॴΛݟ͢ • ڑ͔ΒҐஔใΛࢉग़͢Δํ๏Λมߋ͢Δ
• લճऔಘͨ͠ͳͲΛͬͯҟৗΛແࢹ͢Δ 68
ਫ਼Λ্͛Δ • ΞΫηεϙΠϯτͷΛ૿͢ • ඪ४ภࠩͷେ͖ͳΞΫηεϙΠϯτΛແࢹ͢ΔͳͲ • ֤छηϯαʔΛ͏ • Ճηϯαʔ •
ίϯύε 69
·ͱΊ 70
·ͱΊ • ΞΫηεϙΠϯτ(PPHMF8J'J • ਤΞΫηεϙΠϯτͷҢܦͳͲͷਖ਼͕֬͞ॏཁ • ͋ΔఔΛ͠ͳ͍ͱਫ਼ग़ͳ͍ • ਫ਼͕ѱ͍߹Ͳ͜ʹ͕͋Δͷ͔ಛఆ͠ʹ͍͘ 71
͜͠ͷͰσϞ͢ΔͳΒ 72
͜ͷͰσϞ͢Δʹ • ձͷ8J'JʹӨڹΛ༩͑ΔՄೳੑ͕͋ΔͷͰӡӦʹ֬ ೝ • 8J'J"XBSFΛ͏ • ઃஔָ͕ 73
͜ͷͰσϞ͢Δʹ • ਖ਼֬ͳਤͷೖखఘΊΔ • (PPHMF.BQΛͦͷ··͍͍ͬͯͳΒਖ਼֬ͳ ਤͳ͍͍ͯ͘ • ৄࡉͳਤ͕͋ͬͨ΄͏͕໘ന͍͕ɺσϞͳͷͰ ͷલͰಈ͔͚ͩ͢Ͱे 74
͜ͷͰσϞ͢Δʹ • ઃஔॴ࢛۱ʴձͷେ͖͞ʹԠͯ͡ਅΜதʹ • Ңܦؤுͬͯ༧͢Δ • લͳͲʹਤΒͤͯΒ͑ͳ͍͔ަব͢Δ • 8J'J"XBSFͳΒஔ͚ͩ͘ͳͷͰɺΈͳ͞Μ ʹ࣋ͬͯΒ͏ͷ͋Γ
75