android藍(lán)牙編程牛刀小試

簡述

在項(xiàng)目中也曾用到安卓藍(lán)牙饺鹃,主要是與藍(lán)牙模塊進(jìn)行通信,所以簡單的進(jìn)行總結(jié)崔拥,做下筆記,以備不時(shí)之需凤覆。

開啟與設(shè)置藍(lán)牙

獲取一個(gè)BluetoothAdapter链瓦,通過getDefaultAdapter()獲取默認(rèn)藍(lán)牙適配器或者自己指定。其次檢測藍(lán)牙是否打開,如若沒有打開慈俯,則通過適配器的.enable()開啟渤刃。還可以自定義藍(lán)牙設(shè)備的可見性以及其時(shí)間。

private void search() {
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        if (!adapter.isEnabled()) {
            adapter.enable();
        }
        Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); //3600為藍(lán)牙設(shè)備可見時(shí)間
        startActivity(enable);
        Intent searchIntent = new Intent(this, ComminuteActivity.class);
        startActivity(searchIntent);
    }

搜索想要通信的設(shè)備

private class BluetoothReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (isLock(device)) {
                    devices.add(device.getName());
                }
                deviceList.add(device);
            }
            showDevices();
        }
    }

     private boolean isLock(BluetoothDevice device) {
        boolean isLockName = (device.getName()).equals(lockName);
        boolean isSingleDevice = devices.indexOf(device.getName()) == -1;
        return isLockName && isSingleDevice;
    }

并進(jìn)行連接

public void connect(final String message) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                BluetoothSocket tmp = null;
                Method method;
                try {
                    method = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
                    tmp = (BluetoothSocket) method.invoke(device, 1);
                } catch (Exception e) {
                    setState(CONNECT_FAILED);
                    Log.e("TAG", e.toString());
                }
                socket = tmp;
                try {
                    socket.connect();
                    isConnect = true;
                } catch (Exception e) {
                    setState(CONNECT_FAILED);
                    Log.e("TAG", e.toString());
                }
            }
        }

在此前贴膘,記得調(diào)用bluetoothAdapter.startDiscovery();方法卖子。他會對其他藍(lán)牙設(shè)備進(jìn)行搜索,持續(xù)12秒刑峡,通過cancelDiscovery()取消洋闽。在搜索藍(lán)牙設(shè)備的過程中,系統(tǒng)可能會發(fā)送以下三個(gè)廣播:ACTION_DISCOVERY_START(開始搜索)突梦,ACTION_DISCOVERY_FINISHED(搜索結(jié)束)和ACTION_FOUND(找到設(shè)備)诫舅。ACTION_FOUND這個(gè)才是我們想要的,這個(gè)Intent中包含兩個(gè)extra fields:EXTRA_DEVICE和EXTRA_CLASS宫患,包含的分別是BluetoothDevice和BluetoothClass刊懈,BluetoothDevice中的EXTRA_DEVICE就是我們搜索到的設(shè)備對象。 確認(rèn)搜索到設(shè)備后娃闲,我們可以從得到的BluetoothDevice對象中獲得設(shè)備的名稱和地址虚汛。

連接設(shè)備之前需要uuid,用來配對畜吊,是一個(gè)128位的字符串id泽疆,用于表示。

注冊廣播與撤銷

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
 receiver = new BluetoothReceiver();
 registerReceiver(receiver, filter);

 //撤銷
 @Override
    protected void onDestroy() {
        unregisterReceiver(receiver);
        super.onDestroy();
    }

進(jìn)行通信

如果鏈接沒有問題玲献,就能夠進(jìn)行通信了殉疼。

if (isConnect) {
                    try {
                        OutputStream outStream = socket.getOutputStream();
                        outStream.write(getHexBytes(message));
                    } catch (IOException e) {
                        setState(WRITE_FAILED);
                        Log.e("TAG", e.toString());
                    }
                    try {
                        InputStream inputStream = socket.getInputStream();
                        int data;
                        while (true) {
                            try {
                                data = inputStream.read();
                                Message msg = handler.obtainMessage();
                                msg.what = DATA;
                                msg.arg1 = data;
                                handler.sendMessage(msg);
                            } catch (IOException e) {
                                setState(READ_FAILED);
                                Log.e("TAG", e.toString());
                                break;
                            }
                        }
                    } catch (IOException e) {
                        setState(WRITE_FAILED);
                        Log.e("TAG", e.toString());
                    }
                }

                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        Log.e("TAG", e.toString());
                    }
                }
            }
        }

將字符串轉(zhuǎn)化為16進(jìn)制:

private byte[] getHexBytes(String message) {
        int len = message.length() / 2;
        char[] chars = message.toCharArray();
        String[] hexStr = new String[len];
        byte[] bytes = new byte[len];
        for (int i = 0, j = 0; j < len; i += 2, j++) {
            hexStr[j] = "" + chars[i] + chars[i + 1];
            bytes[j] = (byte) Integer.parseInt(hexStr[j], 16);
        }
        return bytes;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捌年,隨后出現(xiàn)的幾起案子瓢娜,更是在濱河造成了極大的恐慌,老刑警劉巖礼预,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眠砾,死亡現(xiàn)場離奇詭異,居然都是意外死亡托酸,警方通過查閱死者的電腦和手機(jī)褒颈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來励堡,“玉大人谷丸,你說我怎么就攤上這事∮幔” “怎么了刨疼?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵泉唁,是天一觀的道長。 經(jīng)常有香客問我揩慕,道長亭畜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任迎卤,我火速辦了婚禮拴鸵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘止吐。我一直安慰自己宝踪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布碍扔。 她就那樣靜靜地躺著瘩燥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪不同。 梳的紋絲不亂的頭發(fā)上厉膀,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音二拐,去河邊找鬼服鹅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛百新,可吹牛的內(nèi)容都是我干的企软。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饭望,長吁一口氣:“原來是場噩夢啊……” “哼仗哨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铅辞,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厌漂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后斟珊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苇倡,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年囤踩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旨椒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堵漱,死狀恐怖综慎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怔锌,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站埃元,受9級特大地震影響涝涤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岛杀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一阔拳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧类嗤,春花似錦糊肠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至精偿,卻和暖如春弧圆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笔咽。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工搔预, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶组。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓拯田,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甩十。 傳聞我的和親對象是個(gè)殘疾皇子船庇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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