精华内容
下载资源
问答
  • 首先要了解蓝牙,然后要知道蓝牙是怎么工作的,下面是蓝牙的工作流程:1.发现周围的蓝牙设备2.获取发现设备的adress,根据adress得到远程设备的BluetoothDevice,然后创建BluetoothSocket,最后connect()(1)...

    首先要了解蓝牙,然后要知道蓝牙是怎么工作的,下面是蓝牙的工作流程:

    1.发现周围的蓝牙设备

    2.获取发现设备的adress,根据adress得到远程设备的BluetoothDevice,然后创建BluetoothSocket,最后connect()

    df83038fc129

    (1)BluetoothChat

    例子的主Activity。onCreate()得到本地BluetoothAdapter设备,检查是否支持。onStart()中检查是否启用蓝牙,并请求启用,然后执行setupChat()。setupChat()中先对界面中的控件进行初始化增加点击监听器等,然创建BluetoothChatService对象,该对象在整个应用过程中存在,并执行蓝牙连接建立、消息发送接受等实际的行为。

    (2)BluetoothChatService

    public synchronized void start():开启mAcceptThread线程,由于样例程序是仅2人的聊天过程,故之前先检测mConnectThread和mConnectedThread是否运行,运行则先退出这些线程。

    public synchronized voidconnect(BluetoothDevice device):取消CONNECTING和CONNECTED状态下的相关线程,然后运行新的mConnectThread线程。

    public synchronized voidconnected(BluetoothSocket socket, BluetoothDevice device):开启一个ConnectedThread来管理对应的当前连接。之前先取消任意现存的mConnectThread、mConnectedThread、mAcceptThread线程,然后开启新mConnectedThread,传入当前刚刚接受的socket连接。最后通过Handler来通知UI连接OK。

    public synchronized void stop():停止所有相关线程,设当前状态为NONE。

    public void write(byte[] out):在STATE_CONNECTED状态下,调用mConnectedThread里的write方法,写入byte。

    private void connectionFailed():连接失败的时候处理,通知ui,并设为STATE_LISTEN状态。

    private void connectionLost():当连接失去的时候,设为STATE_LISTEN状态并通知ui。

    内部类:private class AcceptThread extendsThread:创建监听线程,准备接受新连接。使用阻塞方式,调用BluetoothServerSocket.accept()。提供cancel方法关闭socket。

    private class ConnectThread extendsThread:这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过BluetoothDevice.createRfcommSocketToServiceRecord(),从待连接的device产生BluetoothSocket.然后在run方法中connect,成功后调用BluetoothChatSevice的connected()方法。定义cancel()在关闭线程时能够关闭相关socket。

    private class ConnectedThread extendsThread:这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。Run方法中使用阻塞模式的InputStream.read()循环读取输入流,然后post到UI线程中更新聊天消息。也提供了write()将聊天消息写入输出流传输至对方,传输成功后回写入UI线程。最后cancel()关闭连接的socket。

    (3)DeviceListActivity

    该类包含UI和操作的Activity类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。

    展开全文
  • Android与BLE蓝牙交互

    2018-05-29 14:24:44
    本代码是android与ble蓝牙之间的简单交互,包括数据的请求以及通信,适合才开始接触ble单片机交互的进行参考。
  • Android与PC蓝牙交互源代码

    热门讨论 2016-07-21 12:14:05
    Android与PC蓝牙交互源代码。最基本的Android与笔记本电脑蓝牙通讯的DEMO
  • Android与PC蓝牙交互

    万次阅读 多人点赞 2016-07-21 12:02:05
    Android与PC蓝牙交互 蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换 我之所以会来做Android与PC蓝牙通信的了解,是源于公司年会的时候做的抽奖活动,...

    前言

    蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换

    我之所以会来做Android与PC蓝牙通信的了解,是源于公司年会的时候做的抽奖活动,当时是用笔记本来运行的,因为要把屏幕投影到墙上,启动抽奖、停止抽奖都得笔记本控制。我想这个真的太不方便了,为什么不能用手机来操控,于是我想到了PC与手机的通信,最简单的方式就是通过蓝牙来通信。

    废话不多说,下面进入正题。


    开发环境

    PC(笔记本电脑)

    笔者的笔记本是Window 10 64位操作系统的,自带蓝牙模块。

    PC端开发环境一览:

    名称版本
    JDK1.8.0u91
    IDEIntellij Idea

    Android端开发环境一览:

    名称版本
    Android SDK23.1
    Android Studio2.1

    代码说明

    PC端开发(服务器)

    之所以选择标准的Java环境来开发PC端,是因为Java简单易学,开发成本低。虽然比起C++来说,运行效率低了很多,但是这样的一个情况下Java足够了,如果用C++来做的话,代价高了很多。

    PC端蓝牙开发资料少之又少,原因你懂的。不过PC端选择Java开发蓝牙通信的话,暂且只能用BlueCove开源框架来做。只是从这个封装好的插件的最后发布日期(2008年12月25日)来看,这个项目已经很久没有维护了。

    首先要下载BlueCove库,直接从官网上下载的JAR文件在64位系统上运行的话会出现native lib 错误,怎么办呢?笔者从谷歌论坛上某一页找到了国外技术大牛重新编译的64位lib。下载库之后放入项目路径,引用即可。

    两个设备之间建立通信连接的首要条件,是要有一个相同的UUID,这里我们选择的UUID是

    00001101-0000-1000-8000-00805F9B34FB

    PC端代码中填写UUID的时候需要去掉中间的短横线。

    Android端与PC端的基本通信手段是使用流连接(StreamConnection),PC端需要建立一个流连接监听器(StreamConnectionNotifier)

    streamConnectionNotifier = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + SERVER_UUID.toString());

    监听器设置后,建立一个独立线程去监听所有可能的Socket连接并接受:

    @Override
    public void run() {
        while (isListening) {
            StreamConnection streamConnection;
            try {
                //接受并打开连接
                streamConnection = streamConnectionNotifier.acceptAndOpen();
    
                byte[] buffer = new byte[200];
                //打开输入输出流
                InputStream inputStream = streamConnection.openInputStream();
                OutputStream outputStream = streamConnection.openOutputStream();
    
                outputStream.write("message from server".getBytes());
    
                inputStream.read(buffer);
                String message = new String(buffer);
                System.out.println("Receive message : " + message);
    
                inputStream.close();
                outputStream.close();
                streamConnection.close();
    
                if (message.contains("EXIT_APP")) {
                    //退出循环监听,将结束整个服务器端的程序运行
                    isListening = false;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    Android端开发(客户端)

    Android就相对比较简单了,只要遵循蓝牙通信的基本步骤即可。

    一共一个界面,先来看看布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="exp.com.bluetoothtest.MainActivity">
    
        <Button
            android:id="@+id/btn_open"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="onOpen"
            android:text="@string/open_bluetooth" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="onCheck"
            android:text="@string/check_service" />
    
        <Button
            android:id="@+id/btn_connect"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="onConnect"
            android:text="@string/connect_server" />
    
        <Button
            android:id="@+id/btn_send_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="onSend"
            android:text="@string/send_message" />
    
        <Button
            android:id="@+id/btn_disconnect"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="onDisconnect"
            android:text="@string/disconnect_server" />
    
        <TextView
            android:id="@+id/tv_msg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
    

    这里写图片描述

    MainActivity的代码比较简单,首先在onCreate函数中注册蓝牙扫描的广播:

     IntentFilter intentFilter = new IntentFilter();
     intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
     intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
     registerReceiver(broadcastReceiver, intentFilter);

    广播接收器代码:

     private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                Log.e(TAG, "Receive Broadcast : " + action);
                //找到设备
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice device = intent
                            .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    
                    Log.e(TAG, "Find device: [" + device.getName() + "," 
                        + device.getAddress() + ", "
                        + (device.getBondState() == BluetoothDevice.BOND_BONDED ? 
                            "bonded" : "default") + "]");
    
                    if (device.getAddress().equals(SERVICE_ADDRESS)) {
                        service = device;
                        showMessage("Service found and bound");
                    }
                } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                    text.append("\n搜索完成");
                    scanCompleted = true;
                }
            }
        };

    Socket连接、输入输出等操作均为阻塞式调用,均需要在独立线程中完成。
    开启Socket连接:

    if (service != null && scanCompleted) {
            new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //创建Socket连接
                            bluetoothSocket = service.createRfcommSocketToServiceRecord(UUID.fromString(serverUUID));
                            //开启连接
                            bluetoothSocket.connect();
                            showMessage("Successfully connect");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }

    发送和接收消息:

    if (service != null && scanCompleted) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        OutputStream outputStream;
                        try {
                            //打开输出流并写入消息
                            outputStream = bluetoothSocket.getOutputStream();
                            outputStream.write("A message from android device".getBytes());
                            showMessage("Successfully send message");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        InputStream inputStream;
                        try {
                            //打开输入流并读取消息
                            inputStream = bluetoothSocket.getInputStream();
                            byte[] buffer = new byte[200];
                            inputStream.read(buffer);
    
                            showMessage("Concurrently receive message : " + new String(buffer));
    
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }

    发送“关闭服务器”指令:

    if (bluetoothSocket != null) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        OutputStream outputStream;
                        try {
                            outputStream = bluetoothSocket.getOutputStream();
                            outputStream.write("EXIT_APP".getBytes());
                            showMessage("Successfully send message");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }

    运行程序

    运行前请手动启动PC端蓝牙设备。

    PC端启动输出如图:
    等待连接状态

    Android端点击开启蓝牙打开蓝牙设备。并点击检查服务器检查PC端蓝牙,如果没有配对,即会开始搜索蓝牙设备,搜索完成之后即可配对。
    搜索到PC端并配对之后,点击连接服务器开启流连接。然后点击发送消息

    发送和接收消息

    服务端接收到消息

    再次点击连接服务器重新开启流连接,发送关闭服务器指令:

    收到关闭服务器消息


    这个DEMO就完成了,后续更复杂的开发基于这个DEMO代码改进就行。感谢你的阅读,如果你对这篇文章有什么意见或者建议请联系我或者留言。

    源代码地址:点击进入下载页

    展开全文
  • 最近在做的蓝牙项目,实现蓝牙互连并通信,适合初学者学习,代码内含详细注释,有不懂的欢迎大家一起探讨
  • Android例子源码安卓通过蓝牙与单片机交互。打开安卓手机蓝牙实现连接单片机从而达到开锁目的小例子源码,核心功能是连接另外一个蓝牙以后发送数据。
  • java怎么与蓝牙交互数据TL;DR: Try the Web Bluetooth API in the browser or check out the sample React app: https://github.com/rdeprey/web-bluetooth-starter. TL; DR: 在浏览器中尝试Web蓝牙API 或查看示例...

    java怎么与蓝牙交互数据

    TL;DR: Try the Web Bluetooth API in the browser or check out the sample React app: https://github.com/rdeprey/web-bluetooth-starter.

    TL; DR: 在浏览器中尝试Web蓝牙API 或查看示例React应用程序: https : //github.com/rdeprey/web-bluetooth-starter

    If you have smart home devices, you’ve likely interacted with them over Bluetooth from a native app on your phone. Did you know that you can also interact with Bluetooth devices through a website? You can using the Web Bluetooth API.

    如果您有智能家居设备,则可能已经通过手机上的本机应用程序通过蓝牙与它们进行了交互。 您知道您还可以通过网站与蓝牙设备进行交互吗? 您可以使用Web Bluetooth API。

    Image for post
    Getting a device’s battery level with the Web Bluetooth API
    使用Web Bluetooth API获取设备的电池电量

    Although this API is still considered experimental technology, it has decent support in Google Chrome, Edge, and Opera. Some of the things you can do with the Web Bluetooth API include:

    尽管此API仍被认为是实验性技术, 但它在Google Chrome,Edge和Opera中具有不错的支持 。 您可以使用Web Bluetooth API进行的一些操作包括:

    • Requesting and connecting to nearby devices

      请求并连接到附近的设备
    • Reading and writing Bluetooth characteristics

      读写蓝牙特性
    • Receiving GATT notifications

      接收关贸总协定通知
    • Receiving notifications when a device is disconnected

      断开设备时接收通知
    • Reading and writing Bluetooth descriptors

      读写蓝牙描述符

    If you’re new to how Bluetooth devices work, I’ll explain some of the concepts above. Otherwise, feel free to skip ahead.

    如果您不了解蓝牙设备的工作原理,那么我将解释上面的一些概念。 否则,请随时跳过

    蓝牙关键概念 (Bluetooth Key Concepts)

    Here are a few key concepts you’re likely to come across as you start working with the Web Bluetooth API.

    在开始使用Web Bluetooth API时,可能会遇到一些关键概念。

    GATT(通用属性配置文件) (GATT (Generic Attribute Profile))

    GATT plays an integral role in defining how data is shared over a Bluetooth connection. It describes the data transfer processes and formats. Even more important, it provides a reference framework that’s used for all devices with GATT-based profiles to ensure that devices from different vendors work together.

    GATT在定义如何通过蓝牙连接共享数据方面起着不可或缺的作用。 它描述了数据传输过程和格式。 更重要的是,它提供了一个参考框架,该框架可用于具有基于GATT的配置文件的所有设备,以确保来自不同供应商的设备可以协同工作。

    GATT客户端与服务器 (GATT Client vs. Server)

    The GATT client sends requests to a Bluetooth device and gets responses from it. In our case, the GATT client is a web browser that supports the Web Bluetooth API.

    GATT客户端将请求发送到蓝牙设备,并从中获取响应。 在我们的例子中,GATT客户端是支持Web蓝牙API的Web浏览器。

    The GATT server gets requests from a client and returns data. It can also be configured to send data on its own without receiving a request from a client. Bluetooth devices generally serve this role.

    GATT服务器从客户端获取请求并返回数据。 还可以将其配置为自行发送数据,而不接收来自客户端的请求。 蓝牙设备通常扮演这个角色。

    共享资料 (Sharing Data)

    When sharing data between Bluetooth devices, GATT organizes the data into characteristics, services, and descriptors.

    在蓝牙设备之间共享数据时,GATT会将数据组织为特征,服务描述符

    CharacteristicsCharacteristics hold user data and have at least two attributes:

    特征特征保存用户数据,并至少具有两个属性:

    • Characteristic name

      特征名称

      Describes what the characteristic is, such as battery level or heart rate

      描述特征是什么,例如电池电量或心率

    • The value for that characteristic

      该特性的价值

    ServicesGATT services are collections of related characteristics. For example, you could have a service called “Battery” that includes characteristics like the current battery level and the estimated amount of time remaining before the battery needs recharging.

    服务 GATT服务是相关特征的集合。 例如,您可能有一项名为“电池”的服务,其中包括诸如当前电池电量以及电池需要充电之前估计的剩余时间之类的特征。

    DescriptorsDescriptors are defined attributes that describe a characteristic value. They can be used to provide information that makes it easier to understand what a characteristic’s value represents. For example, a descriptor could explain the expected range for a value or a unit of measure being used for a value.

    描述描述符是定义的描述特性值的属性。 它们可用于提供信息,使您更容易理解特征值代表什么。 例如,描述符可以解释值的预期范围或用于该值的度量单位。

    关贸总协定通知 (GATT Notifications)

    GATT notifications let a website or application know when a particular characteristic changes on a device. For example, a web page that displays the battery level for a Bluetooth device could subscribe to notifications that indicate changes in the paired device’s battery level.

    GATT通知可让网站或应用程序知道设备上的特定特征何时发生变化。 例如,显示蓝牙设备电池电量的网页可以订阅通知,该通知指示配对设备电池电量的变化。

    安全防护 (Security Protections)

    In order to use the Web Bluetooth API, there are a few requirements to protect the privacy of users:

    为了使用Web Bluetooth API,有一些要求可以保护用户的隐私:

    • The web page must be hosted with HTTPS

      该网页必须使用HTTPS托管

      You can interact with the API on

      您可以在

      http://localhost for testing, but HTTPS will need to be configured for the page when it’s hosted.

      http://localhost进行测试,但是在托管页面时需要为页面配置HTTPS。

    • The user has to make a gesture of some sort (click, touch, etc.) in order for the web page to discover Bluetooth devices

      用户必须做出某种手势(单击,触摸等)才能使网页发现蓝牙设备

    从浏览器连接到蓝牙设备 (Connecting to a Bluetooth Device from the Browser)

    Now that you have some background information on how Bluetooth devices communicate with each other, let’s build something!

    现在您已经掌握了蓝牙设备之间如何通信的一些背景信息,让我们来构建一些东西!

    For this example, let’s write some JavaScript that gets a device’s battery level using the Web Bluetooth API and displays it on a web page.

    对于此示例,让我们编写一些JavaScript,这些JavaScript使用Web Bluetooth API获取设备的电池电量并将其显示在网页上。

    A Note on TestingOnly devices that actively advertise a battery service will appear in the list of devices the browser can pair with for this example. I found that my Galaxy S9+ on it’s own doesn’t seem to advertise the battery service, so I used a simulator to test. An easy way to try this is to use a BLE simulator like BLE Peripheral Simulator (Android) or My BLE Simulator (Apple).

    关于测试的注意事项在此示例中,浏览器可以配对的设备列表中仅显示正在积极宣传电池服务的设备。 我发现自己的Galaxy S9 +似乎并没有宣传电池服务,因此我使用模拟器进行了测试。 一种简单的尝试方法是使用BLE模拟器,例如BLE Peripheral Simulator (Android)或My BLE Simulator (Apple)。

    The CodeTo get started, create an asynchronous function that will search for Bluetooth devices and connect to the one selected.

    代码要开始使用,请创建一个异步功能,该功能将搜索Bluetooth设备并连接到选定的设备。

    const connectToDeviceAndSubscribeToUpdates = async () => {}

    Inside the function, let’s start by requesting devices that advertise a battery service. The navigator.bluetooth.requestDevice function takes an options object where you can specify what type of devices to scan for. In our case, we want to scan for devices that advertise their battery service, so that we can get the device’s battery level.

    在该函数内部,让我们从请求宣传电池服务的设备开始。 navigator.bluetooth.requestDevice函数采用一个options对象,您可以在其中指定要扫描的设备类型。 在本例中,我们要扫描宣传其电池服务的设备,以便获得设备的电池电量。

    const connectToDeviceAndSubscribeToUpdates = async () => {   const device = await navigator.bluetooth
    .requestDevice({
    filters: [{ services: ['battery_service']}
    });

    };

    There are lots of other ways to filter devices, including by device name, service UUID (handy when you make your own GATT Server on a Bluetooth peripheral like a Raspberry Pi), or 16-bit service ID. You can also use multiple filters of the same or different types to filter the devices available for pairing. Take a look at the list of the standard GATT Services and try using different filters to get data from your devices.

    还有许多其他过滤设备的方法,包括按设备名称,服务UUID(在Raspberry Pi等Bluetooth外围设备上制作自己的GATT服务器时很方便)或16位服务ID。 您也可以使用相同或不同类型的多个过滤器来过滤可用于配对的设备。 查看标准GATT服务的列表,然后尝试使用其他过滤器从设备中获取数据。

    Next, add an HTML button element to your web page and set its onClick function to call the connectToDeviceAndSubscribeToUpdates function. To pair with a Bluetooth device from the browser, you have to have a way for the user to initiate the action such as by clicking on a button.

    接下来,将HTML按钮元素添加到您的网页,并将其onClick函数设置为调用connectToDeviceAndSubscribeToUpdates函数。 要从浏览器与蓝牙设备配对,您必须有一种方法让用户启动操作,例如通过单击按钮。

    <button onClick="connectToDeviceAndSubscribeToUpdates()">Connect to Bluetooth device</button>

    Clicking on the button and calling the navigator.bluetooth.requestDevice function triggers the browser to show a popup that lists the devices that meet the specified filters.

    单击该按钮并调用navigator.bluetooth.requestDevice函数将触发浏览器以显示弹出窗口,该弹出窗口列出符合指定过滤器的设备。

    Image for post
    Popup showing devices that meet our filter requirements
    弹出窗口显示符合我们过滤器要求的设备

    At this point, you can select a device from the list and pair it with the browser. Nothing will happen yet though. We need to try to connect to the GATT server that’s running on the Bluetooth device.

    此时,您可以从列表中选择设备并将其与浏览器配对。 不过什么都不会发生。 我们需要尝试连接到在蓝牙设备上运行的GATT服务器。

    const connectToDeviceAndSubscribeToUpdates = async () => {
    const device = await navigator.bluetooth
    .requestDevice({
    filters: [{ services: ['battery_service']}
    }); const server = await device.gatt.connect();
    };

    After we’re connected to the GATT server, we need to get the battery service from the server.

    连接到GATT服务器后,我们需要从服务器获取电池服务。

    const connectToDeviceAndSubscribeToUpdates = async () => {
    const device = await navigator.bluetooth
    .requestDevice({
    filters: [{ services: ['battery_service']}
    }); const server = await device.gatt.connect(); const service = await server.getPrimaryService('battery_service');
    };

    With the service now available, we can get the battery level characteristic from the device.

    使用现在可用的服务,我们可以从设备获取电池电量特性。

    const connectToDeviceAndSubscribeToUpdates = async () => {
    const device = await navigator.bluetooth
    .requestDevice({
    filters: [{ services: ['battery_service']}
    }); const server = await device.gatt.connect(); const service = await server.getPrimaryService('battery_service'); const characteristic = await service.getCharacteristic('battery_level');
    };

    At this point, we have what we need to be able to get the battery level for the device. To do that, we use the readValue function on the characteristic. The value is a DataView of an ArrayBuffer, so we use the getUint8 function to get an individual byte from the array at the index passed in, which is 0 in our case.

    至此,我们已经具备了获取设备电池电量所需的条件。 为此,我们在特征上使用readValue函数。 该值是ArrayBuffer的DataView,因此我们使用getUint8函数从传入的索引处的数组中获取单个字节,在本例中为0

    const connectToDeviceAndSubscribeToUpdates = async () => {
    const device = await navigator.bluetooth
    .requestDevice({
    filters: [{ services: ['battery_service']}
    }); const server = await device.gatt.connect(); const service = await server.getPrimaryService('battery_service'); const characteristic = await service.getCharacteristic('battery_level'); const reading = await characteristic.readValue();
    console.log(reading.getUint8(0) + '%');
    };

    The function above will now get the battery level reading from the paired device and log it to the browser’s console.

    现在,上述功能将从配对的设备获取电池电量读数,并将其记录到浏览器的控制台中。

    This is great, but so far our code will only get a reading one time, right after the device connects. We can subscribe to updates (aka GATT notifications) by calling the startNotifications function on the characteristic. Adding an event handler for the characteristicvaluechanged event will allow us to update the web page with the new value as the battery level changes.

    很好,但是到目前为止,在设备连接后,我们的代码只会读取一次。 我们可以通过调用特征上的startNotifications函数来订阅更新(也称为GATT通知)。 添加了一个事件处理程序characteristicvaluechanged事件将使我们能够用新值随着电池电量的变化更新网页。

    const handleCharacteristicValueChanged = (event) => {
    console.log(event.target.value.getUint8(0) + '%');
    };
    const connectToDeviceAndSubscribeToUpdates = async () => {
    const device = await navigator.bluetooth
    .requestDevice({
    filters: [{ services: ['battery_service']}
    }); const server = await device.gatt.connect(); const service = await server.getPrimaryService('battery_service'); const characteristic = await service.getCharacteristic('battery_level'); characteristic.startNotifications(); characteristic.addEventListener('characteristicvaluechanged', handleCharacteristicValueChanged); const reading = await characteristic.readValue();
    console.log(reading.getUint8(0) + '%');};

    Try this out with the example site or download a React starter app: https://github.com/rdeprey/web-bluetooth-starter.

    在示例站点上进行尝试或下载React入门应用程序: https : //github.com/rdeprey/web-bluetooth-starter

    Those are the basics of connecting to Bluetooth devices from the browser. This is just the start though. You can write your own GATT services to share data over Bluetooth between microcontrollers and other IoT devices. Keep an eye out for an article on that soon!

    这些是从浏览器连接到蓝牙设备的基础。 不过,这仅仅是开始。 您可以编写自己的GATT服务,以在微控制器和其他IoT设备之间通过蓝牙共享数据。 请密切注意有关此的文章!

    其他资源 (Additional Resources)

    翻译自: https://medium.com/going-fullstack/interact-with-bluetooth-devices-using-the-web-bluetooth-api-7984b2509939

    java怎么与蓝牙交互数据

    展开全文
  • 本项目是一个用于打开安卓手机蓝牙实现连接单片机从而达到开锁目的小例子源码,核心功能是连接另外一个蓝牙以后发送数据. 
  • 温馨提示:本文主要针对蓝牙终端...封装了一系列的蓝牙操作:1、搜索蓝牙2、配对蓝牙3、发送消息4、接收消息现已将操作封闭为类BluetoothChatService.java,由于代码太多就不贴出来了,请移到Github上查看Demo链接:...

    温馨提示:本文主要针对蓝牙终端操作,其他设备暂未测试过。


    封装了一系列的蓝牙操作:

    1、搜索蓝牙

    现已封装为类,可直接调用:BluetoothDeviceDialog

    搜索总共分为两步:

    (1)开始搜索

    BluetoothAdapter.getDefaultAdapter().startDiscovery()

    (2)注册播放接收数据

    private fun initBluetooth() {
        val intentFilter = IntentFilter()
        intentFilter.addAction(BluetoothDevice.ACTION_FOUND)
        intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)
        context.registerReceiver(receiver, intentFilter)
    }
    private var receiver: BroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            when (intent.action) {
                BluetoothDevice.ACTION_FOUND -> {//找到设备
                    val device = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
                    when (device.bondState) {
                        BluetoothDevice.BOND_BONDED -> Unit
                        else -> if (!holder.adapter.dataList.contains(device)) holder.adapter.add(device)
                    }
                }
                BluetoothAdapter.ACTION_DISCOVERY_FINISHED -> {//搜索完成
                    holder.recyclerView.refreshComplete()
                    if (holder.adapter.itemCount <= 0)
                        showToast("未找到设备")
                }
            }
        }
    }

    2、配对蓝牙

    BluetoothChatService.connect()

    3、发送消息

    BluetoothChatService.write()

    4、接收消息


    现已将操作封闭为类BluetoothChatService.java,由于代码太多就不贴出来了,请移到Github上查看

    完整的实例:Demo链接:https://github.com/SpringSmell/quick.library/blob/master/app/src/main/java/com/example/chriszou/quicksample/ui/bluetooth/BluetoothChatService.java

    展开全文
  • Android Ble 4.0 蓝牙开发交互

    千次阅读 热门讨论 2017-03-20 12:07:40
    产品需求:1、app通过蓝牙连接到板子设备  2、以发报文的形式与板子设备通讯  3、当设备接受到正确的报文指令后,会将检测的数据返回  4、将返回的数据解析设置到界面显示即可 板子介绍: 准备工作:  1:...
  • Arduino ESP32 BLE蓝牙安卓蓝牙数据交互实验 调试工具 安卓系统BLE调试工具:BLEAssist APP下载地址:http://www.wch.cn/downloads/BLEAssist_ZIP.html 将APP应用程序发给到手机上,然后安装上去。 打开APP后...
  • android源码与蓝牙模块进行数据交互,类似于蓝牙小车那种的,蓝牙模块的数据发送到android并成功显示
  • 说明 该项目产生于2014年8月的全国生物医学电子学竞赛,名称是:可穿戴的脉搏测量装置。 基于安卓蓝牙和单片机。未经授权,请勿下载使用。 视频演示地址:
  • Android 低功耗蓝牙开发(数据交互)前言正文一、BluetoothGattCallback1. 前言   在上一篇低功耗蓝牙开发文章中,我讲述了扫描和连接,本篇文章讲述数据的交互。当了解了数据交互后就可以开始进行低功耗蓝牙硬件...
  • 因项目需要,需要与全站仪蓝牙进行数据交互,公司的这台全站仪本身不带蓝牙,买的蓝牙适配器连接到设备上,因为也搞了挺长时间,把具体过程写一下。 一.设置蓝牙适配器首先要搞定蓝牙适配器与全站仪之间的连接,保证...
  • 转载--------------------...因项目需要做一个Android蓝牙app来通过手机蓝牙传输数据,在此总结。 该应用的Compile Sdk Version 和targetSdkVersion均为26,Min Sdk Version为22,基于Android studio平台开发。...
  • 公司一款对讲软件需要适配 Phonak这款蓝牙耳机,查找很多资料之后 整理出一个示例。这段代码的完成离不开各路大神无私分享。 public class SCOHelper { private final static String TAG = "SCOHelper"; private...
  • 本项目是一个用于打开安卓手机蓝牙实现连接单片机从而达到开锁目的小例子源码,核心功能是连接另外一个蓝牙以后发送数据.
  • Android蓝牙与全站仪进行数据交互
  • 2019年11月3日,ERNW研究人员向谷歌安卓团队报告了一个影响安卓系统蓝牙组件的关键漏洞。该漏洞CVE编号为CVE-2020-0022,在本月发布的安全补丁中...整个过程无需用户交互,只需要知道目标设备的蓝牙MAC地址就可以了...
  • android蓝牙与下位机交互

    千次阅读 2015-05-19 16:11:09
    最近在做一个项目,是蓝牙与下位机进行交互,只是简单的数据交互,使用蓝牙4.0.。。。 先看看项目的简易通信协议:  协议内容,是一个44位字节的通信命令式协议: 协议格式:  输出格式:pump on + (char)...
  • 蓝牙通知器 Android应用程序通过蓝牙与MyClock项目交互
  • Speedlight-android SpeedLight android 应用程序与树莓派上的蓝牙服务器代码交互
  • 本篇文章主要介绍了Android 蓝牙自动匹配PIN码跳过用户交互示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 健康在线蓝牙报文交互协议,android开发蓝牙外接设备
  • 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,...
  • 具体情况是这样,app发送数据到蓝牙板子上在没有数据返回时是没有问题的,但如果蓝牙板子上有数据返回时,app再发送数据就会把从蓝牙板子上接受到的部分数据夹杂在发送的数据之中,这是怎么回事啊,有木有大神来解答...
  • 然后,看下api,Android所有关于蓝牙开发的类都在android.bluetooth包下,如下图,只有8个类 而我们需要用到了就只有几个而已:  1.BluetoothAdapter 顾名思义,蓝牙适配器,直到我们建立bluetoothSocket连接之前...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,943
精华内容 4,377
关键字:

蓝牙交互安卓