通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持。因此针对这个弊端,可以考虑使用支持Bluetooth技术的硬件。
Android系统支持传统的Bluetooth技术,其实现功能不仅可以传输数据,还可以传输并执行远程控制指令。在Android4.3 即API 18 及以后的版本中,低功耗的Bluetooth技术(简称为BLE)取自传统Bluetooth的核心功能,可以更省功耗并支持数据传输功能。在传统蓝牙技术中,应用程序所持有的蓝牙设备可以作为蓝牙服务端,开启蓝牙等待处理其他蓝牙设备的接入请求;也可以作为蓝牙客户端,开启蓝牙查找附近的蓝牙设备并请求接入。而在BLE技术中,应用程序所持有的蓝牙设备只能作为GATT客户端,连接其他类似蓝牙耳机等BLE设备。下面应用程序将会以这三种身份分别说明。
使用Bluetooth技术,需要在清单文件中声明蓝牙相关权限。申请权限使用<uses-permission />标签,并设置其android:name属性为对应的权限名。蓝牙相关权限中主要有三种权限,申请后可分别对应执行不同功能。首先是可以执行蓝牙通信的基础权限,其值为Manifest.permission.BLUETOOTH="android.permission.BLUETOOTH";在需要通过蓝牙获取位置信息的应用程序中,还需要获取位置权限,其值为Manifest.permission.ACCESS_FINE_LOCATION="android.permission.ACCESS_FINE_LOCATION";另外如果需要使用蓝牙的远程控制功能,需要蓝牙管理员权限,其值为Manifest.permission.BLUETOOTH_ADMIN="android.permission.BLUETOOTH_ADMIN"。
由于一个Android系统的设备上只能使用唯一的一个蓝牙硬件,因此应用程序中可以通过android.bluetooth.BluetoothAdapter蓝牙适配器操作底层的蓝牙硬件。
调用BluetoothAdapter中的静态方法getDefaultAdapter()可以获取到BluetoothAdapter蓝牙适配器对象。但是,从Android 12即API 31开始就废弃了上述方法,取而代之的是借助android.bluetooth.BluetoothManager蓝牙管理类。在能获取到Context上下文环境类对象的位置,调用其getSystemService(String name)方法,传入参数 name 值为Context.BLUETOOTH_SERVICE="bluetooth",可以获取到BluetoothManager蓝牙管理类的实例化对象,进而调用该对象的getAdapter()方法获取已经实例化的BluetoothAdapter蓝牙适配器对象。
对于不支持蓝牙硬件的设备,得到的蓝牙适配器对象为null,因此记得在应用程序中做非空判断的相关操作!
在支持蓝牙的设备上得到BluetoothAdapter对象后,还要确保设备已经开启了蓝牙功能。调用该对象的isEnabled()方法,根据返回的boolean类型结果,判断该设备是否已经正常开启了蓝牙功能;如果蓝牙处于未启用状态,还要通过调用Context上下文环境对象的startActivityForResult(Intent intent, int requestCode)方法跳转到蓝牙功能开启界面,而这里传入的参数 intent 则是标记为蓝牙界面的Intent意图对象,在该对象中设置其 action 值为BluetoothAdapter.ACTION_REQUEST_ENABLE ="android.bluetooth.adapter.action.REQUEST_ENABLE"。在跳转到蓝牙功能界面后,需要由用户手动选择开启蓝牙,并返回当前界面后,才能继续执行后续操作。
在设置蓝牙等操作之后,就是查找该设备附近范围内其他开启蓝牙功能的设备了。可以直接调用BluetoothAdapter对象的startDiscovery()方法来开启查找附近设备的功能,但是在发现设备后,系统会通过广播的形式发送已发现的设备信息给应用程序。所以还需要在某个自定义界面Activity或者服务Service中,注册BroadcastReceiver以接收该广播。
注册广播的方式可以回顾BroadcastReceiver动态注册部分内容,这里只是需要创建的IntentFilter意图过滤对象中的参数 action 值为BluetoothDevice.ACTION_FOUND="android.bluetooth.device.action.FOUND"。同时在自定义的BroadcastReceiver中处理收到的onReceive(Context context, Intent intent)方法中,对参数 intent 的getParcelableExtra(String name)方法,并设置 name 值为BluetoothDevice.EXTRA_DEVICE="android.bluetooth.device.extra.DEVICE",可以获得android.bluetooth.BluetoothDevice蓝牙硬件设备类对象,在该对象中可以获取查找到的蓝牙硬件相关信息。
在查找到设备后,要及时调用BluetoothAdapter对象的cancelDiscovery()方法关闭查找功能。否则设备的蓝牙硬件会一直占用cpu资源并消耗电量,而且在后续的建立连接及数据传输时,也会由于蓝牙发现功能的开启占用大量带宽而影响后续操作效率。
对于之前已经连接配对过的设备,就不需要通过上述查找蓝牙的方式发现设备了,可以通过调用BluetoothAdapter对象的getBondedDevices()方法,直接获取已配对过的蓝牙设备,返回BluetoothDevice对象组成的Set集合。
在设置蓝牙操作后,如果想将该设备作为被发现的设备等待连接,需要启动蓝牙的可检测功能。与开启蓝牙功能界面的方法类似,调用Context上下文环境对象的startActivityForResult(Intent intent, int requestCode)方法跳转到启动蓝牙可检测性功能界面,传入的参数 intent 意图对象中,设置的 action 值为BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE="android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";另外可以通过putExtra(String name, int value)设置可检测时间,其参数 name 值为BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION="android.bluetooth.adapter.extra.DISCOVERABLE_DURATION",而参数 value 值为int类型的数值,单位为秒。
同样在跳转到蓝牙可检测性功能界面后,需要由用户手动确认开启,才能等待被其他蓝牙设备查找发现。同时不管用户确认开启或取消开启功能,都会将结果回调到Context上下文环境所代表的原启动界面Activity中的onActivityResuslt(int requestCode, int resultCode, Intent data)方法中。
在设置蓝牙操作后,如果只是想查找附近的BLE设备并建立连接,则需要先拿到android.bluetooth.le.BluetoothLeScannerBLE扫描类对象。通过BluetoothAdapter对象的getBluetoothLeScanner()方法,可以得到BluetoothLeScannerBLE扫描类对象。之后借助该对象的startScan(ScanCallback callback)等系列方法,开始扫描查找附近的BLE设备,在查找到符合条件的设备后,会回调android.bluetooth.le.ScanCallback类型的参数 callback 对象中的onScanResult(int callbackType, ScanResult result)方法,并将结果保存在android.bluetooth.le.ScanResult扫描结果类型的参数 result 对象中。在ScanResult对象中,可以获得连接的BLE设备BlutoothDevice对象及连接所使用的协议功能等信息。
扫描查找到BLE设备后,及时调用BluetoothLeScanner对象的stopScan(ScanCallback callback)方法,参数 callback 与上文开始查找附近BLE设备方法中的参数相同,以停止当前蓝牙扫描查找功能。
在上述查找蓝牙或蓝牙可检测功能开启后被其他设备连接后,都会得到对方的BlutetoothDevice蓝牙设备类对象。通常,应用程序所在设备查找到其他蓝牙设备后,可以主动向设备建立连接请求;而当应用程序所在设备开启蓝牙可检测功能等待其他设备查找到时,只能被动的开启连接服务,等待处理其他设备的连接请求。
对于主动发起蓝牙连接请求的方式,由得到的BluetoothDevice对象调用createRfcommSocketToServiceRecord(UUID uuid)方法,可以创建远程socket连接。参数 uuid 是自定义的java.util.UUID唯一索引类对象,该值必须与后文提到的被动等待连接的蓝牙设备中的监听服务中的唯一索引值一致。该方法会返回android.bluetooth.BluetoothSocket类用以保存创建的远程蓝牙socket连接。
在得到BluetoothSocket对象后,直接调用该对象的connect()方法发起连接请求。该方法调用后会一直等待连接的建立,只有建立连接后才会正常返回并执行后续操作,否则,如果请求超时或连接失败,该方法会抛出java.io.IOException异常。
对于被动等待建立连接的方式,由得到的BluetoothDevice对象调用listenUsingRfcommWithServiceRecord(String name, UUID uuid)方法,建立持续监听服务。参数 name 是为该服务定义的名字;参数 uuid 是监听的唯一索引值,其值与上文中主动发起蓝牙连接请求是创建远程socket连接所传入的参数一致。该方法返回android.bluetooth.BluetoothServerSocket蓝牙连接的服务端socket类,用以保存在等待建立连接时的socket对象。
在得到BluetoothServerSocket对象后,直接调用该对象的accept()方法监听连接请求。该方法调用后也会一致等待监听状态,只有监听到匹配的连接请求后,才会返回BluetoothSocket对象,否则,如果连接失败,该方法同样会抛出java.io.IOException异常。
对于上述两种建立连接方式执行之后,便可以通过BluetoothSocket对象在蓝牙客户端和服务端之间传输数据。该对象的getInputStream()和getOutputStream()方法可以分别获取socket连接的InputStream数据输入流对象和OutputStream数据输出流对象。可以借助InputStream数据输入流的read()系列方法,从socket连接中读取数据到应用程序中,反之借助OutputStream数据输出流的write()系列方法,将应用程序中的数据写入到socket连接中。同样地,这里的数据输入流的读取系列方法会一直处于等待读取状态,直到读到指定长度数据后才会返回结果,而数据输出流的写入系列方法,会在对方数据输入流读取慢导致写入缓存满时处于一直等待写入状态,直到指定数据完全写入才会返回结果。
在BluetoothServerSocket或BluetoothSocket对象传输数据结束后,需要分别调用他们的close()方法关闭连接,防止远程socket连接一直处于占用资源状态。
对于Gatt客户端连接方式,由得到的BluetoothDevice对象调用connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)系列方法连接BLE设备的Gatt服务端,参数 context 是当前应用程序所在的上下文环境对象,参数 autoConnect 标识是否在连接该设备后自动建立Gatt服务连接,参数 callback 是建立Gatt服务连接后的回调android.bluetooth.BluetoothGattCallback抽象类。
在初次连接其他BLE设备的Gatt服务端时,会回调参数 callback 中的onServicesDiscovered(BluetoothGatt gatt, int status) 方法。而当已建立的Gatt连接状态发生改变时,会回调参数 callback 中的onConnectionStateChange(BluetoothGatt gatt, int status, int newState)方法。其他连接状态也会对应BluetoothGattCallback类中的相关方法。
在BluetoothGattCallback抽象类的回调方法中,Gatt服务连接信息是通过android.bluetooth.BluetoothGatt类的参数 gatt 来传递的。通过BluetoothGatt对象的相关方法,可以执行Gatt客户端的连接及协议控制等操作,具体可需根据应用程序需求实现。只是记得在执行完相关操作后,调用参数 gatt 的close()方法关闭连接。
————————————————————————————————————————————————————————
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO