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
IoT made easy @ SITCON x HK
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Jeremy Yen
October 22, 2016
Technology
110
0
Share
IoT made easy @ SITCON x HK
IoT made easy: RPi, Sensortag, Websocket with Node.js
Jeremy Yen
October 22, 2016
More Decks by Jeremy Yen
See All by Jeremy Yen
dEXonation
jeremy5189
0
120
A day of full stack developer @ NFU
jeremy5189
0
220
Club Mate and Hacker - 34C3 @ SITCON
jeremy5189
2
720
SITCON 2017 論壇系統開發分享 @ SITCON 2017 Summer
jeremy5189
0
240
poManeuver: Poland into space
jeremy5189
0
470
How we hacked a forum
jeremy5189
0
510
Bdecisive - Booking.com Taipei Hack 2nd Prize
jeremy5189
0
580
Social Intelligence Smart-device project
jeremy5189
0
67
遺失的學校 - SITCON 2014 Lightning Talk
jeremy5189
0
570
Other Decks in Technology
See All in Technology
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
2
17k
本番環境でPHPコードに触れずに「使われていないコード」を調べるにはどうしたらよいか?
egmc
1
280
TanStack Start エコシステムの現在地 / TanStack Start Ecosystem 2026
iktakahiro
1
370
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.2k
【Findy FDE登壇_2026_04_14】— 現場課題を本気で解いてたら、FDEになってた話
miyatakoji
0
980
NgRx SignalStore: The Power of Extensibility
rainerhahnekamp
0
210
組織的なAI活用を阻む 最大のハードルは コンテキストデザインだった
ixbox
6
1.7k
Zero-Downtime Migration: Moving a Massive, Historic iOS App from CocoaPods to SPM and Tuist without Stopping Feature Delivery
kagemiku
0
230
あるアーキテクチャ決定と その結果/architecture-decision-and-its-result
hanhan1978
2
570
暗黙知について一歩踏み込んで考える - 暗黙知の4タイプと暗黙考・暗黙動へ
masayamoriofficial
0
1.3k
インフラを Excel 管理していた組織が 3 ヶ月で IaC 化されるまで
geekplus_tech
3
180
新メンバーのために、シニアエンジニアが環境を作る時代
puku0x
0
700
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
870
SEO for Brand Visibility & Recognition
aleyda
0
4.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
220
Why Our Code Smells
bkeepers
PRO
340
58k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
480
From π to Pie charts
rasagy
0
160
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
160
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
93
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Transcript
*P5NBEFFBTZVTJOH 3BTQCFSSZ1JBOE4FOTPSUBH +FSFNZ!4*5$0/Y),
QBUSJDLTUXTMJEFT "CPVU+FSFNZ ˙ #BDLFOE%FWFMPQFS ˙ 4*5$0/UX%FQVUZ%JSFDUPSPG"HFOEB$PNNJUUFF ˙ ,1.(5BJXBO*5"EWJTPSZ*OUFSO ˙ 5BJXBO5FDI
/5645 ˙ IUUQQBUSJDLTUX 2
QBUSJDLTUXTMJEFT 0VUMJOF ˙ $PNNVOJDBUJPOXJUI#-&EFWJDF ˙ 8SBQQJOHVQXJUI/PEFKT ˙ 'FFEJUUP8FCTPDLFU ˙ $POOFDUJOHUP.VMUJQMF%FWJDF
˙ 5SPVCMFTIPPUJOH ˙ "EEJUJPOBM*OTUBMMJOHPO.BD049 ˙ "EEJUJPOBM3FBEJOH23$PEFXJUI[CBS 3
QBUSJDLTUXTMJEFT 8IZ#-& ˙ *UJUDVSSFOUMZUSFOEJOHJO5BJXBO ˙ :PVSQSPGFTTPSMJLFTJU 4
QBUSJDLTUXTMJEFT 8IZ#-& ˙ *UJUDVSSFOUMZUSFOEJOHJO5BJXBO ˙ :PVSQSPGFTTPSMJLFTJU ˙ )FMJLFTCJHEBUBNPSF 5
QBUSJDLTUXTMJEFT 0CKFDUJWFT ˙ 6OEFSTUBOEJOH#-&QSPUPDPMGBTUFS ˙ #VJMEZPVSQSPKFDURVJDLMZ ˙ 6TF/PEFKTOPUKBWB 3FDPNNFOETCZZPVS QSPGFTTPS
6
7
Introduction
QBUSJDLTUXTMJEFT 3FRVJSFNFOU ˙ 3BTQCFSSZ1J #VJMUJOCMVFUPPUI ˙ CMVF[ESJWFS ˙ 5*4FOTPSUBH$$PS$$
9
QBUSJDLTUXTMJEFT 5*4FOTPSUBH $$ ˙ *35FNQFSBUVSF ˙ "DDFMFSPNFUFS ˙ )VNJEJUZ ˙
4JNQMF,FZ ˙ .BHOFUPNFUFS ˙ #BSPNFUSJD1SFTTVSF ˙ (ZSPTDPQF ˙ -VYPNFUFS ˙ *0 $$ ˙ *35FNQFSBUVSF ˙ "DDFMFSPNFUFS ˙ )VNJEJUZ ˙ 4JNQMF,FZ ˙ .BHOFUPNFUFS ˙ #BSPNFUSJD1SFTTVSF ˙ (ZSPTDPQF 10
QBUSJDLTUXTMJEFT 4JNQMF,FZ ˙ 5XPCVUUPOTPOUIFUBH ˙ 3FDFJWFTTJHOBMXIJMFQSFTTFE *ODMVEJOHCPUI QSFTTFE 11
QBUSJDLTUXTMJEFT $$*0 ˙ %JFSFOU$PMPS-&% ˙ #V[[FS 12
QBUSJDLTUXTMJEFT *OTUBMM#MVF[%SJWFS ˙ %FQFOEFODZ ˙ TVEPBQUHFUJOTUBMMMJCVTCEFWMJCECVTEFWMJCHMJC EFWMJCVEFWEFWMJCJDBMEFWMJCSFBEMJOFEFWMJCCMVFUPPUI EFW ˙ *OTUBMM
˙ XHFUXXXLFSOFMPSHQVCMJOVYCMVFUPPUI CMVF[UBSY[ ˙ DPOHVSFEJTBCMFTZTUFNE ˙ NBLF ˙ TVEPNBLFJOTUBMM 13
QBUSJDLTUXTMJEFT 5VSOPOCMVFUPPUIJOUFSGBDF hciconfig hciconfig hci0 up 14
QBUSJDLTUXTMJEFT 5FTU$POOFDUJPO sudo hcitool lescan gatttool -b [Address] -I 15
Communication with BLE device
QBUSJDLTUXTMJEFT ("551SPUPDPM [78:A5:04:19:59:B9][LE]> connect Attempting to connect to 78:A5:04:19:59:B9 Connection
successful 17
QBUSJDLTUXTMJEFT ("551SPUPDPM # Enable Humidity Sensor Service [78:A5:04:19:59:B9][LE]> char-write-cmd 0x3f
01 # Enable Notification [78:A5:04:19:59:B9][LE]> char-write-cmd 0x3c 01:00 Notification handle = 0x003b value: 38 6c be 84 Notification handle = 0x003b value: 38 6c be 84 ... http://processors.wiki.ti.com/images/a/a8/BLE_SensorTag_GATT_Server.pdf 18
QBUSJDLTUXTMJEFT 1SPDFTTJOH7BMVF var buffer = new Buffer([0x38, 0x6c, 0xbe, 0x84]);
var temperature = -46.85 + 175.72 / 65536.0 * buffer.readUInt16LE(0); var humidity = -6.0 + 125.0 / 65536.0 * (buffer.readUInt16LE(2) & ~0x0003); 19
QBUSJDLTUXTMJEFT 1SPDFTTJOH7BMVF ˙ 4BNQMF+4$PEF ˙ IUUQTHJUIVCDPNTBOEFFQNJTUSZOPEF TFOTPSUBHCMPCNBTUFSMJCDDKT ˙ 4QFDTBOE%PDVNFOUBUJPO ˙
IUUQQSPDFTTPSTXJLJUJDPNJOEFYQIQ 4FOTPS5BH@6TFS@(VJEF 20
Wrapping up with Node.js
QBUSJDLTUXTMJEFT *OTUBMM1BDLBHF sudo apt-get install nodejs npm sudo npm -g
install npm node-gyp npm install sensortag IUUQTHJUIVCDPNTBOEFFQNJTUSZOPEFTFOTPSUBH 22
QBUSJDLTUXTMJEFT OPEFTFOTPSUBH ˙ %FQFOETPOOPCMF /PEFKT#-& ˙ 8SBQVQBMMGFBUVSFTGPSBNPSFDMFBSDPEF 23
QBUSJDLTUXTMJEFT 3VO5FTU node test.js node test-cc2650-io.js 24
QBUSJDLTUXTMJEFT 1SPDFEVSF sensortag.discover(function(tag) { tag.connectAndSetUp(function(error) { tag.enableHumidity(function() { tag.notifyHumidity(); });
}); }); 4BZOPUPDBMMCBDLIFMM IUUQTHJUIVCDPNTBOEFFQNJTUSZOPEFTFOTPSUBH 25
QBUSJDLTUXTMJEFT 3FDFJWJOH%BUB tag.on('humidityChange', function (temperature, humidity) { }); 26
Feed it to Websocket
QBUSJDLTUXTMJEFT .BQUBHUPHMPCBM var _tag = {}; function enableService(error) { _tag[tag.uuid]
= tag; 28
QBUSJDLTUXTMJEFT XTGVODUJPO router.ws('/humidity/:uuid', function(ws, req) { _tag[uuid].on('humidityChange', function (temperature, humidity)
{ var obj = {}; obj[uuid] = { temperature: temperature, humidity: humidity }; ws.send(JSON.stringify(obj));; 29
QBUSJDLTUXTMJEFT OPUJGZEFWJDFTUBUVT function tagDiscovery(tag) { tag.on('disconnect', function() { // Remove
Property delete device_info[tag.uuid]; // Emit Disconnected Event events.emit('device_disconnect'); 30
QBUSJDLTUXTMJEFT OPUJGZEFWJDFTUBUVT var EventEmitter = require('events').EventEmitter, events = new EventEmitter();
router.ws('/connected', function(ws, req) { events.on('device_disconnect', function() { ws.send(JSON.stringify(device_info)); 31
Connecting to Multiple Device
QBUSJDLTUXTMJEFT 3VOUIFFYBNQMFDPEF 33
QBUSJDLTUXTMJEFT "OEJUXJMMOPUXPSL 34
QBUSJDLTUXTMJEFT 5SJDL ˙ %JTDPWFSUBH ˙ 4UPQEJTDPWFSXIJMFDPOOFDUJOH ˙ 3FTVNFEJTDPWFSZPODPOOFDUFEBOE EJTDPOOFDUFE 35
QBUSJDLTUXTMJEFT 4BNQMF$PEF ˙ IUUQTHJUIVCDPNKFSFNZ4FOTPSUBH 8FCTPDLFU 36
QBUSJDLTUXTMJEFT -JWF%FNP 37
Troubleshooting
QBUSJDLTUXTMJEFT 5SPVCMF*OEFY ˙ 31*EJTDPOOFDUFWFOUDBVTFTIBOH ˙ OPCMFXBSOJOHEVSJOHDPOOFDUJPOQSPDFTT ˙ $BOOPUFOBCMFEFWJDFTFSWJDF ˙ #-&"EESFTTVOLOPXOPO049
˙ .BYJNVNEFWJDF 39
QBUSJDLTUXTMJEFT 31*EJTDPOOFDUFWFOUDBVTFTIBOH ˙ ,OPXOJTTVF VOTPMWFE ˙ IUUQTHJUIVCDPNTBOEFFQNJTUSZOPCMFJTTVFT ˙ %JTDPOOFDUFELFZXBTQSFTTFEEVSJOHDPOOFDUJPO NBZ
DBVTFIBOHBOESFGVTFUPDPOOFDUBHBJO ˙ 8PSLBSPVOE ˙ .BOVBM3FTUBSU/PEFKTQSPDFTT 40
QBUSJDLTUXTMJEFT OPCMFXBSOJOHEVSJOHDPOOFDUJPO QSPDFTT ˙ )BQQFOT SBOEPNMZ CFGPSF DPOOFDU"OE4FU6Q.F ˙
8PSLBSPVOE ˙ DBUDIDPOTPMFXBSOGVODUJPO NTH JGOPCMF XBSOJOHBQQFBSTUIFOSFTUBSUOPEFKTQSPDFTT 41
QBUSJDLTUXTMJEFT $BOOPUFOBCMFEFWJDFTFSWJDF ˙ 4PNFUJNFT "GUFSDPOOFDU"OE4FU6Q.F UIF EFWJDFTFSWJDFXPOUFOBCMF ˙ 8PSLBSPVOE ˙
4FUVQBTFU5JNFPVU XBUDIEPHBOEXBJU TFDPOET*GTFSWJDFOPUFOBCMFECZUIBUUJNF UBHEJTDPOOFDU 42
QBUSJDLTUXTMJEFT #-&BEESFTTVOLOPXOPO049 ˙ $BVTFCZSTUUJNFDPOOFDU 43
Additional: Installing on Mac OSX
QBUSJDLTUXTMJEFT ,FZQPJOU ˙ CMVFUPPUIIDJTPDLFUEPOPUTVQQPSUEBSXJO ˙ JOTUBMM9DPEF ˙ OQNJOTUBMMYMDDPOOFDUJPOCQMJTUQBSTFS ˙ /PCMVFUPPUILUFYUNPEJDBUJPO
45
QBUSJDLTUXTMJEFT 4FOTPSUBH0493FNPUF ˙ 6TJOH4FOTPSUBHBTBLFZOPUFSFNPUF ˙ *BNDVSSFOUMZVTJOH ˙ IUUQTHJUIVCDPNKFSFNZ4FOTPSUBH 0493FNPUF 46
QBUSJDLTUXTMJEFT "EEJEJPOUBM## ˙ $POUSPMMJOH4UBSXBST##VTJOH/PEFKT 47
48
Additional: Reading QR Code with zbar
QBUSJDLTUXTMJEFT $IPPTFUIFSJHIUDBNFSB ˙ 31J$BNFSBXJMMOPUXPSL ˙ 6TF64#XFCDBNJOTUFBE -PHJUFDI$ ˙ 31*NVTUBVUPMPHJOUPEFTLUPQ
[CBSCVH 50
QBUSJDLTUXTMJEFT *OTUBMMBOE5FTU ˙ TVEPBQUHFUJOTUBMM[CBSUPPMTQZUIPO[CBS ˙ [CBSDBNEFWWJEFP 51
Thank you
Q & A