From c60c5d2da4c5837b918a51a63497233540ba3628 Mon Sep 17 00:00:00 2001 From: Paul Walko Date: Thu, 23 Feb 2017 05:34:20 +0000 Subject: [PATCH] init commit --- .bluetooth.m.swo | Bin 0 -> 16384 bytes bluetooth.m | 281 +++++++++++++++++++++++++++++++++++++++++++++++ frames.mat | Bin 0 -> 1122 bytes octave-workspace | Bin 0 -> 48 bytes 4 files changed, 281 insertions(+) create mode 100644 .bluetooth.m.swo create mode 100755 bluetooth.m create mode 100644 frames.mat create mode 100644 octave-workspace diff --git a/.bluetooth.m.swo b/.bluetooth.m.swo new file mode 100644 index 0000000000000000000000000000000000000000..601f0a9c89103548383fc0a577790a7821b2bec1 GIT binary patch literal 16384 zcmeI2TWnlM8Gug%O}mAbl2Sq2m+6``YsHSe&du0Z;M$3r;yR8Urx!)Fj(5-6+pKrZ zImgCUQ`%IdQMss8AaN77rwXAUC(bs=`ABJe0r#sz8-^KuFvqB)XjgIr-sc+qPPF?4`vfXi(-IazE zU+QxG%3|-LTRAn~TH8wYqtamCe8YnkFKo5K#XU<~Rmh*^9>_iL#&}>Qto06FKf8CJ z98LAE;_d3D9kXvt+j%Rw2XYVO9>_hAdm#5f?t$C`xd(C&yeT{oE^l)l#nNrYTKO*5 zRr(|Te2clCFrR1Io}1hJBlke=f!qVR2XYVO9>_hAdm#5f?t$C`xd(C&mBDjd=*;o0k{$V_;$znK0FBzzy#a^JK(jqInEE@6Yz0(1dhTm+y>j=;&qPmYxo6x z3BCwlfXCt8P=J3H9OqB)WB3%DfyZDTJ_IAM8*YYc;o`Nl3FqPK@HKb>9)goF2D{+~ z`0F)}a{nwd1@5=ipHYz=sb) z32ue$@Q=6BCwK*(gKxlR;bY*z7~BB`c#Xu(&*7W!G@ONFFbcOo0bXV7UxF`##K8k_ zKm2c3q2M(FuU=Di_5Kl6-scnw1%GYMtya~Dny-g}7nbyW4Y^h_54!3 zyL*`S(+USgU)ZKk-)nsbdbX&2P-=In@s^t8zf|hYg<&fC_Tl)A=s<^4nD1JZyQ8~r$vNE)z?-0)$# z^|F?TTi-tvwXJoM-J9VnkNHN0lRMI^sAbMlf&L@j=!D z=7{NaWzlUmy#~`JZn!+eOf%ipVH%lkBr#bRn)_&eB%QM1w=bSzGR9HcN#t1%B!OTW zOA6W|BO3^%bZjVsgVi)M^2hlzt#ACecR(*O#yMFTT8ta8j(y+IzGzJ{725nn+>S5Qd$r-)EwSj3mpPn$quM+d%wEjW-^;JJW|}l`g`W?z$DX`jTyo z7GIViQIw`T)VXCbZLhI>h>>Ywvlont<&W+C@r{IItK$t#Vzn;HTCI0{9c`N(4CVNb zNfGxlwL^?;kuP{PZYmm#$fbI>q2k)w!y+GDQBUMsm)Sze_l$j=`!Bk)aSeuFURFsk zidcN5R7pJQE2Ap)mXDsMYVe4ODD`v==6BS+J_$Ir>iU6W^=98O$zUydYgQy)OpO(G zJVhjG*}fzCRQ8>c)fBcuw-N7}6HQThd%&4htB_VH-B8(I0VCc2G= zUhWb{VDaT%QSVN;e%<8_h|6Tg#{W>?yVB%9wBWO%O8FH3aj))m8>d=M*X?~Pf!{Y@ zZ}zn+p}Xq!RvL9j&i~JG_T0{SR?hzue8}}v&i6lrr{PIB19dnKBk*3>4u9c%|4X<4 zUxBmGgjpDdB3uJk!RvD7hu^{l_zawb8R!EA?}D4)Z{z?j!prbHJOhuzLog0E!+*#D zyb3>oXW={W6a?@f90ti1{GL3(=iv!hf?aSMY=h@H^M4yY2gl$}=!Re6j~C$ucm~#C z2_A&IVGv4iD~Ru|hWyGskb5BaK<#8E#C!0ZI|C7n8#CcG2U>T8} zHz$`;vEHnQqZ~vZCh^-_euP6br&TF1mz0|a6BFVDksTO_gyooMlFMd)u5+v-YQMwL zZ0zXdE6K zVT+pzfwiY1v>U3IGja(nW^6dQ?X zlx%8*M-mdLW-+B?eu&^}H;LJSy*5oE1tOkOB;p75rv;?OJ}YIEiB$RE(1EC&8yzVl zOzp75jMK-}9-Cp1%GSY27B^L>y`B{4`YBJR*D`!8x7x{fM90y2H{kailKb+rP1}NE z)3jt{#SVLm(ISj%cLq_i))Zu9Of)39jGa|2n|&a4;)KIMqQj&&P@${o`?QAm_bnr# z?=$T&xrms0O=eVVb8*`I98}cnTK1t#MH|{ipmQF{FI}kyQ%m5cRah(2RqQ&psl5DT zm{OtT4;|Z7o+T?SFWq3y+9_Ma%NwuZxV*hyvJ!1x4bQe$V=WN*PH*)ys;QjMh+Toi oCi@GJ9VXVD%l_RF6XN$x5@zN{B>N&V56E~k7YFV1(s}Ry0xih+ApigX literal 0 HcmV?d00001 diff --git a/bluetooth.m b/bluetooth.m new file mode 100755 index 0000000..2089921 --- /dev/null +++ b/bluetooth.m @@ -0,0 +1,281 @@ +#!/usr/bin/octave-cli +## Paul Walko +## bluetooth-undergrads + + +### Variables +############################################## +global data = -1; # all data array +global channel = -1; # channal int +global total_len_dec = -1; # total len int + +### Preamble / Access Address vars +global preamble = -1; # preamble int +global access_address = -1; # acc addr int + +### PDU / CRC vars +global pduCrcArray = -1; # pdu + crc array +global pdu = -1; # pdu array +global crc = -1; # crc array +# PDU +global header_struct = -1; # header Struct +global payload_struct = -1; # payload Struct +# CRC +global crc_struct = -1; # crc struct + +## Functions +############################################# +## Helper Functions +function arr = flipOctects(arr) + for i = 1:8:length(arr) + arr(i:i + 7) = flip(arr(i:i + 7)); + endfor +endfunction +############################################# + + +# Loads data from file +function loadFile(fileName = "frames.mat", dataName = "advertising_data_known", channelName = "channel") + global data; + global channel; + load(fileName); + eval (strcat("data = ", dataName, ";")); + eval (strcat("channel = ", channelName, ";")); +endfunction + +# Extracts preamble from data +function getPreamble() + global data; + global preamble; + preamble = uint8(0); + for i = 1:8 + preamble = bitset(preamble, i, data(i)); + endfor +endfunction + +# Extracts Access Address +function getAccessAddress() + global data; + addrArray = data(9:40); + global access_address; + access_address = uint32(0); + for i = 1:length(addrArray) + access_address = bitset(access_address, i, addrArray(i)); + endfor +endfunction + + +# deWhiten PDU and split up pdu & crc arrays +function deWhitenPDUCRC() + global data; + global channel; + global pduCrcArray; + pduCrcArray = data(41:length(data)); + channel = uint8(channel); + lfsr = uint8(1); + for i = 1:6 + lfsr = bitset(lfsr, 8 - i, bitget(channel, i)); + endfor + for i = 1:length(pduCrcArray) + pduCrcArray(i) = bitxor(bitget(lfsr, 7), bitget(pduCrcArray(i), 1)); + lfsr = bitshift(lfsr, 1); + lfsr = bitset(lfsr, 1, bitget(lfsr, 8)); + lfsr = bitset(lfsr, 5, bitxor(bitget(lfsr, 5), bitget(lfsr, 8))); + endfor + global pdu; + global crc; + pdu = pduCrcArray(1:length(pduCrcArray) - 24); + crc = pduCrcArray(length(pduCrcArray) - 23:length(pduCrcArray)); +endfunction + +# deWhitenPDUCRC MUST be run before this function +# Extract header and store values in header_struct +function getPDUHeader() + global pdu; + global header_struct; + header = pdu(1:16); + reserved_1 = header(5:6); + tx_add = uint8(0); + rx_add = uint8(0); + reserved_2 = header(15:16); + payload_len_dec = uint8(0); + pdutype_dec = uint8(0); + for i = 1:length(header) + if i <= 4 + pdutype_dec = bitset(pdutype_dec, i, header(i)); + elseif i <= 6 + # Do Nothing; Already Assigned above + elseif i <= 7 + tx_add = bitset(tx_add, i - 6, header(i)); + elseif i <= 8 + rx_add = bitset(rx_add, i - 7, header(i)); + elseif i <= 14 + payload_len_dec = bitset(payload_len_dec, i - 8, header(i)); + else + # Do Nothing; Already Assigned above + endif + endfor + if pdutype_dec == 0 + pdutype = "ADV_IND"; + elseif pdutype_dec == 1 + pdutype = "ADV_DIRECT_IND"; + elseif pdutype_dec == 2 + pdutype = "ADV_NONCONN_IND"; + elseif pdutype_dec == 3 + pdutype = "SCAN_REQ"; + elseif pdutype_dec == 4 + pdutype = "SCAN_RSP"; + elseif pdutype_dec == 5 + pdutype = "CONNECT_REQ"; + elseif pdutype_dec == 6 + pdutype = "ADV_SCAN_IND"; + else + pdutype = "Reserved"; + endif + # Set header values + header_struct = struct("pdutype", pdutype, "pdutype_dec", pdutype_dec, "reserved_1", reserved_1, "tx_add", tx_add, "rx_add", rx_add, "length", payload_len_dec, "reserved_2", reserved_2); +endfunction + +# Sets pdu struct to correct vars and store payload +function setPayloadFields() + global pdu; + global header_struct; + global payload_struct; + + field2_len = header_struct.length - 6; + pdutype_dec = header_struct.pdutype_dec; + payload_len = length(pdu) - 16; + payload = pdu(17:length(pdu)); + + # ADV_IND, ADV_NONNCONN_IND, ADV_SCAN_IND + if pdutype_dec == 0 || pdutype_dec == 2 || pdutype_dec == 6 + payload_struct = struct("payload", {payload_len, payload}, "advA", {6, -1}, "advData", {field2_len, -1}); + setPDUField_026(); + # ADV_DIRECT_IND + elseif pdutype_dec == 1 + payload_struct = struct("payload", {payload_len, payload}, "advA", {6, -1}, "initA", {6, -1}); + setPDUField_1(); + # SCAN_REQ + elseif pdutype_dec == 3 + payload_struct = struct("payload", {payload_len, payload}, "scanA", {6, -1}, "advA", {6, -1}); + setPDUField_3(); + # SCAN_RSP + elseif pdutype_dec == 4 + payload_struct = struct("payload", {payload_len, payload}, "advA", {6, -1}, "scanRspData", {field2_len, -1}); + setPDUField_4(); + # CONNECT_REQ + elseif pdutype_dec == 5 + payload_struct = struct("payload", {payload_len, payload}, "initA", {6, -1}, "advA", {6, -1}, "llData", {22, -1}); + setPDUField_5(); + endif +endfunction + +## Specific payload flipping functions +# ADV_IND, ADV_NONNCONN_IND, ADV_SCAN_IND +function setPDUField_026() + global payload_struct; + + payload = payload_struct(2).payload; + + advA_len = 8 * payload_struct(1).advA; + advData_len = 8 * payload_struct(1).advData; + payload_struct(2).advA = flip(payload(1:advA_len)); + payload_struct(2).advData = flipOctects(payload(advA_len + 1:advA_len + advData_len)); +endfunction + +# ADV_DIRECT_IND +function setPDUField_1() + global payload_struct; + + payload = payload_struct(2).payload; + + advA_len = 8 * payload_struct(1).advA; + initA_len = 8 * payload_struct(1).initA; + payload_struct(2).advA = flip(payload(1:advA_len)); + payload_struct(2).initA = flipOctects(payload(advA_len + 1:advA_len + initA_len)); +endfunction + +# SCAN_REQ +function setPDUField_3() + global payload_struct; + + payload = payload_struct(2).payload; + + scanA_len = 8 * payload_struct(1).scanA; + advA_len = 8 * payload_struct(1).advA; + payload_struct(2).scanA = flip(payload(1:scanA_len)); + payload_struct(2).advA = flipOctects(payload(scanA_len + 1:scanA_len + advA_len)); +endfunction + +# SCAN_RSP +function setPDUField_4() + global payload_struct; + + payload = payload_struct(2).payload; + + advA_len = 8 * payload_struct(1).advA; + scanRspData_len = 8 * payload_struct(1).scanRspData; + payload_struct(2).advA = flip(payload(1:advA_len)); + payload_struct(2).scanRspData = flipOctects(payload(advA_len + 1:advA_len + scanRspData_len)); +endfunction + +# CONNECT_REQ +function setPDUField_5() + global payload_struct; + + payload = payload_struct(2).payload; + + initA_len = 8 * payload_struct(1).initA; + advA_len = 8 * payload_struct(1).advA; + llData_len = 8 * payload_struct(1).llData; + payload_struct(2).initA = flip(payload(1:initA_len)); + payload_struct(2).advA = flipOctects(payload(initA_len + 1:initA_len + advA_len)); + payload_struct(2).llData = flipOctects(payload(initA_len + advA_len + 1:initA_len + advA_len + llData_len)); +endfunction + +## Calculates crc & sets up struct +function setCRC() + global crc; + global crc_struct; + + crc_dec = -1; + crc_rx_dec = -1; + crc_flag = -1; + crc_struct = struct("crc", crc, "crc_dec", crc_dec, "crc_rx_dec", crc_rx_dec, "crc_flag", crc_flag); +endfunction + +## print Everything +function printAll() + global preamble; + global access_address; + global header_struct; + global crc_struct; + + printf("Preamble: 0x%X\n", preamble); + printf("Access Address: 0x%X\n", access_address); + + printf("PDU Type: %s\n", header_struct.pdutype); + printf("PDU Dec: %s\n", header_struct.pdutype_dec); + printf("Reserved 1: "); + disp(header_struct.reserved_1); + printf("Tx_Add: %d\n", header_struct.tx_add); + printf("Rx_Add: %d\n", header_struct.rx_add); + printf("Payload Length: %d\n", header_struct.length); + printf("Reserved 2: "); + disp(header_struct.reserved_2); + + printf("CRC_DEC: %X\n", crc_struct.crc_dec); + printf("CRC_RX_DEC: %X\n", crc_struct.crc_rx_dec); + printf("CRC_FLAG: %X\n", crc_struct.crc_flag); +endfunction + +## Actually call functions +############################################# +loadFile(); +getPreamble(); +getAccessAddress(); +deWhitenPDUCRC(); +getPDUHeader(); +setPayloadFields(); +setCRC(); +printAll(); diff --git a/frames.mat b/frames.mat new file mode 100644 index 0000000000000000000000000000000000000000..5fcea1f044d86d70ba53517b31af9e0d8c7e029e GIT binary patch literal 1122 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQgHY2i*PhE(NSSQtR4_ELGB&p|G*B=yFf>yj5-`93qo*%FkUas2E9S%oT;w~XAdu~A zQhjUj{m1ilRHCP)a;oimq5tFNp?9Y&8y_#weY$}CgJOZ^&gQ4L&h66|$=gz+JMq}{ zFE^$=pY%M@CtB)SO?~=!BIQcw4^{26T4@;_|HE)y zKabu1`|m2}9?=loay97??G&zn7Za%2~;&)V*-)@zebdTNUPzw=3Y&iZen z_l2YnIAp%qd*-~={iQWZ?Lvz`Ngpf@46t9tf9d^;u&R={&qk+jTOYPgowhwWX{Lex zpMdGR42?or5`wgrFOS$ObEZA^a85BxFtd_~Vgsv5@Zn&$TRBO`uA_+=T~j_pZfMd#t}7! z*-T%gZfd6a_3&N%*O;!8*O0o2YliU6GxAt|@_bR#`ylez>$k?$q$&0DqyI=( z{_8!#vV7(Lx=HizKdiK8UjCl%SjCF9fe#`)+U0V?Z2EO=_~p(w-`(=8H@W%ku^X>D z3j6Hll?8ELGq`re+xqy5Q|GMqRYyNNRlMf<`E2j|%In_?Hd#FC6*DvVryTd4C+_+| z=~EgOXVd<@zrJ%9fA20UKEIPjJLl3zG}pR@jb{a>`M?!ndUwaZ;?;?+JD$sC{TI`{UL2QG4cOA4DbIGR@n z^p#k4E-n%EY5HK)^GwKc-uc5vEqKCKzy7E*O*`F@=Sg_<{o4NZ>wg}b{KUxT{-S?d zf49c%TeePHd$~~sQ{&f~1E2(&56(EDeiykK6nN%1UJO3}cP@vU%Z3GO>QZBa8bLS@(ZFbNZxcP12D~y2|nLI3~& literal 0 HcmV?d00001