色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>使用Android和Arduino的簡(jiǎn)單藍(lán)牙燈控制器

使用Android和Arduino的簡(jiǎn)單藍(lán)牙燈控制器

2023-02-08 | zip | 0.29 MB | 次下載 | 2積分

資料介紹

描述

簡(jiǎn)介

僅使用智能手機(jī)即可控制家中任何電器的能力非常有趣。這個(gè)項(xiàng)目包括使用一個(gè) Arduino、一個(gè)便宜的藍(lán)牙模塊和一個(gè)繼電器來(lái)控制,例如,通過(guò)藍(lán)牙將它與您的智能手機(jī)連接來(lái)控制一盞燈。這個(gè)項(xiàng)目旨在使用最少的資源和代碼來(lái)簡(jiǎn)單,但仍然包括整個(gè)過(guò)程的重要演示和描述。

重要說(shuō)明:此項(xiàng)目涉及使用高壓設(shè)備,因此建議格外小心,并盡可能在有經(jīng)驗(yàn)的人的監(jiān)督下進(jìn)行此項(xiàng)目。

內(nèi)容簡(jiǎn)介

在接下來(lái)的部分中,我們將按如下所示的順序更詳細(xì)地討論一些主題。

  • 3.演示
  • 4.原理圖
  • 5.Arduino代碼
  • 6. Android 代碼(源代碼和 apk 在這里(github))

原理圖

?
?
?
?
relay_bb_jHQ48yEvCR.png?auto=compress%2Cformat&w=740&h=555&fit=max
?
1 / 2 ?擴(kuò)展插頭和插座在面包板示意圖中無(wú)法很好地表示,所以我拍了一張照片(在下一張照片中)
?

讓我們從設(shè)置藍(lán)牙模塊(圖中左下方的組件)開(kāi)始。如您所見(jiàn),我們從 Arduino 一直拉出 5V 和地線,一直到藍(lán)牙模塊(紅線和黑線)。對(duì)于通信引腳,我們需要將發(fā)射器引腳 (TX) 連接到 Arduino 的接收器引腳 (RX)(綠線),將發(fā)射器引腳連接到 Arduino 的接收器引腳(橙色線)。如果你檢查藍(lán)牙模塊的背面,它會(huì)有一個(gè)標(biāo)簽顯示它的接收器引腳可以處理多少電壓(在我的例子中是 3.3V)并且由于我們的 Arduino 提供 5V,藍(lán)牙模塊在頻繁使用后可能會(huì)燒毀,這是為什么我們需要將該電壓降低到 3.3V。因此,它包含 2 個(gè)電阻器,用作穿過(guò)橙色線的“分壓器”。電阻是 560 歐姆,而第二個(gè)R2是 1K 歐姆。我使用這些電阻器是因?yàn)樗俏以O(shè)備中的電阻器,但如果你有任何其他電阻器,也許你可以使用這個(gè)公式找到適合你的設(shè)置,這會(huì)使電壓降低一點(diǎn):

Vout = (Vsource x R2)/R1+R2

就我而言,我得到了:

Vout = 5 x 1000 / 1560 = 3.2V..足夠接近..

(在谷歌上搜索分壓器計(jì)算器,它會(huì)給你很好的解釋和快速的計(jì)算)。

至于繼電器,我們還為它提供電源和地線(紅線和黑線)以及連接到 Arduino 的 10 號(hào)引腳的信號(hào)線,例如,它將命令繼電器何時(shí)打開(kāi)或關(guān)閉我們的燈。

藍(lán)色線代表插頭/插座擴(kuò)展線。顯然,您不希望將繼電器直接連接到燈的內(nèi)置插頭延長(zhǎng)件,這會(huì)破壞該項(xiàng)目,因此建議購(gòu)買(mǎi)獨(dú)立的插頭/插座延長(zhǎng)件。我所做的是購(gòu)買(mǎi)一根較小的電線,并在上面的幻燈片照片中添加插頭和插座。

現(xiàn)在您有了延長(zhǎng)線,拉出 1 根延長(zhǎng)線并剪斷它,您最終會(huì)得到 2 個(gè)電線末端(如上面的 2 張照片所示)。但是你在哪里可以將這兩個(gè)端點(diǎn)連接到繼電器呢?Relay有3個(gè)端口,NC(常閉),C(Common),NO(常開(kāi))。這意味著,當(dāng)繼電器處于正常狀態(tài)(沒(méi)有信號(hào)發(fā)送到繼電器)時(shí),NC 和 C 端口之間將建立連接。當(dāng)發(fā)送信號(hào)時(shí),將在 C 和 NO 之間設(shè)置連接。這就是為什么我們將 2 線端連接到 C 和 NO 的原因,因?yàn)槲覀兿胂蚶^電器發(fā)送信號(hào),以便讓電流流過(guò)這兩個(gè)通道并為我們的設(shè)備提供能量。這里有很好的解釋:http ://www.pcbheaven.com/wikipages/How_Relays_Work/

Arduino代碼

#include 
#define RELAY 10 
#define LIGHT 13 
SoftwareSerial btm(2,3); // rx tx 
int index = 0; 
char data[10]; 
char c; 
boolean flag = false;
void setup() { 
 pinMode(RELAY,OUTPUT); 
 pinMode(LIGHT,OUTPUT); 
 digitalWrite(RELAY,HIGH); 
 digitalWrite(LIGHT,LOW); 
 btm.begin(9600); 
} 
void loop() { 
   if(btm.available() > 0){ 
     while(btm.available() > 0){ 
          c = btm.read(); 
          delay(10); //Delay required 
          data[index] = c; 
          index++; 
     } 
     data[index] = '\0'; 
     flag = true;   
   }  
   if(flag){ 
     processCommand(); 
     flag = false; 
     index = 0; 
     data[0] = '\0'; 
   } 
} 
void processCommand(){ 
 char command = data[0]; 
 char inst = data[1]; 
 switch(command){ 
   case 'R': 
         if(inst == 'Y'){ 
           digitalWrite(RELAY,LOW); 
           btm.println("Relay: ON"); 
         } 
         else if(inst == 'N'){ 
           digitalWrite(RELAY,HIGH); 
           btm.println("Relay: OFF"); 
         } 
   break; 
   case 'L': 
         if(inst == 'Y'){ 
           digitalWrite(LIGHT,HIGH); 
           btm.println("Light: ON"); 
         } 
         else if(inst == 'N'){ 
           digitalWrite(LIGHT,LOW); 
           btm.println("Light: OFF"); 
         } 
   break; 
 } 
} 

上面顯示的 Arduino 代碼通常分為 4 個(gè)階段。

  • 5.1. 初始化
  • 52.設(shè)置
  • 5.3. 環(huán)形
  • 5.4. 處理命令

重要的是要注意上面的所有代碼都是從 Arduino 的角度來(lái)看的,這意味著所有的“讀取”操作都是 arduino 從其他來(lái)源接收數(shù)據(jù)的操作,寫(xiě)操作是 arduino 發(fā)送的操作消息也發(fā)送到其他來(lái)源。我們系統(tǒng)中的使用順序是這樣的:

  • 一種。用戶單擊智能手機(jī)中的按鈕以執(zhí)行藍(lán)牙命令。
  • b. 藍(lán)牙模塊接收它并將該命令發(fā)送到 Arduino。
  • C。然后 Arduino 將處理該命令并向繼電器發(fā)送信號(hào)以將其打開(kāi)或關(guān)閉。
  • d. 然后 Arduino 向藍(lán)牙模塊發(fā)送成功消息,藍(lán)牙模塊將此消息發(fā)送回智能手機(jī)。

初始化

在前幾行代碼中,我們首先包含允許我們與藍(lán)牙模塊通信的 SoftwareSerial 庫(kù)。它還允許我們將不同的引腳用作接收器和發(fā)射器引腳,而不是為 Arduino 預(yù)定義的引腳(引腳 0 = RX 和引腳 1 = TX)。相反,我們將為 Arduino 的 RX 使用 2 號(hào)引腳,為 Arduino 的 TX 使用 3 號(hào)引腳。然后我們創(chuàng)建常量來(lái)標(biāo)識(shí)我們希望用于每個(gè)組件的引腳,在這種情況下,Arduino 控制繼電器的引腳是 10 號(hào),而控制 Arduino 內(nèi)置燈的引腳是 13 號(hào)。(這是可選的,如果你不想使用它也沒(méi)關(guān)系)。然后,名為“data”的“char”類型的數(shù)據(jù)結(jié)構(gòu)充當(dāng)我們從藍(lán)牙模塊傳入的消息的緩沖區(qū),循環(huán)部分。

設(shè)置

預(yù)定義方法“setup”將是我們實(shí)際預(yù)期的程序開(kāi)始運(yùn)行之前要執(zhí)行的第一個(gè)方法。它基本上允許我們?cè)谥鞒绦驁?zhí)行之前配置一些 Arduino 的引腳和其他東西。因此,我們首先說(shuō) RELAY 引腳將是一個(gè) OUTPUT 引腳,因?yàn)槲覀円l(fā)送一個(gè)信號(hào)來(lái)關(guān)閉或打開(kāi)繼電器。LIGHT 引腳也是如此。此外,我們可以選擇是否要啟動(dòng)程序并使用“digitalWrite”立即開(kāi)始發(fā)送信號(hào)。在繼電器的情況下,我們確實(shí)想要開(kāi)始發(fā)送信號(hào),因?yàn)槔^電器的工作方式有點(diǎn)違反直覺(jué),因?yàn)槔^電器的工作方式是當(dāng)繼電器檢測(cè)到信號(hào)時(shí),它會(huì)自行關(guān)閉,否則它切換回 ON。

環(huán)形

顧名思義,循環(huán)是一種被迭代調(diào)用的方法,以便重復(fù)處理我們傳遞給它的任何信息話雖如此,我們首先檢查是否有來(lái)自藍(lán)牙模塊的傳入消息,如果有,則我們進(jìn)入一個(gè)循環(huán)以繼續(xù)逐字節(jié)讀取這些消息(每次迭代讀取類型“char”)。關(guān)于代碼 delay(10) 行,老實(shí)說(shuō),我不完全確定為什么代碼只適用于該 delay(10)。當(dāng)我嘗試不使用那行代碼時(shí),消息沒(méi)有被正確地接收到稱為“數(shù)據(jù)”(我們的緩沖區(qū))的字符數(shù)組中,我得到的只是緩沖區(qū)中的一堆垃圾。我最好的猜測(cè),這就是我使用它的原因,事實(shí)上,我們的組件在接收和傳輸時(shí)有不同的處理速度,在這種情況下是 Arduino 和藍(lán)牙模塊。網(wǎng)絡(luò)上的一些 Arduino 代碼中,可以看到一些延遲代碼行,其中一些可能用于此目的。在這個(gè)延遲之后,假設(shè)我們已經(jīng)讀取了消息的第一個(gè)字節(jié) (char),然后我們將它添加到我們的緩沖區(qū)并增加稱為“索引”的計(jì)數(shù)器以繼續(xù)沿著數(shù)組的維度迭代和遞增地添加更多字節(jié)/緩沖。消息被讀取后,我們退出 while 循環(huán)并說(shuō)“是”,有一條消息要處理(通過(guò)將標(biāo)志設(shè)置為 true)。并且還添加一個(gè) '\0' 來(lái)指示緩沖區(qū)的結(jié)束。最后,

處理命令

最后,processCommand 方法將決定如何處理之前在循環(huán)代碼部分收到的藍(lán)牙消息。對(duì)于這個(gè)項(xiàng)目,我決定通過(guò)藍(lán)牙將智能手機(jī)發(fā)送的簡(jiǎn)單命令發(fā)送到 Arduino。要打開(kāi)繼電器,基于 Android 應(yīng)用程序構(gòu)建的簡(jiǎn)單消息將以字節(jié)形式發(fā)送以下字符串:“RY”(繼電器是)如果我們希望打開(kāi)繼電器或“RN”(繼電器否)如果我們希望打開(kāi)繼電器關(guān)閉。如前所述,我還包括一個(gè)“附加組件”,您可以在其中控制 Arduino 的內(nèi)置 LED(引腳號(hào) 13),因此命令為“LY”和“LN”,但您不必使用它。請(qǐng)記住,要打開(kāi)繼電器,我們需要從 Arduino 發(fā)送一個(gè)低電平信號(hào),反之亦然。

安卓代碼

在本節(jié)中,我們將討論如何實(shí)現(xiàn) Android 應(yīng)用程序以與藍(lán)牙模塊通信。我不會(huì)介紹 Android 功能的某些方面以及您應(yīng)該如何做某些事情,但主要介紹源代碼的內(nèi)容并對(duì)其進(jìn)行更好的解釋。但一般來(lái)說(shuō),該應(yīng)用程序是使用 Android Studio (AS) 創(chuàng)建的,并且 AS 允許您選擇一個(gè)簡(jiǎn)單的模板來(lái)啟動(dòng)您的應(yīng)用程序,選擇該基本模板。然后,AS 設(shè)置了啟動(dòng)應(yīng)用程序所需的所有內(nèi)容,包括 Android 清單,您可以在其中包含應(yīng)用程序的一般屬性,例如應(yīng)用程序需要的權(quán)限。一個(gè)簡(jiǎn)單的空白布局,您可以在其中添加一些組件(如按鈕)和一個(gè) java 源代碼,用于初始化應(yīng)用程序并控制布局上的所有 UI 內(nèi)容。如果你沒(méi)有 如果不選擇基本模板并選擇空模板,那么您始終可以創(chuàng)建一個(gè)新活動(dòng)來(lái)設(shè)置您需要的布局和相應(yīng)的源文件。源代碼和資源也可以在我的github上找到:https://github.com/serge144/ArduinoConnectorBT

下面是我們接下來(lái)要介紹的內(nèi)容:

  • 安卓清單
  • 簡(jiǎn)單的布局
  • Java 源代碼 (Ardcon.java + ConnectedThread.java)

6.1 安卓清單

 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="flipser.bluetooth">
   <uses-permission android:name="android.permission.BLUETOOTH"/>
   <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
   <application
 android:allowBackup="true"
 android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:supportsRtl="true"
 android:theme="@style/AppTheme">
        <activity android:name=".Bluetooth">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
    application>
manifest>

android 清單描述了應(yīng)用程序的主要結(jié)構(gòu)以及應(yīng)用程序?qū)⑹褂媚男?a href='http://www.1cnz.cn/v/tag/527/' target='_blank' class='arckwlink_none'>操作系統(tǒng)的功能。在我們的例子中,我們需要包括與藍(lán)牙接口相關(guān)的權(quán)限。從上面的代碼中我們可以看出,為了使用操作系統(tǒng)的藍(lán)牙功能,插入了以下幾行:

簡(jiǎn)單布局

布局如下圖所示:

?
layout_mqeu1pGl8O.png?auto=compress%2Cformat&w=740&h=555&fit=max
布局,圖片直接取自Android Studio
?

文本視圖僅用于輸出 Arduino + 藍(lán)牙模塊發(fā)送的消息。例如,通過(guò)向 arduino 發(fā)送消息,如果成功,它將向智能手機(jī)發(fā)回響應(yīng),并在文本視圖中顯示該消息。然后我們有兩個(gè)按鈕,繼電器按鈕和燈按鈕,用于打開(kāi)/關(guān)閉 Arduino 上的內(nèi)置 LED。我相信在這種情況下沒(méi)有必要包含代碼,因?yàn)槟枰龅木褪菍蓚€(gè)按鈕和一個(gè)文本視圖拖到您想要放置的位置。

6.3 Java 源代碼

(Ardcon.java)

我們將介紹的第一個(gè)源文件是Ardcon.java文件 (Arduino Connection)。這個(gè)文件主要做的是先初始化藍(lán)牙,建立連接。然后它檢查我們的兩個(gè)按鈕是否被點(diǎn)擊,并做相應(yīng)的操作。那么讓我們從初始化開(kāi)始:

public final static String MODULE_MAC = "98:D3:34:90:6F:A1";
public final static int REQUEST_ENABLE_BT = 1;
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
BluetoothAdapter bta;                 //bluetooth stuff
BluetoothSocket mmSocket;             //bluetooth stuff
BluetoothDevice mmDevice;             //bluetooth stuff 
Button switchLight, switchRelay;      //UI stuff
TextView response;                    //UI stuff
boolean lightflag = false;            //flags to determ. if ON/OFF
boolean relayFlag = true;             //flags to determ. if ON/OFF
ConnectedThread btt = null;           //Our custom thread
public Handler mHandler;              //this receives messages from thread

在我的例子中,藍(lán)牙模塊的媒體訪問(wèn)控制或 MAC 地址是 為了找到你的藍(lán)牙模塊的MAC,你首先需要打開(kāi)電路,或者只是設(shè)置一些基本電路來(lái)打開(kāi)藍(lán)牙模塊。然后,使用您的智能手機(jī)檢查藍(lán)牙信號(hào),您的藍(lán)牙模塊應(yīng)該連同其 MAC 地址一起出現(xiàn)。如果未顯示 MAC 地址,請(qǐng)嘗試使用其他設(shè)備,例如您的 PC。然后藍(lán)牙模塊 HC-06 的 UUID始終是相同的,如果您使用的是 Android,這個(gè)數(shù)字可能會(huì)改變 iOS 使用。(查找 UUID 以獲取更多信息)。"98:D3:34:90:6F:A1"00001101-0000-1000-8000-00805f9b34fb

然后我們初始化按鈕、文本視圖、標(biāo)志以確定繼電器和燈是關(guān)閉還是打開(kāi),一個(gè) ConnectedThread 主要負(fù)責(zé)向/從 Arduino + 藍(lán)牙發(fā)送/接收消息,最后是一個(gè)負(fù)責(zé)處理的處理程序從線程接收到的消息。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ardcon);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    Log.i("[BLUETOOTH]", "Creating listeners");
    response = (TextView) findViewById(R.id.response);
    switchRelay = (Button) findViewById(R.id.relay);
    switchLight = (Button) findViewById(R.id.switchlight);
    switchLight.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("[BLUETOOTH]", "Attempting to send data");
            if (mmSocket.isConnected() && btt != null) { 
                if (!lightflag) {
                    String sendtxt = "LY";
                    btt.write(sendtxt.getBytes());
                    lightflag = true;
                } else {
                    String sendtxt = "LN";
                    btt.write(sendtxt.getBytes());
                    lightflag = false;
                }
            } else {
                Toast.makeText(Ardcon.this, "Something went wrong", Toast.LENGTH_LONG).show();
            }
        }
    });
    switchRelay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("[BLUETOOTH]", "Attempting to send data");
            if (mmSocket.isConnected() && btt != null) {
                if(relayFlag){
                    String sendtxt = "RY";
                    btt.write(sendtxt.getBytes());
                    relayFlag = false;
                }else{
                    String sendtxt = "RN";
                    btt.write(sendtxt.getBytes());
                    relayFlag = true;
                }
              //disable the button and wait for 4 seconds to enable it again                switchRelay.setEnabled(false);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try{
                            Thread.sleep(4000);
                        }catch(InterruptedException e){
                            return;
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                switchRelay.setEnabled(true);
                            }
                        });
                    }
                }).start();
            } else {
                Toast.makeText(Ardcon.this, "Something went wrong", Toast.LENGTH_LONG).show();
            }
        }
    });
bta = BluetoothAdapter.getDefaultAdapter();
  //if bluetooth is not enabled then create Intent for user to turn it onif(!bta.isEnabled()){
  Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT);
 }else{
  initiateBluetoothProcess();
 }
}

我現(xiàn)在將簡(jiǎn)要概述上面的代碼。

這是初始化應(yīng)用程序和所有 UI 的方法,我們首先從布局中獲取按鈕和文本視圖的引用。然后我們向兩個(gè)按鈕添加一些邏輯。例如,對(duì)于 switchLight,點(diǎn)擊偵聽(tīng)器將首先確定是否存在與模塊的藍(lán)牙連接,如果存在,則發(fā)送消息以關(guān)閉或打開(kāi)燈。這同樣適用于 switchRelay 按鈕,但在這種情況下,我們還包括一個(gè)小計(jì)時(shí)器,在執(zhí)行操作后將繼電器按鈕禁用 4 秒。這是一項(xiàng)安全措施,因?yàn)槲覀儾粫?huì)在快速按下按鈕的同時(shí)快速打開(kāi)/關(guān)閉來(lái)開(kāi)始弄亂設(shè)備。然后,在完成所有按鈕邏輯后,我們嘗試在初始化時(shí)立即連接到藍(lán)牙模塊。ACTION_REQUEST_ENABLE這將觸發(fā)一個(gè)對(duì)話框窗口以確認(rèn)藍(lán)牙激活。然后我們?cè)O(shè)置一個(gè) onActivityResult 來(lái)接收用戶的確認(rèn),如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK && requestCode == REQUEST_ENABLE_BT){
        initiateBluetoothProcess();
    }
}

然后,initiaBluetoothProcess() 方法與藍(lán)牙模塊建立連接并創(chuàng)建一個(gè)處理程序,該處理程序是從 ConnectedThread 接收信息的組件,同樣,該線程負(fù)責(zé)從藍(lán)牙模塊接收/發(fā)送藍(lán)牙信息阿杜伊諾。處理程序只需使用響應(yīng)文本更新 TextView。

public void initiateBluetoothProcess(){
    if(bta.isEnabled()){
        //attempt to connect to bluetooth module        BluetoothSocket tmp = null;
        mmDevice = bta.getRemoteDevice(MODULE_MAC);
        //create socket        try {
            tmp = mmDevice.createRfcommSocketToServiceRecord(MY_UUID);
            mmSocket = tmp;
            mmSocket.connect();
            Log.i("[BLUETOOTH]","Connected to: "+mmDevice.getName());
        }catch(IOException e){
            try{mmSocket.close();}catch(IOException c){return;}
        }
        Log.i("[BLUETOOTH]", "Creating handler");
        mHandler = new Handler(Looper.getMainLooper()){
            @Override
            public void handleMessage(Message msg) {
                //super.handleMessage(msg);                if(msg.what == ConnectedThread.RESPONSE_MESSAGE){
                    String txt = (String)msg.obj;
                    response.append("\n" + txt);
                }
            }
        };
        Log.i("[BLUETOOTH]", "Creating and running Thread");
        btt = new ConnectedThread(mmSocket,mHandler);
        btt.start();
    }
}

(ConnectedThread.java)

如前所述,ConnectedThread.java文件包含通過(guò)藍(lán)牙發(fā)送和接收消息的必要代碼。它還通過(guò)處理程序?qū)⑿畔l(fā)送到Ardcon.java源文件。

public class ConnectedThread extends Thread{
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public static final int RESPONSE_MESSAGE = 10;
Handler uih;
...

首先我們用 Thread 擴(kuò)展我們的類,然后我們初始化一些允許我們接收和發(fā)送消息到藍(lán)牙模塊的對(duì)象。Handler 是負(fù)責(zé)將響應(yīng)發(fā)送回 UI 線程 (Ardcon.java) 的組件,以便我們可以更新文本視圖。

public ConnectedThread(BluetoothSocket socket, Handler uih){
    mmSocket = socket;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;
    this.uih = uih;
    Log.i("[THREAD-CT]","Creating thread");
    try{
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    } catch(IOException e) {
        Log.e("[THREAD-CT]","Error:"+ e.getMessage());
    }
    mmInStream = tmpIn;
    mmOutStream = tmpOut;
    try {
        mmOutStream.flush();
    } catch (IOException e) {
        return;
    }
    Log.i("[THREAD-CT]","IO's obtained");
}

因此,我們的 ConnectedThread 接收到名為 BluetoothSocket 的藍(lán)牙模塊和 Handler 的連接。此構(gòu)造函數(shù)初始化通信的輸入和輸出流。

public void run(){
    BufferedReader br;
    br = new BufferedReader(new InputStreamReader(mmInStream));
    while(true){
        try{            String resp = br.readLine();
            Message msg = new Message();
            msg.what = RESPONSE_MESSAGE;
            msg.obj = resp;
            uih.sendMessage(msg);
        }catch(IOException e){
            break;
        }
    }
    Log.i("[THREAD-CT]","While loop ended");
}

然后,我們覆蓋Thread擴(kuò)展的run方法,在這個(gè)方法中,有一個(gè)循環(huán)不斷地尋找新到達(dá)的消息,如果是,則通過(guò)handler返回到UI線程。

public void write(byte[] bytes){
    try{
        Log.i("[THREAD-CT]", "Writting bytes");
        mmOutStream.write(bytes);
    }catch(IOException e){}
}
public void cancel(){
    try{
        mmSocket.close();
    }catch(IOException e){}
}

最后,這兩個(gè)方法負(fù)責(zé)通過(guò)Outputstream向藍(lán)牙模塊寫(xiě)入(發(fā)送字節(jié))和取消連接。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
主站蜘蛛池模板: 女人操男人| 疯狂第一次国语| 蜜芽丅v新网站在线观看| 中文字幕亚洲乱码熟女在线| 久久精品视在线观看2| 一本色道久久88综合日韩精品| 九九免费高清在线观看视频| 一本道久在线综合色姐| 久久久久免费视频| 真实国产熟睡乱子伦对白无套 | 女子扒开腿让男生桶爽| 97超碰在线视频人人av| 欧美14videosex性欧美成人| WWW国产亚洲精品久久久日本| 日本在线免费| 国产成人久久精品激情| 亚洲 视频 在线 国产 精品| 国产一浮力影院| 亚洲一区免费看| 老司机试看午夜| G0GO人体大尺香蕉| 色精品极品国产在线视频| 国产精品99| 亚洲精品线在线观看| 久久毛片基地| 99久久做夜夜爱天天做精品| 日本特黄的免费大片视频| 国产精品VIDEOSSEX久久发布| 亚洲第一免费播放区| 久久久久久久国产精品视频| 91久久综合精品国产丝袜长腿| 全黄H全肉细节文NP| 国产精品乱码色情一区二区视频 | 好男人在线观看免费视频WWW| 伊人久99久女女视频精品免| 欧美丰满熟妇BBB久久久| 国产AV精品国语对白国产| 亚洲黄视频在线观看| 拉菲娱乐主管高工资q39709| 爱暖暖1000部免费| 亚洲成在人线视频|