经蓝牙给耳放会被WiFi与NFC给取代吗

NFC能取代蓝牙和WIFI? NFC实际速度体验_论文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
NFC能取代蓝牙和WIFI? NFC实际速度体验
中国最大最早的专业内容网站|
总评分0.0|
试读已结束,如果需要继续阅读或下载,敬请购买
定制HR最喜欢的简历
你可能喜欢NFC、蓝牙和 WiFi 有什么区别? | 科技情报局 这篇文章来自于。你可以,也可以微信扫描小程序码阅读这篇文章。
让理想生活的样子清晰可见属于你的高品质在线杂志 微信识别二维码,进入轻芒杂志或下载 iOS 版
· &2017 轻芒 ·浅析蓝牙无线通讯技术会被WiFi所取代吗?
& & & & 【每日科技网】&
  BLE蓝牙是蓝牙联盟从蓝牙4.0版本的基础上推出的低功耗(BLE)蓝牙无线通讯技术,BLE蓝牙具有功耗低、小数据传输、成本低等特性,能够实现本地设备的无线连接,比如手机与手机间传输数据、手机与智能穿戴设备、蓝牙智能家居设备之间进行数据传输,另外BLE蓝牙无线通讯技术也拥有一定的操控权限,很多蓝牙键盘、蓝牙鼠标及游戏手柄,也都采用了BLE蓝牙技术。
  BLE蓝牙无线技术最新的应用形式是&物联网&,很多智能家具、智能可穿戴设备,实际上都是通过BLE蓝牙无线技术实现连接的;另外它还被更多应用在家庭创新技术领域,如BLE蓝牙生成密码门锁、家庭报警系统等等。毫无疑问,BLE蓝牙无线通讯技术是目前最主流、最便利的无线组网技术。
  目前蓝牙的最新版本是蓝牙5.0版本,此版本能够以信号增强、局域网连接的形式将数据传输给主机,同时为开发商带来了更多的灵活性。从蓝牙4.1版本开始,智能设备都可以单独与主机进行通信,并且可以将设备进行单独存储,然后在将数据反馈给主机。比如当下流行的计步器或是运动手环产品,如果使用了4.0及以下的蓝牙版本,需要分批将数据发送到手机上,比较耗电;而4.1-5.0版本则能够存储数据,在完成所有操作后一并发送给手机,这是一个更高效的方式,不仅减少对手机依赖的同时,还能够节省电力。这项功能对物联网设备也将产生巨大的影响,不过由于5.0版本才正式发布不久,还需要时间来普及。
  虽然蓝牙无线技术一直在进步,但是同类竞争者无线通讯技术也在不断涌现,比如WIFI和NFC。首先来分析NFC(近场通信技术),它的特色是连接形式更轻松,只要支持NFC功能的设备轻轻一靠,就可以实现通讯连接,非常适合用于短距离实现点对点连接,同时功耗也低。不过它的短板也在于距离,传输距离需要在4厘米左右才能够实现数据传输,而BLE蓝牙目前已经可以实现150米的连接距离。
  显然,NFC由于自身的距离局限性,无法替代蓝牙,而是互补,所以对蓝牙实际上是没有太多威胁的。
  再来看WIFI。相比NFC,WIFI没有距离限制,很多方面都与蓝牙也十分相似,所以更具威胁性。目前WIFI的直连功能已经被很多终端设备所应用,如索尼QX系列无线镜头、Sonos音箱等,涉及打印、游戏、视频、音乐、显示等很多种多种领域。另外,相比较蓝牙的24MBPs传输率,WIFI最高可以实现250Mbps的速
度,并且在未来有望实现每秒2GB的数据传输速度,这也是蓝牙无法企及的优势之一。
  那么,WIFI在未来发展的道路上会直接取代蓝牙吗?答案是绝对不会。因为WIFI最大的弊端在于安全性能差且功耗较高,不适合可穿戴、健身等需要低功耗传输的设备。但对于家用领域,比如无线音箱、视频同步传输等领域,WIFI明显也并占有一定优势。
  显然,经历了20多年的发展,蓝牙无线通讯技术已经拥有了很大的发展空间,同时技术方面又在不断进步。
免责声明:本文仅代表作者个人观点,与每日科技网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们联系,本网站将在规定时间内给予删除等相关处理.
11:09 广告
11:09 广告NFC与其他无线通讯对比 - 手机中国
手机刷卡离我们有多远 NFC技术应用浅谈
作者:高向欣
NFC与其他无线通讯对比
  既然NFC技术是无线通讯技术那么就少不了和蓝牙、红外等已经普及的无线通讯技术的对比。
NFC、蓝牙、红外三者对比
单点对多点
106, 212, 424 kbps
规划速率可达868 kbps
721 kbps 115kbps
~1.0 Mbps
具备, 硬件实现
具备,软件实现
不具备, 使用IRFM除外
主动-主动/被动
主动-主动
主动-主动
  通过上表我们可以很直观的看到三者的区别。NFC的短距离通信特性正是其优点,由于耗电量低、一次只和一台机器链接,拥有较高的保密性与安全性,NFC有利于信用卡交易时避免被盗用。NFC的目标并非是取代蓝牙等其他无线技术,而是在不同的场合、不同的领域起到相互补充的作用。
  例如,有厂商曾推出过NFC-蓝牙音箱,只需要用NFC与该音箱一碰即可完成配对,免去了蓝牙配对的繁琐步骤。NFC简化了蓝牙的配对过程,而蓝牙又弥补了NFC在数据传输速度和距离上的不足,二者相互补充以便方便的使用。
提示:支持键盘“←&→”翻页
用其他账号登录:
请稍后,数据加载中...
请稍后,数据加载中...
上市时间:2018.05
上市时间:2018.06
上市时间:2018.05
上市时间:2018.06
上市时间:2018.03
上市时间:2018.06
上市时间:2018.06
上市时间:2018.06
上市时间:2017.09
上市时间:2018.05
上市时间:2018.06
上市时间:2018.05
上市时间:2018.05
上市时间:2018.06
上市时间:2018.06
上市时间:2018.06
上市时间:2018.06
上市时间:2018.06
上市时间:2018.05
上市时间:2018.05
热门搜索词
Copyright & 2007 -
北京沃德斯玛特网络科技有限责任公司.All rights reserved 发邮件给我们京ICP证-070681号 京ICP备号 京公网安备:京网文[8号关键词:BluetoothAdapter、ConnectivityManager、WifiManager、NfcMessage、NfcAdapter、NdefMessage、NdefRecord
管理蓝牙设备和发现模式
发现远程蓝牙设备
通过蓝牙通信
监视Internet连接
监视Wi-Fi和网路详细信息
配置Wi-Fi和扫描接入点
使用Wi-Fi Direct传输数据
扫描NFC标签
使用Android Bean传输数据
管理本地蓝牙设备适配器
通过类来控制本地蓝牙设备,该类代表运行应用程序的Android设备。
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
为了读取任何一种本地BluetoothAdapter属性、启动发现过程或者找到绑定的设备,需要在应用程序的manifest文件中包含BLUETOOTH权限。
为了修改任何一种本地设备属性,还需要BLUETOOTH_ADMIN使用权限。
BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
//使用isEnable方法确认设备已经启用
if(bluetoothAdapter.enable()){
//访问BluetoothAdapter的"友好的"(用户设置的,用于标识特定设备的任意字符串)名称
bluetoothAdapter.getName();
//获取硬件地址
bluetoothAdapter.getAddress();
如果拥有BLUETOOTH_ADMIN权限,那么就能够使用setName方法更改BluetoothAdapter的"友好的"名称。
使用方法,获取当前BluetoothAdapter的状态。
Indicates the local Bluetooth adapter is off.
Indicates the local Bluetooth adapter is on, and ready for use.
Indicates the local Bluetooth adapter is turning off.
Indicates the local Bluetooth adapter is turning on.
为了启用BluetoothAdapter,可以使用启动一个系统Referrence Activity并将静态常量作为其动作字符串。
private static final int ENABLE_BLUETOOTH = 1;
private void initBluetooth() {
if (!bluetooth.isEnabled()) {
// 蓝牙设备未启动,提示用户启用
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, ENABLE_BLUETOOTH);
// 蓝牙设备已启用,初始化UI
initBluetoothUI();
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
if (requestCode == ENABLE_BLUETOOTH)
if (resultCode == RESULT_OK) {
// 蓝牙设备已启用,初始化UI
initBluetoothUI();
if (requestCode == DISCOVERY_REQUEST) {
if (resultCode == RESULT_CANCELED) {
Log.d(TAG, "Discovery cancelled by user");
启用和禁用BluetoothAdapter是比较耗时的异步操作。
应用程序不应该轮训BluetoothAdapter,而是应当注册一个BroadcastReceiver用于监听。BroadcastReceiver包含以下两个extra。
Used as an int extra field in&&intents to request the previous power state.
Used as an int extra field in&&intents to request the current power state.
如果在manifest文件中包含了BLUETOOTH_ADMIN权限,还可以使用enable和disable方法直接打开和关闭BluetoothAdapter。
可发现性和远程设备发现
两个设备互相查找以进行连接的过程叫做发现。
在建立一个BluetoothSocket用于通信之前,本地BluetoothAdapter必须与远程设备绑定。而在两个设备能够绑定并连接之前,它们首先需要相互发现。
管理设备的可发现性
发现远程设备
管理网络和Internet连接
为了使用ConnectivityManager,应用程序需要读取和写入网络状态访问权限:,
final ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
支持用户首选项以进行后台数据传输
为了获得后台数据设置,需要调用方法(API Level 14之前)。
如果禁用了后台数据设置,那么你的应用程序应当仅在它处于活动状态并位于前台时传输数据。
如果你的应用程序需要后台数据传输以实现某些功能,则最佳实践是通知用户这一需求,并提供进入设置页面以允许他们更改其首选项。
如果用户确实更改了后台数据首选项,那么系统将会发送带有动作的BroadcastIntent。
registerReceiver(
new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
boolean backgroundEnabled = connectivity.getBackgroundDataSetting();
setBackgroundData(backgroundEnabled);
},new IntentFilter(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED)
在API Level 14以后,方法已被弃用,并且总是返回true。
将应用程序的数据使用首选项添加到系统设置中
&activity android:name=".MyPreferences"
android:label="@string/preference_title"&
  &intent-filter&
    &action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/&
    &category android:name="android.intent.category.DEFAULT" /&
  &/intent-filter&
&/activity&
设置好以后,系统设置中的ViewApplicationSetting按钮可启动你的PreferenceActivity,让用户调整应用程序的数据使用方法,而不是限制或禁用它。
查找和监视网络连接
方法会返回一个对象,其中包含了当前活动网络的详细信息。
也可以使用方法获得关于指定类型的非活动网络的详细信息。
使用返回的了解所返回的网络的连接状态、网络类型以及详细的状态信息。
在尝试传输数据前,应该配置一个重复报警,或者调度一个执行数据传输的后台服务,并使用检查是否连接到了Intent,如果是,则确认连接的类型。
NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo();
boolean isConnected = ((activeNetwork
!= null) && (activeNetwork.isConnectedOrConnecting()));
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
为了监视网络连接,可以创建一个BroadcastReceiver来监听&Broadcast Intent。
&!-- Monitoring connectivity --&
&receiver android:name=".ConnectivityChangedReceiver" &
&intent-filter &
&action android:name="android.net.conn.CONNECTIVITY_CHANGE"/&
&/intent-filter&
&/receiver&
为了使用,应用程序需要以下权限:、
final WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
()&Gets the Wi-Fi enabled state.
(boolean enabled) &&Enable or disable Wi-Fi.
监视Wi-Fi连接
每当Wi-Fi网络连接状态发生变化时,WifiManager会广播Intent,它会使用在WifiManager勒种定义的下列常量:
Broadcast intent action indicating that Wi-Fi has been enabled, disabled, enabling, disabling, or unknown.
Broadcast intent action indicating that the state of establishing a connection to an access point has changed.One extra provides the new.
Broadcast intent action indicating that a connection to the supplicant has been established (and it is now possible to perform Wi-Fi operations) or the connection to the supplicant has been lost.
Broadcast intent action indicating that the state of Wi-Fi connectivity has changed.
The RSSI (signal strength) has changed.
监视活动的Wi-Fi连接的详细信息
Return dynamic information about the current Wi-Fi connection, if any is active.
WifiInfo info = wifi.getConnectionInfo();
if (info.getBSSID() != null) {
int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);
int speed = info.getLinkSpeed();
String units = WifiInfo.LINK_SPEED_UNITS;
String ssid = info.getSSID();
String cSummary = String.format("Connected to %s at %s%s. " +
"Strength %s/5",
ssid, speed, units, strength);
Log.d(TAG, cSummary);
可以使用WifiManager的()方法进行接入点扫描。
一个带有动作的Intent奖杯广播以便异步宣布扫描完成并且结果可用。
调用()以获得扫描结果(&&)
每一个包含了为每个检测到的接入点所检索到的详细信息,包括链路速度、信号强度、SSID以及所支持的身份验证技术。
// Register a broadcast receiver that listens for scan results.
registerReceiver(new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
List&ScanResult& results = wifi.getScanResults();
ScanResult bestSignal = null;
for (ScanResult result : results) {
if (bestSignal == null ||
WifiManager.compareSignalLevel(
bestSignal.level,result.level) & 0)
bestSignal =
String connSummary = String.format("%s networks found. %s is" +
"the strongest.",
results.size(),
bestSignal.SSID);
Toast.makeText(MyActivity.this,
connSummary, Toast.LENGTH_LONG).show();
}, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
// Initiate a scan.
wifi.startScan();
管理Wi-Fi配置
()获取当前网络配置的列表(&&)
对象包含了网络ID、SSID和其他详细信息。
为了使用某个特定的网络配置,需要使用(int netId, boolean disableOthers)方法,并传入要使用的网络Id,同时将disableOthers设置为true。
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
List&WifiConfiguration& configurations = wifiManager.getConfiguredNetworks();
if (configurations.size() & 0) {
int netId = configurations.get(0).networkId;
wifiManager.enableNetwork(netId, true);
创建Wi-Fi网络配置
使用Wi-Fi Direct传输数据
近场通信(NFC)
API Level 9引入了近场通信(Near Field Communication,NFC)API。NFC是一种非接触式的技术,用于在短距离(通常小于4厘米)内少量数据的传输。
NFC传输可以在两个支持NFC的设备或者一个设备和一个NFC“标签”之间进行。
为读取、写入或者广播NFC消息,应用程序需要具有NFC manifest权限。
Allows applications to perform I/O operations over NFC.
Constant Value: "android.permission.NFC"
&&This is the high level manager, used to obtain this device's&. You can acquire an instance using&.
& &This represents the device's NFC adapter, which is your entry-point to performing NFC operations. You can acquire an instance with, or&.
读取NFC标签
当一个Android设备用于扫描一个NFC标签时,其系统将使用自己的标签分派系统解码传入的有效荷载。这个标签分派系统会分析标签,将数据归类,并使用Intent启动一个应用程序来接收数据。
为使应用程序能够接收NFC数据,需要添加一个Activity Intent Filter来监听以下的某个Intent动作:
优先级最高、也是最具体的NFC消息动作。使用这个动作的Intent包括MEME类型和/或URI数据。最好的做法是只要有可能就监听这个广播,因为其extra数据允许更加具体地定义要响应的标签。
如果从未知技术收到一个标签,则使用此Intent动作广播该标签。
当NFC技术已知,但是标签不包含数据(或者包含的数据不能被映射为MIME类型或者URI)时广播这个动作。
监听NFC标签,注册一个Activity,其只响应对于NFC.xxx.com的URI的NFC标签。
&activity android:name=".NFCViewer"&
&intent-filter&
&action android:name="android.nfc.action.NDEF_DISCOVERED"/&
&category android:name="android.intent.category.DEFAULT"/&
&data android:scheme="http"
android:host="NFC.xxx.com"/&
&/intent-filter&
&/activity&
提取NFC标签的有效荷载:
public class BeamerActivity extends Activity {
PendingIntent nfcPendingI
IntentFilter[] intentFiltersA
String[][] techListsA
NfcAdapter nfcA
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
// Create the Pending Intent.
int requestCode = 0;
int flags = 0;
Intent nfcIntent = new Intent(this, getClass());
nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
nfcPendingIntent =
PendingIntent.getActivity(this, requestCode, nfcIntent, flags);
// Create an Intent Filter limited to the URI or MIME type to
// intercept TAG scans from.
IntentFilter tagIntentFilter =
new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
tagIntentFilter.addDataScheme("http");
tagIntentFilter.addDataAuthority("blog.radioactiveyak.com", null);
intentFiltersArray = new IntentFilter[] { tagIntentFilter };
// Create an array of technologies to handle.
techListsArray = new String[][] {
new String[] {
NfcF.class.getName()
private void processIntent(Intent intent) {
String action = getIntent().getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] messages =
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
for (int i = 0; i & messages. i++) {
NdefMessage message = (NdefMessage)messages[i];
NdefRecord[] records = message.getRecords();
for (int j = 0; j & records. j++) {
NdefRecord record = records[j];
// TODO Process the individual records.
public void onPause() {
super.onPause();
nfcAdapter.disableForegroundDispatch(this);
public void onResume() {
super.onResume();
nfcAdapter.enableForegroundDispatch(
// Intent that will be used to package the Tag Intent.
nfcPendingIntent,
// Array of Intent Filters used to declare the Intents you
// wish to intercept.
intentFiltersArray,
// Array of Tag technologies you wish to handle.
techListsArray);
String action = getIntent().getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
processIntent(getIntent());
使用前台分派系统
Android Beam
API Level 14中引入的Android Beam提供了一个简单的API。应用程序可以使用该API在使用NFC的两个设备之间传输数据,只要将这两个设备背靠背放在一起即可。
为了使AndroidBeam传输消息,应用程序必须位于前台,而且接收数据的设备不能处于锁定状态。
通过将两个支持NFC的Android设备放在一起,可以启动Android Beam。用户会看到一个“touch to beam”(触摸以传输)UI,此时他们可以选择把前台应用程序“beam”(传输)到另外一个设备。
通过在应用程序内启用Android Beam,可以定义所传输的消息的有效荷载。如果没有自定义消息,应用程序的默认动作会在目标设备上启动它。如果目标设备上没有安装应用程序,那么GooglePlay就会启动,并显示应用程序的详细信息页面。
创建AndroidBeam消息
要创建一个新的对象,在其中创建至少一个,用于包含你想要传输给目标设备上应用程序的有效载荷。
创建新的时,必须制定它表示的记录类型、一个MIME类型、一个ID和有效载荷。
包含Android Application Record(AAR)形式的是一种很好的做法。这可以保证应用程序会在目标设备上启动;如果目标设备上没有安装应用程序,则会启动Google Play Store,让用户安装它。
要创建一个AAR&,需要使用类的(&packageName)静态方法,并指定应用程序的包名。
String payload = "Two to beam across";
String mimeType = "application/com.paad.nfcbeam";
byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
NdefMessage nfcMessage = new NdefMessage(new NdefRecord[] {
// Create the NFC payload.
new NdefRecord(
NdefRecord.TNF_MIME_MEDIA,
mimeBytes,
new byte[0],
payload.getBytes()),
// Add the AAR (Android Application Record)
NdefRecord.createApplicationRecord("com.paad.nfcbeam")
分配AndroidBeam有效载荷
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
有两种方式可以吧指定为应用程序的AndroidBeam有效载荷:
最简单的方法是使用(&message,&&activity,&&activities)方法来分配当AndroidBeam启动时总是应该从当前Activity发送的消息。通常,这种分配只需要在Activity的onResume方法中完成一次。
更好的方法是使用(&callback,&&activity,&activities)方法。该处理程序在消息被传输之前立即触发,允许你根据应用程序当前的上下文动态设置有效载荷内容。
如果使用回调处理程序同时设置了静态消息和动态消息,那么只有动态消息会被传输。
接收AndroidBeam消息
为了接收打包的有效载荷,首先要在Activity中添加一个新的Intent Filter。
android:label="@string/app_name"
android:name=".BeamerActivity" &
&intent-filter&
&action android:name="android.nfc.action.NDEF_DISCOVERED"/&
&category android:name="android.intent.category.DEFAULT"/&
&data android:mimeType="application/com.paad.nfcbeam"/&
&/intent-filter&
&/activity&
AndroidBeam启动后,接收设备上的Activity就会被启动;如果接收设备上没有安装应用程序,那么GooglePlayStore就会启动,以允许用户下载你的应用程序。
传输的数据会使用一个具有动作的Intent传输给Activity,其有效载荷可作为一个数组用于存储对应的。
Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage message = (NdefMessage)messages[0];
NdefRecord record = message.getRecords()[0];
//Returns the variable length payload.
String payload = new String(record.getPayload());
通常,有效载荷字符串是一个URI的形式,可以像对待Intent内封装的数据一样提取和处理它,以显示合适的视频、网页或地图坐标。
阅读(...) 评论() &

我要回帖

更多关于 那么给电脑装蓝牙 的文章

 

随机推荐