第二篇 藍(lán)牙廣播的數(shù)據(jù)解析。

藍(lán)牙廣播數(shù)據(jù)解析

從上一篇我們提到的那樣我們從系統(tǒng)的接收到了 關(guān)于藍(lán)牙數(shù)據(jù)的相關(guān)信息搏明,藍(lán)牙的設(shè)備對象、藍(lán)牙信號、標(biāo)準(zhǔn)藍(lán)牙廣播數(shù)據(jù)包等數(shù)據(jù)颁股。

==================================================================================================================


作為我們開發(fā)的場景來說,我們需要對我們的設(shè)備進(jìn)行必要的過濾傻丝,但是這個(gè)過濾的數(shù)據(jù)來源除了廣播數(shù)據(jù)包甘有,好像是沒有其他辦法的。當(dāng)然名字也還是那么靠譜的葡缰,會有系統(tǒng)的緩存的亏掀。

所以我們需要做一些藍(lán)牙廣播的數(shù)據(jù)的解析忱反。說到藍(lán)牙的數(shù)據(jù)的數(shù)據(jù)解析的問題,就不得不提關(guān)于藍(lán)牙的數(shù)據(jù)結(jié)構(gòu)滤愕,不過這個(gè)網(wǎng)上有很多温算,百度一下,出來的結(jié)果能嚇?biāo)滥慵溆埃渍摺.吘苟饶锸菂柡Φ摹?------言歸正傳:
  藍(lán)牙的數(shù)據(jù)結(jié)構(gòu)采用的方式。這有一篇文章還不錯(cuò)的推薦給大家 

http://blog.chinaunix.net/uid-28852942-id-5176579.html

其實(shí)在我們android 開發(fā)的數(shù)據(jù)解析中 倒是沒有說的那么復(fù)雜宇智,比方來說蔓搞,

0201060303f1fe03190000020a080aff0000000000000000041509efbbbfe5beaee699ba426561636f6ee6a0bc5a690

上方是一個(gè)藍(lán)牙數(shù)據(jù)(這個(gè)數(shù)據(jù)是我隨便弄得只是做為示范)

對于我們開發(fā)來說

我們知道這樣的數(shù)據(jù)構(gòu)成就OK了

  1. 020106
  • 這是一個(gè)完全的“最小單元有意義的藍(lán)牙廣播數(shù)據(jù)”了吧。
  • 02表示這個(gè)數(shù)據(jù)的長度,也就是Length.
  • 01表示這個(gè)信息的標(biāo)識随橘,也就是Tag.
  • 01后面開始就是這個(gè)數(shù)據(jù)含有真正的數(shù)據(jù)喂分,
  • 此時(shí)需要注意的是02表示長度是除去自身以外的長度, 如果你要數(shù)字節(jié)個(gè)數(shù)的話 你需要加1
  1. 0303f1fe

  2. 03190000

  3. 020a08

  4. 0a ff 00 00 00 00 00 00 00 00 04

  5. 15 09 efbbbfe5beaee699ba426561636

其他的都是一樣的 我就不做一一解析了机蔗。

所以我們解析這個(gè)數(shù)據(jù)的時(shí)候都是解析相關(guān)的TAG蒲祈,然后可以拿到我們需要的數(shù)據(jù),我記得剛剛開始的時(shí)候萝嘁,我是拿著這個(gè)數(shù)據(jù)直姐用索引取值梆掸,結(jié)果我們的固件版本一升級,索引值變了牙言。我那個(gè)寫死的數(shù)據(jù)就完蛋了酸钦。結(jié)果當(dāng)然是教育了啦。

提一些的是關(guān)于常見的Tag,01一般表示是否可連接的狀態(tài)咱枉。08卑硫、09一般都是可以表示設(shè)備的名稱。但是也有很多是不廣播名稱的蚕断。

好吧BB那么多貼上源碼才是關(guān)鍵以下是源碼:

public static class BTScanInfo {
       //數(shù)據(jù)庫
       public BleDevice dev;
       public byte[] advt;
       public double rssi = -10000.0;
       public static final int
               BT_ADVT_FIELD_SHORT_SVC_UUID_MORE = 0x02,
               BT_ADVT_FIELD_SHORT_SVC_UUID_COMP = 0x03,
               BT_ADVT_FIELD_MANU_INFO = 0xFF,
               BT_ADVT_FIEFD_NAME_INFO = 0x09,
               BT_ADVT_FIEFD_SUPPROTS_INFO = 0xFF;

       public int svcMoreOffset = -1, svcMoreLen = -1,
               svcOffset = -1, svcLen = -1, isSupprots = 14,
               manuOffset = -1, manuLen = -1,
               nameOffset = -1, nameLen = -1,
               lightOffset = -1, lightLen = -1;


       public BTScanInfo(BleDevice dev_, byte[] advt_, double rssi_) {
           Log.i(dev_.getAddress(), "BtScanInfo==" + dev_.getAddress());
           dev = dev_;
           advt = advt_;
           rssi = rssi_;
           ParseAdvt();
       }
       public void ParseAdvt() {
           if (advt == null)
               return;
           for (int offset = 0 ; offset < advt.length ; ) {
               int fieldLen = (advt[ offset ] & 0xFF);
               if (fieldLen < 1) {
                   offset += fieldLen + 1;
                   // Log.v(TAG, "Find a invalid scan advert field length: " + fieldLen );
                   continue;
               }
               // a valid field.
               if (offset + fieldLen <= advt.length) {
                   int fieldType = advt[ offset + 1 ] & 0xFF;
                   if (fieldType == BT_ADVT_FIELD_SHORT_SVC_UUID_MORE) {
                       svcMoreOffset = offset;
                       svcMoreLen = fieldLen;
                   } else if (fieldType == BT_ADVT_FIELD_SHORT_SVC_UUID_COMP) {
                       svcOffset = offset;
                       svcLen = fieldLen;
                   } else if (fieldType == BT_ADVT_FIELD_MANU_INFO & fieldLen == BT_ADVT_FIEFD_NAME_INFO) {
                       manuOffset = offset;
                       manuLen = fieldLen;
                   } else if (fieldType == BT_ADVT_FIEFD_NAME_INFO) {
                       //獲取到名字信息
                       nameOffset = offset;
                       nameLen = fieldLen;
                   }
               }
               offset += fieldLen + 1;
           }
       }

下一篇:關(guān)于藍(lán)牙通信接口的相關(guān)介紹
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欢伏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亿乳,更是在濱河造成了極大的恐慌硝拧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葛假,死亡現(xiàn)場離奇詭異障陶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桐款,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門咸这,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魔眨,你說我怎么就攤上這事媳维∧鹧” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵侄刽,是天一觀的道長指黎。 經(jīng)常有香客問我,道長州丹,這世上最難降的妖魔是什么醋安? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮墓毒,結(jié)果婚禮上吓揪,老公的妹妹穿的比我還像新娘。我一直安慰自己所计,他們只是感情好柠辞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著主胧,像睡著了一般叭首。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踪栋,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天焙格,我揣著相機(jī)與錄音,去河邊找鬼夷都。 笑死眷唉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的损肛。 我是一名探鬼主播厢破,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荣瑟,長吁一口氣:“原來是場噩夢啊……” “哼治拿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笆焰,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劫谅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嚷掠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捏检,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年不皆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贯城。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霹娄,死狀恐怖能犯,靈堂內(nèi)的尸體忽然破棺而出鲫骗,到底是詐尸還是另有隱情,我是刑警寧澤踩晶,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布执泰,位于F島的核電站,受9級特大地震影響渡蜻,放射性物質(zhì)發(fā)生泄漏术吝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一茸苇、第九天 我趴在偏房一處隱蔽的房頂上張望排苍。 院中可真熱鬧,春花似錦学密、人聲如沸纪岁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幔翰。三九已至,卻和暖如春西壮,著一層夾襖步出監(jiān)牢的瞬間遗增,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工款青, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留做修,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓抡草,卻偏偏與公主長得像饰及,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子康震,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容