2015-11-02 50 views
3

什么是目前与Java应用程序连接到HC-05蓝牙模块(Arduino)的最佳实践? Bluecove还是别的? 如果是这样,是否有任何你可以推荐使用HC-05连接的Bluecove的例子?最佳实践 - Java串行蓝牙连接HC-05

+0

是你能够在这个问题上过呢?我也对此感兴趣。请告诉我们您是否取得了进展。 Thx – chris

+0

我想我曾经用[jSerialComm](http://fazecast.github.io/jSerialComm/)库连接到蓝牙设备,因为那些蓝牙设备也将被列为串行设备。这是直接和容易做到的。唯一可能成为问题的是,您可能需要一些适用于Windows的驱动程序。 – redxef

回答

3

前段时间我有同样的问题。在此期间,我找到了一种通过java与HC-05通信的方式。我正在使用blueCove - 也许还有其他库,但这对我很有用。这里是我做的:

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.bluetooth.DeviceClass; 
import javax.bluetooth.DiscoveryAgent; 
import javax.bluetooth.DiscoveryListener; 
import javax.bluetooth.LocalDevice; 
import javax.bluetooth.RemoteDevice; 
import javax.bluetooth.ServiceRecord; 
import javax.bluetooth.UUID; 
import javax.microedition.io.Connector; 
import javax.microedition.io.StreamConnection; 

public class HC05 { 

    boolean scanFinished = false; 
    RemoteDevice hc05device; 
    String hc05Url; 

    public static void main(String[] args) { 
     try { 
      new HC05().go(); 
     } catch (Exception ex) { 
      Logger.getLogger(HC05.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void go() throws Exception { 
     //scan for all devices: 
     scanFinished = false; 
     LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, new DiscoveryListener() { 
      @Override 
      public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { 
       try { 
        String name = btDevice.getFriendlyName(false); 
        System.out.format("%s (%s)\n", name, btDevice.getBluetoothAddress()); 
        if (name.matches("HC.*")) { 
         hc05device = btDevice; 
         System.out.println("got it!"); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void inquiryCompleted(int discType) { 
       scanFinished = true; 
      } 

      @Override 
      public void serviceSearchCompleted(int transID, int respCode) { 
      } 

      @Override 
      public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { 
      } 
     }); 
     while (!scanFinished) { 
      //this is easier to understand (for me) as the thread stuff examples from bluecove 
      Thread.sleep(500); 
     } 

     //search for services: 
     UUID uuid = new UUID(0x1101); //scan for btspp://... services (as HC-05 offers it) 
     UUID[] searchUuidSet = new UUID[]{uuid}; 
     int[] attrIDs = new int[]{ 
      0x0100 // service name 
     }; 
     scanFinished = false; 
     LocalDevice.getLocalDevice().getDiscoveryAgent().searchServices(attrIDs, searchUuidSet, 
       hc05device, new DiscoveryListener() { 
        @Override 
        public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { 
        } 

        @Override 
        public void inquiryCompleted(int discType) { 
        } 

        @Override 
        public void serviceSearchCompleted(int transID, int respCode) { 
         scanFinished = true; 
        } 

        @Override 
        public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { 
         for (int i = 0; i < servRecord.length; i++) { 
          hc05Url = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); 
          if (hc05Url != null) { 
           break; //take the first one 
          } 
         } 
        } 
       }); 

     while (!scanFinished) { 
      Thread.sleep(500); 
     } 

     System.out.println(hc05device.getBluetoothAddress()); 
     System.out.println(hc05Url); 

     //if you know your hc05Url this is all you need: 
     StreamConnection streamConnection = (StreamConnection) Connector.open(hc05Url); 
     OutputStream os = streamConnection.openOutputStream(); 
     InputStream is = streamConnection.openInputStream(); 

     os.write("1".getBytes()); //just send '1' to the device 
     os.close(); 
     is.close(); 
     streamConnection.close(); 
    } 
} 

在我的环境有一些可用的其他设备,但我过滤以HC的结果*。这是从NetBeans中的控制台输出:

run: 
BlueCove version 2.1.0 on winsock 
HC-05 (98D331FD157C) 
got it! 
Nintendo RVL-blabla(00000000FFFF) 
GT-N7100 (00000000EEEE) 
98D399999999 
btspp://98D399999999:1;authenticate=false;encrypt=false;master=false 
BlueCove stack shutdown completed 
BUILD SUCCESSFUL (total time: 14 seconds) 

一旦你知道你的HC-05的URL(btspp:// ...),你能不扫描所有设备,而无需搜索服务连接。这要快得多,代码缩减到几行。

这里是我的Arduino的代码做一些与数据:就当发送“1”,关闭,如果发送“0”切换板LED(引脚13):

/* 
* Bluetooth-Modul anschliessen: +5, GND, 
* Tx an Arduino Rx(Pin 0) 
* Rx an Arduino Tx(Pin 1) 
* 
* Per Handy mit App 'ArduDroid by Techbitar': 
* -Menü 'Connect me to a Bluetooth device 
* -Send Data "A" oder "B" schaltet die LED auf Pin 13 aus bzw. an 
* und gibt Rückmeldung 'LED:on' oder 'LEF:off'. 
* 
* https://www.youtube.com/watch?v=sXs7S048eIo 
* 
* Alternativ mit JavaCode: projekt 'MrBlue' 
*/ 

int ledPin = 13; 
int cmd = -1; 
int flag = 0; 

void setup() { 
    pinMode(ledPin, OUTPUT); 
    digitalWrite(ledPin, LOW); 
    Serial.begin(9600); 
} 

void loop() { 
    if (Serial.available() > 0) { 
    cmd = Serial.read(); 
    flag = 1; 
    } 

    if (flag == 1) { 
    if (cmd == '0') { 
     digitalWrite(ledPin, LOW); 
     Serial.println("LED: off"); 
    } else if (cmd == '1') { 
     digitalWrite(ledPin, HIGH); 
     Serial.println("LED: on"); 
    } else { 
     Serial.print("unknown command: "); 
     Serial.write(cmd); 
     Serial.print(" ("); 
     Serial.print(cmd, DEC); 
     Serial.print(")"); 

     Serial.println(); 
    } 

    flag = 0;  
    cmd = 65; 
    } 

    Serial.flush(); 
    delay(100); 
} 

这里是看中我和我的HC-05之间的协议: enter image description here

我Arduino的乌诺和HC-05之间的连接: enter image description here

+0

我在Win7上得到了“输入代码”窗口......我不知道该插入什么,因为HC-05实际上并没有产生任何代码(并且我可以看看它)??? –

+0

I阅读“尝试使用代码1234或0000”。 1234是我的设备上的默认设置。 – chris