java通过蓝牙将字符串从PC作为客户端发送到移动服务器
我需要通过蓝牙将字符串从PC传输到Android移动设备的帮助。Android移动设备应充当服务器,并在设备屏幕上显示字符串消息。作为客户端的PC应将字符串发送到移动设备
我希望服务器对提取的字符串做出反应(通过蓝牙传输)。这意味着,在一端,服务器必须始终侦听新字符串的到来,但在另一端,服务器仍必须能够对这些消息做出反应(例如,从一个菜单导航到另一个菜单)
我尝试使用BlueCove(2.1.1)作为BluetoothStack(我将BlueCove中的jar作为库添加到这两个项目中),并结合我发现的here服务器-客户机通信示例
更新:
由于使用服务器的RFComm
连接,用户_CC从服务器更新了代码:
public class RFCommServer extends Thread{
//based on java.util.UUID
private static UUID MY_UUID = UUID.fromString("446118f0-8b1e-11e2-9e96-0800200c9a66");
// The local server socket
private BluetoothServerSocket mmServerSocket;
// based on 安卓.bluetooth.BluetoothAdapter
private BluetoothAdapter mAdapter;
private BluetoothDevice remoteDevice;
private Activity activity;
public RFCommServer(Activity activity) {
this.activity = activity;
}
public void run() {
BluetoothSocket socket = null;
mAdapter = BluetoothAdapter.getDefaultAdapter();
// Listen to the server socket if we're not connected
while (true) {
try {
// Create a new listening server socket
Log.d(this.getName(), ".....Initializing RFCOMM SERVER....");
// MY_UUID is the UUID you want to use for communication
mmServerSocket = mAdapter.listenUsingRfcommWithServiceRecord("MyService", MY_UUID);
//mmServerSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME, MY_UUID); // you can also try using In Secure connection...
// This is a blocking call and will only return on a
// successful connection or an exception
socket = mmServerSocket.accept();
} catch (Exception e) {
}
try {
Log.d(this.getName(), "Closing Server Socket.....");
mmServerSocket.close();
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
DataInputStream mmInStream = new DataInputStream(tmpIn);
DataOutputStream mmOutStream = new DataOutputStream(tmpOut);
// here you can use the Input Stream to take the string from the client whoever is connecting
//similarly use the output stream to send the data to the client
RelativeLayout layout = (RelativeLayout) activity.findViewById(R.id.relativeLayout_Layout);
TextView text = (TextView) layout.findViewById(R.id.textView_Text);
text.setText(mmInStream.toString());
} catch (Exception e) {
//catch your exception here
}
}
}
来自here的SPP客户端代码:
/**
* A simple SPP client that connects with an SPP server
*/
public class SampleSPPClient implements DiscoveryListener{
//object used for waiting
private static Object lock=new Object();
//vector containing the devices discovered
private static Vector vecDevices=new Vector();
private static String connectionURL=null;
public static void main(String[] args) throws IOException {
SampleSPPClient client=new SampleSPPClient();
//display local device address and name
LocalDevice localDevice = LocalDevice.getLocalDevice();
System.out.println("Address: "+localDevice.getBluetoothAddress());
System.out.println("Name: "+localDevice.getFriendlyName());
//find devices
DiscoveryAgent agent = localDevice.getDiscoveryAgent();
System.out.println("Starting device inquiry...");
agent.startInquiry(DiscoveryAgent.GIAC, client);
try {
synchronized(lock){
lock.wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Device Inquiry Completed. ");
//print all devices in vecDevices
int deviceCount=vecDevices.size();
if(deviceCount <= 0){
System.out.println("No Devices Found .");
System.exit(0);
}
else{
//print bluetooth device addresses and names in the format [ No. address (name) ]
System.out.println("Bluetooth Devices: ");
for (int i = 0; i <deviceCount; i++) {
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(i);
System.out.println((i+1)+". "+remoteDevice.getBluetoothAddress()+" ("+remoteDevice.getFriendlyName(true)+")");
}
}
System.out.print("Choose Device index: ");
BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
String chosenIndex=bReader.readLine();
int index=Integer.parseInt(chosenIndex.trim());
//check for spp service
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(index-1);
UUID[] uuidSet = new UUID[1];
uuidSet[0]=new UUID("446118f08b1e11e29e960800200c9a66", false);
System.out.println("\nSearching for service...");
agent.searchServices(null,uuidSet,remoteDevice,client);
try {
synchronized(lock){
lock.wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
if(connectionURL==null){
System.out.println("Device does not support Simple SPP Service.");
System.exit(0);
}
//connect to the server and send a line of text
StreamConnection streamConnection=(StreamConnection)Connector.open(connectionURL);
//send string
OutputStream outStream=streamConnection.openOutputStream();
PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(outStream));
pWriter.write("Test String from SPP Client\r\n");
pWriter.flush();
//read response
InputStream inStream=streamConnection.openInputStream();
BufferedReader bReader2=new BufferedReader(new InputStreamReader(inStream));
String lineRead=bReader2.readLine();
System.out.println(lineRead);
}//main
//methods of DiscoveryListener
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
//add the device to the vector
if(!vecDevices.contains(btDevice)){
vecDevices.addElement(btDevice);
}
}
//implement this method since services are not being discovered
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
if(servRecord!=null && servRecord.length>0){
connectionURL=servRecord[0].getConnectionURL(0,false);
}
synchronized(lock){
lock.notify();
}
}
//implement this method since services are not being discovered
public void serviceSearchCompleted(int transID, int respCode) {
synchronized(lock){
lock.notify();
}
}
public void inquiryCompleted(int discType) {
synchronized(lock){
lock.notify();
}
}//end method
}
为了进行测试,我使用了Galaxy Nexus(GT-I9250)和最新的Android API
多亏了user_CC,客户机和服务器现在可以正常运行。但遗憾的是,客户端无法连接到服务器(请参见下面的屏幕截图)。这是因为connectionURL
从未设置过(因此默认情况下,它在这里跳if(connectionURL==null)
)
如何更改客户机代码,以便将其连接到服务器?我需要一个适当的connectionURL
在下面的行中:
StreamConnection streamConnection=(StreamConnection)Connector.open(connectionURL)
到目前为止,我只发现我需要以某种方式获得ServiceRecord
,遗憾的是,在here的示例代码中也没有描述这一点
# 1 楼答案
我不是Java开发人员,但我对Android版的Mono(c#)也有类似的问题
SPP的UUID应该是
"00001101-0000-1000-8000-00805F9B34FB"
这是一个众所周知的标识蓝牙SPP适配器的UID
在我的c#代码中
我猜您可以将Java代码更新为:
虽然我不确定该函数接受哪些参数,所以您可能需要检查一下
我用安卓设备作为客户端,但这些信息可能对你有用,
因此,我将在这里包含我最初从Java示例翻译的c#代码,
因此您应该能够将其翻译回:
基本上,我得到默认的适配器,取消任何正在运行的发现操作,然后 创建另一个设备的套接字。在你的情况下,你需要倾听而不是交流,只是为了获取信息
我希望它能有所帮助,很抱歉,我不能给您提供更多特定于Java的信息
“Update:”刚刚在Java中找到了一个或多或少遵循相同方法的小示例 正如我使用的:Problems with connecting bluetooth SPP in android?
# 2 楼答案
您将需要使用RFComm API来进行通信。我已经设法定义了一个类,它是一个线程,将充当服务器并监听客户端连接。我还提出了一些意见供大家理解
我希望这有帮助
关于你的另一个问题:
声明javax。蓝牙。客户端(PC)UUID类上的UUID应该来自javax。蓝牙。乌伊德
声明java。util。服务器端UUID(Android)