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
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
270
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
New "Type" system on PicoRuby
pocke
1
970
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
700
スマートグラスで並列バイブコーディング
hyshu
0
150
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.7k
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
270
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
360
AI 輔助遺留系統現代化的經驗分享
jame2408
1
630
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
200
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Unsuck your backbone
ammeep
672
58k
Between Models and Reality
mayunak
4
340
Scaling GitHub
holman
464
140k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Amusing Abliteration
ianozsvald
1
210
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Google's AI Overviews - The New Search
badams
0
1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
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