PC端怎么与通过蓝牙模块实现对PC端系统的控制调节,比如HC0,5-6去控制win的操作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PC端怎么与通过蓝牙模块实现对PC端系统的控制调节,比如HC0,5-6去控制win的操作?相关的知识,希望对你有一定的参考价值。
打个比方说:我想用单片机连接的hc05发送数据给PC端(1,0),1的话能够增加电脑屏幕的亮度1,0的话能减少屏幕亮度1。我的思维方向大概有两个:一,电脑端直接蓝牙搜索连接单片机蓝牙模块HC05,单片机的数据通过hc05透传给电脑端,电脑端判断(1,0)去更改设置。二:两个HC05,一主一从,一个通过USB转TTL连接电脑,单片机05透传数据,电脑端判断(1,0)去更改设置。
在这两个方案大概就硬软件的区别吧(前者可能需要软件辅助吧),但我的问题大概雷同的:①数据通过蓝牙传到电脑端,电脑端是如何get到的数据存在哪里的?②我怎么获取它?③我该怎么去判断这个数据是多少(或者说电脑)?④这个数据怎么调用win10指令。⑤某个蓝牙键盘的FN+F11是增强屏幕亮度的,另一个键盘却是FN+F10,二者单独的键盘扫描F10和F11数据传过去可能不一样的,但是组合键发过去的可能是一样的。请问这里是直接发送的是种数据还是win10直接调用的命令?我该怎么知道一些常见的数据或者是win命令呢?
有没有哪些电子大佬或者计算机大佬给个例程?或者有些好的方向、建议。感激不尽....
网上一搜,大多都是什么HC05控制单片机的LED,没什么相关资料,我在互联网上站个桩,给后人搜索时留点啥的....
五、蓝牙模块如何与电脑连接(从模式有效)
以下以跟带蓝牙的电脑(WIN10系统)的配对使用为例:
1、首先给蓝牙模式上电,此时LED闪烁,点击电脑中的“开始”--“设置”--“设备”--“蓝牙和其他设备”--“添加蓝牙或其他设备”。
2、系统将搜索蓝牙设备,默认设备名称为“HC05”(可以自行修改名称),双击或者右键选择“添加蓝牙设备”,输入配对密码(默认为“1234”)。
3、点击“下一步”,如果密码正确,则电脑与蓝牙模块将建立起连接,如果以前没有安装过蓝牙串口设备,则系统将自动安装驱动并生成虚拟串口。
4、打开“此电脑”“管理”“设备管理器”端口(COM和LPT)
可以看到3个串口。
Silicon Labs CP210x USB to UART Bridge(COM3):这个是USB转串口
蓝牙链接上的标准串行(COM26):蓝牙串口
蓝牙链接上的标准串行(COM27):这个不能使用,汇承的FAE也不知道是啥原因有这个串口。 参考技术B 前者稍微麻烦点,Win端要写个蓝牙的上位机软件,建议基于例程更改。
后者稍微简单,因为HC05对于Win来说就是个USB Serial设备,可以用通用的COM控件去接收和判断处理。
至于调节屏幕亮度,有现成的WinAPI函数。你可以去网上搜一下。
PC端实现蓝牙开发
蓝牙作为一种短距离无线通讯技术,越来越融合到我们的生活当中,软件开发也是随处可见。本文介绍的是PC端与其他蓝牙设备建立通讯的一个案例。
蓝牙客户端,即是请求连接的一端,搜索会发现可连接的蓝牙设备名称。
蓝牙服务端,提供服务的一端。往往生活中使用到的蓝牙(比如手机是个双重角色),又是客户端又是服务端。
蓝牙通信的原理
蓝牙技术规定每一对设备之间进行蓝牙通讯时,必须一个为主角色,另一为从角色,才能进行通信,通信时,必须由主端进行查找,发起配对,建链成功后,双方即可收发数据。蓝牙主端设备发起呼叫,首先是查找,找出周围处于可被查找的蓝牙设备。主端设备找到从端蓝牙设备后,与从端蓝牙设备进行配对,此时需要输入从端设备的PIN码,也有设备不需要输入PIN码。
一、jar包
首先,在PC端实现蓝牙java并没有提供官方jar包,本文使用的是一个第三方库。需要手动导入到maven仓库,
不会导仓库的请参考https://www.cnblogs.com/zeussbook/p/9930679.htm。
第三方jar包下载地址:https://sourceforge.net/projects/bluecove/files/BlueCove/2.1.0/bluecove-2.1.0.jar/download
二、代码部分
2.1蓝牙服务端
package com.shunyutong.test.bluetooth; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.LocalDevice; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; import javax.microedition.io.StreamConnectionNotifier; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @Auther: lanhaifeng * @Date: 2020/5/4 0004 16:28 * @Description: 蓝牙服务端 * @statement: */ public class BluetoothServer implements Runnable{ //本机蓝牙设备 private LocalDevice local = null; // 流连接 private StreamConnection streamConnection = null; // 输入流 private InputStream inputStream; private OutputStream outputStream; //接入通知 private StreamConnectionNotifier notifier; //基于缓存的线程池 private final static ExecutorService service = Executors.newCachedThreadPool(); public String serverName; public String serverUUID; private OnServerListener mServerListener; /** * 服务监听接口 */ public interface OnServerListener { void onConnected(InputStream inputStream, OutputStream outputStream); void onDisconnected(); void onClose(); } /** * 蓝牙服务有参构造函数 * @param serverUUID id * @param serverName 名称 */ public BluetoothServer(String serverUUID, String serverName) { this.serverUUID = serverUUID; this.serverName = serverName; } /** * 启动 */ public void start() { try { local = LocalDevice.getLocalDevice(); if (!local.setDiscoverable(DiscoveryAgent.GIAC)) System.out.println("请将蓝牙设置为可被发现"); //作为服务端,被请求 String url = "btspp://localhost:" + serverUUID+ ";name="+serverName; notifier = (StreamConnectionNotifier) Connector.open(url); service.submit(this); } catch (IOException e) { System.out.println(e.getMessage());; } } /** * 重写run() */ @Override public void run() { try { streamConnection = notifier.acceptAndOpen(); //阻塞的,等待设备连接 inputStream = streamConnection.openInputStream(); outputStream = streamConnection.openOutputStream(); if (mServerListener != null) { mServerListener.onConnected(inputStream, outputStream); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { } } public OnServerListener getServerListener() { return mServerListener; } public void setServerListener(OnServerListener mServerListener) { this.mServerListener = mServerListener; } }
2.2蓝牙客户端
package com.shunyutong.test.bluetooth; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; import java.util.Set; import javax.bluetooth.RemoteDevice; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; /** * @Auther: lanhaifeng * @Date: 2020/5/4 0004 15:37 * @Description:蓝牙客户端类 * @statement: */ public class BluetoothClient { private StreamConnection streamConnection;//流连接 private OnDiscoverListener onDiscoverListener = null;//发现监听 private OnClientListener onClientListener = null;//客户端监听 /** * 客户端监听 */ public interface OnClientListener { void onConnected(InputStream inputStream, OutputStream outputStream); void onConnectionFailed(); void onDisconnected(); void onClose(); } /** * 发现监听 */ public interface OnDiscoverListener { void onDiscover(RemoteDevice remoteDevice); } /** * 无参构造函数 */ public BluetoothClient() { } /** * 查找所有 * @throws IOException * @throws InterruptedException */ public void find() throws IOException, InterruptedException { //附近所有的蓝牙设备,必须先执行 runDiscovery Set<RemoteDevice> devicesDiscovered = RemoteDeviceDiscovery.getDevices(); Iterator<RemoteDevice> itr = devicesDiscovered.iterator(); //连接 while (itr.hasNext()) { RemoteDevice remoteDevice = itr.next(); onDiscoverListener.onDiscover(remoteDevice); } } /** * 启动连接 * @param remoteDevice * @param serviceUUID * @throws IOException * @throws InterruptedException */ public void startClient(RemoteDevice remoteDevice, String serviceUUID) throws IOException, InterruptedException { String url = RemoteDeviceDiscovery.searchService(remoteDevice, serviceUUID); streamConnection = (StreamConnection) Connector.open(url); if (this.onClientListener != null) { this.onClientListener.onConnected(streamConnection.openInputStream(), streamConnection.openOutputStream()); } } public OnDiscoverListener getOnDiscoverListener() { return onDiscoverListener; } public void setOnDiscoverListener(OnDiscoverListener onDiscoverListener) { this.onDiscoverListener = onDiscoverListener; } public OnClientListener getClientListener() { return onClientListener; } public void setClientListener(OnClientListener onClientListener) { this.onClientListener = onClientListener; } }
2.3设备查找类
package com.shunyutong.test.bluetooth; import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.Vector; import javax.bluetooth.DataElement; 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; /** * @Auther: lanhaifeng * @Date: 2020/5/4 0004 16:07 * @Description:设备查找类 * @statement: */ public class RemoteDeviceDiscovery { public final static Set<RemoteDevice> devicesDiscovered = new HashSet<RemoteDevice>(); public final static Vector<String> serviceFound = new Vector<String>(); final static Object serviceSearchCompletedEvent = new Object(); final static Object inquiryCompletedEvent = new Object(); /** * 发现监听 */ private static DiscoveryListener listener = new DiscoveryListener() { public void inquiryCompleted(int discType) { System.out.println("#" + "搜索完成"); synchronized (inquiryCompletedEvent) { inquiryCompletedEvent.notifyAll(); } } /** * 发现设备 * @param remoteDevice * @param deviceClass */ @Override public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) { devicesDiscovered.add(remoteDevice); try { System.out.println("#发现设备" + remoteDevice.getFriendlyName(false)); } catch (IOException e) { e.printStackTrace(); } } /** * 发现服务 * @param transID id * @param servRecord 服务记录 */ @Override public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { for (int i = 0; i < servRecord.length; i++) { String url = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); if (url == null) { continue; } serviceFound.add(url); DataElement serviceName = servRecord[i].getAttributeValue(0x0100); if (serviceName != null) { System.out.println("service " + serviceName.getValue() + " found " + url); } else { System.out.println("service found " + url); } } System.out.println("#" + "servicesDiscovered"); } /** * 服务搜索已完成 * @param arg0 * @param arg1 */ @Override public void serviceSearchCompleted(int arg0, int arg1) { System.out.println("#" + "serviceSearchCompleted"); synchronized(serviceSearchCompletedEvent){ serviceSearchCompletedEvent.notifyAll(); } } }; /** * 查找设备 * @throws IOException * @throws InterruptedException */ private static void findDevices() throws IOException, InterruptedException { devicesDiscovered.clear(); synchronized (inquiryCompletedEvent) { LocalDevice ld = LocalDevice.getLocalDevice(); System.out.println("#本机蓝牙名称:" + ld.getFriendlyName()); boolean started = LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC,listener); if (started) { System.out.println("#" + "等待搜索完成..."); inquiryCompletedEvent.wait(); LocalDevice.getLocalDevice().getDiscoveryAgent().cancelInquiry(listener); System.out.println("#发现设备数量:" + devicesDiscovered.size()); } } } /** * 获取设备 * @return * @throws IOException * @throws InterruptedException */ public static Set<RemoteDevice> getDevices() throws IOException, InterruptedException { findDevices(); return devicesDiscovered; } /** * 查找服务 * @param btDevice * @param serviceUUID * @return * @throws IOException * @throws InterruptedException */ public static String searchService(RemoteDevice btDevice, String serviceUUID) throws IOException, InterruptedException { UUID[] searchUuidSet = new UUID[] { new UUID(serviceUUID, false) }; int[] attrIDs = new int[] { 0x0100 // Service name }; synchronized(serviceSearchCompletedEvent) { System.out.println("search services on " + btDevice.getBluetoothAddress() + " " + btDevice.getFriendlyName(false)); LocalDevice.getLocalDevice().getDiscoveryAgent().searchServices(attrIDs, searchUuidSet, btDevice, listener); serviceSearchCompletedEvent.wait(); } if (serviceFound.size() > 0) { return serviceFound.elementAt(0); } else { return ""; } } }
2.4蓝牙服务端使用
package com.shunyutong.test.bluetoothService; import com.shunyutong.test.bluetooth.BluetoothServer; import java.io.InputStream; import java.io.OutputStream; /** * @Auther: lanhaifeng * @Date: 2020/5/4 0004 16:47 * @Description: 蓝牙服务端通信业务 * @statement: */ public class BluetoothServerService { public static void main(String[] argv) { final String serverName = "Bluetooth Server Test"; final String serverUUID = "1000110100001000800000805F9B34FB"; //根据需要自定义 BluetoothServer server = new BluetoothServer(serverUUID, serverName); server.setServerListener(new BluetoothServer.OnServerListener() { @Override public void onConnected(InputStream inputStream, OutputStream outputStream) { System.out.printf("Connected"); //添加通信代码 System.out.println(server.serverName); System.out.println(server.serverUUID); } @Override public void onDisconnected() { } @Override public void onClose() { } }); server.start(); } }
2.5蓝牙客户端使用
package com.shunyutong.test.bluetoothService; import com.shunyutong.test.bluetooth.BluetoothClient; import javax.bluetooth.RemoteDevice; import javax.microedition.io.ConnectionNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Vector; /** * @Auther: lanhaifeng * @Date: 2020/5/4 0004 16:51 * @Description: 蓝牙客户端业务类 * @statement: */ public class BluetoothClientService { public static void main(String[] argv) { final String serverUUID = "1000110100001000800000805F9B34FB"; //需要与服务端相同 BluetoothClient client = new BluetoothClient(); Vector<RemoteDevice> remoteDevices = new Vector<>(); client.setOnDiscoverListener(new BluetoothClient.OnDiscoverListener() { @Override public void onDiscover(RemoteDevice remoteDevice) { remoteDevices.add(remoteDevice); } }); client.setClientListener(new BluetoothClient.OnClientListener() { @Override public void onConnected(InputStream inputStream, OutputStream outputStream) { System.out.printf("Connected"); //添加通信代码 } @Override public void onConnectionFailed() { System.out.printf("Connection failed"); } @Override public void onDisconnected() { } @Override public void onClose() { } }); try { client.find(); if (remoteDevices.size() > 0 ) { client.startClient(remoteDevices.firstElement(), serverUUID); } }catch (InterruptedException e) { e.printStackTrace(); }catch (ConnectionNotFoundException e){ System.out.println("当前蓝牙不在线"); e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } }
测试效果
以上是关于PC端怎么与通过蓝牙模块实现对PC端系统的控制调节,比如HC0,5-6去控制win的操作?的主要内容,如果未能解决你的问题,请参考以下文章
借助ESP8266 WIFI模块,实现Android手机有人网络调试助手(或Android手机网络调试助手)与PC端串口调试助手互相通信。