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
Jeremy Yen
October 22, 2016
Technology
0
110
IoT made easy @ SITCON x HK
IoT made easy: RPi, Sensortag, Websocket with Node.js
Jeremy Yen
October 22, 2016
Tweet
Share
More Decks by Jeremy Yen
See All by Jeremy Yen
dEXonation
jeremy5189
0
110
A day of full stack developer @ NFU
jeremy5189
0
210
Club Mate and Hacker - 34C3 @ SITCON
jeremy5189
2
710
SITCON 2017 論壇系統開發分享 @ SITCON 2017 Summer
jeremy5189
0
230
poManeuver: Poland into space
jeremy5189
0
450
How we hacked a forum
jeremy5189
0
480
Bdecisive - Booking.com Taipei Hack 2nd Prize
jeremy5189
0
570
Social Intelligence Smart-device project
jeremy5189
0
64
遺失的學校 - SITCON 2014 Lightning Talk
jeremy5189
0
560
Other Decks in Technology
See All in Technology
Tenstorrent 開発者プログラム
tenstorrent_japan
0
310
型システムを知りたい人のための型検査器作成入門
mame
15
3.8k
比起獨自升級 我更喜歡 DevOps 文化 <3
line_developers_tw
PRO
0
180
SFTPコンテナからファイルをダウンロードする
dip
0
300
Securing your Lambda 101
chillzprezi
0
280
IAMのマニアックな話 2025を執筆して、 見えてきたAWSアカウント管理の現在
nrinetcom
PRO
4
570
ObsidianをMCP連携させてみる
ttnyt8701
2
120
活きてなかったデータを活かしてみた話 / Shirokane Kougyou vol 19
sansan_randd
1
340
AWS全冠したので振りかえってみる
tajimon
0
140
“プロダクトを好きになれるか“も QAエンジニア転職の大事な判断基準だと思ったの
tomodakengo
0
140
RubyOnRailsOnDevin+α / DevinMeetupJapan#2
ginkouno
0
430
Grafana MCP serverでなんかし隊 / Try Grafana MCP server
kohbis
0
350
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
The Invisible Side of Design
smashingmag
299
51k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Producing Creativity
orderedlist
PRO
346
40k
It's Worth the Effort
3n
184
28k
Statistics for Hackers
jakevdp
799
220k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
4
150
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
How to Ace a Technical Interview
jacobian
276
23k
Typedesign – Prime Four
hannesfritz
42
2.7k
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