解锁近场通信:蓝牙、WiFi、NFC的代码实战与场景应用

✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧)

✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客

目录

一、引言

二、近场通信技术基础

(一)蓝牙

(二)WiFi

(三)NFC

三、蓝牙:代码实践与应用场景

(一)代码实践

1. Android 平台

2. iOS 平台

3. J2ME 平台

(二)应用场景

1. 智能穿戴设备

2. 智能家居控制

3. 室内定位

四、WiFi:代码实践与应用场景

(一)代码实践

1. 笔记本共享 WiFi 上网

2. 基于 ESP32 的智能机器人

(二)应用场景

1. 家庭网络覆盖

2. 商业场所

3. 工业物联网

五、NFC:代码实践与应用场景

(一)代码实践

1. Android 平台

2. React Native 平台

(二)应用场景

1. 移动支付

2. 门禁系统

3. 电子门票

六、技术对比与选择

(一)技术性能对比

(二)适用场景分析


一、引言

在数字化浪潮席卷全球的当下,蓝牙(Bluetooth)、无线保真(WiFi)、近场通信(NFC)这三种近场通信技术,已然成为了现代生活中不可或缺的存在,悄无声息却又深刻地改变着人们的生活与工作模式。无论是在繁华都市的写字楼中,还是在温馨宁静的家庭环境里,亦或是在熙熙攘攘的公共场所,都能发现它们的身影。

当你佩戴着无线蓝牙耳机,沉浸在音乐的美妙世界中,或是用蓝牙键盘和鼠标操控电脑,享受无线办公的便捷时,蓝牙技术正在默默地发挥作用;在家庭中,智能电视、智能音箱、智能摄像头等设备通过 WiFi 连接,构建起智能家居的生态系统,让你可以远程控制家电、观看在线视频;在出行时,你使用手机的 NFC 功能乘坐地铁、公交,或是在便利店进行快捷支付,无需再携带实体交通卡和现金。这些日常场景,无不彰显着蓝牙、WiFi 和 NFC 技术的重要性。

对于开发者而言,深入了解并熟练掌握这三种技术的代码实践,能够开发出更具创新性和实用性的应用程序,满足用户日益增长的需求。在实际项目中,根据不同的场景需求,合理选择和运用蓝牙、WiFi 和 NFC 技术,能够为项目带来更高的效率、更好的用户体验以及更多的可能性。接下来,让我们一同深入探索蓝牙、WiFi、NFC 在代码实践与实际项目中的应用奥秘。

二、近场通信技术基础

(一)蓝牙

蓝牙技术由爱立信公司于 1994 年提出,旨在实现短距离无线通信,以取代传统的有线连接。它工作在全球通用的 2.4GHz ISM 频段,无需申请许可证 ,通过跳频扩频技术,将 2.402-2.48GHz 频段分成 79 个频点,相邻频点间隔 1MHz,蓝牙设备每秒钟在这些频点上跳变 1600 次,以此有效避免干扰,确保通信的稳定性。

从特点上看,蓝牙具有明显的优势。其模块体积小巧,便于集成到各类小型设备中,像无线蓝牙耳机、智能手环等,让设备在保持小巧的同时具备无线通信能力;功耗较低,在通信连接状态下,有激活模式、呼吸模式、保持模式和休眠模式,后三种低功耗模式可有效节能,延长设备电池续航时间,特别适合使用电池供电的小型设备;成本也较低,随着市场需求增长和技术成熟,蓝牙芯片和模块价格不断下降,降低了产品的生产成本,使得蓝牙技术在众多设备中得以广泛应用。此外,蓝牙还能同时传输语音和数据,采用电路交换和分组交换技术,支持异步数据信道、三路语音信道以及异步数据与同步语音同时传输的信道。

蓝牙的发展历程也是一部不断演进的历史。1999 年发布的蓝牙 1.0 版本,定义了蓝牙是一种低功耗的无线技术,传输速率范围为 748-810kbit/s,但容易受到同频率产品干扰,影响通信质量。随后,蓝牙 1.1 版本在 2001 年发布,修正了互不兼容的数据格式,增加了对抗干扰跳频功能;2003 年的蓝牙 1.2 版本,增加了 AFH 可调式跳频技术,主要针对与 802.11b/g 之间的互相干扰问题进行了全面的改进。2004 年,蓝牙 2.0 版本发布,数据传输速率提高了 3 倍,降低了能耗,增加了连接设备的数量,还开始支持双工模式,即一面作语音通信,同时亦可以传输档案、高质素图片,也支持 Stereo 运作。2007 年的蓝牙 2.1 版本,支持通过 NFC 进行配对;2009 年的蓝牙 3.0 版本,核心是引入了 Generic Alternate MAC/PHY(AMP),使蓝牙设备能最大限度地利用多种高速无线技术中更高的传输速率。2010 年发布的蓝牙 4.0 版本,提出了低功耗蓝牙、经典蓝牙和高速蓝牙三种模式,把蓝牙的传输距离提升到 100 米上。2013 年的蓝牙 4.1 版本,增强了与 LTE 网络的互操作性,支持通过 IPv6 实现无线传输,使得在家庭、办公室或公共场所的室内定位更加准确,同时提高了低功耗蓝牙的安全性。到 2016 年的蓝牙 5.0 版本,传输速度提高到 2 Mbps,传输距离扩展至 200 米,增强了广播功能,使设备间的连接更加稳定可靠。2024 年发布的蓝牙 5.4 标准,在广播功能、多设备连接、低延迟音频和安全性方面进行了全面优化,特别为物联网设备设计,支持大规模设备的连接和管理。

(二)WiFi

WiFi 是基于 IEEE 802.11 协议的无线局域网接入技术,工作频段一般为 2.4GHz,部分也可工作在 5GHz 频段。它的工作原理是通过无线电波来传输数据,无线路由器将有线网络信号转换成无线电波发射出去,无线设备(如手机、电脑等)通过内置的无线网卡接收这些信号,从而实现设备与网络的连接 。在数据传输过程中,WiFi 利用正交频分复用(OFDM)和多输入多输出(MIMO)等技术,将通信数据拆分成小部分并通过无线信道广播,同时通过频率选择多路复用技术,将数据分配到不同的频率段,以避免相互干扰。

WiFi 的特点显著,最突出的是传输速度快,随着技术的不断升级,如今的 WiFi 6 最高传输速率可以达到 11Gbps,能够满足高清视频播放、在线游戏、大文件传输等对网络速度要求较高的应用场景;覆盖范围广,一般无线路由器的信号覆盖半径可达数十米,在一些公共场所,通过多个无线路由器的合理布局和信号增强设备,可实现更大范围的覆盖;使用也非常便捷,只要在 WiFi 信号覆盖范围内,设备开启 WiFi 功能并输入正确的密码,即可轻松连接网络,无需繁琐的布线和设置过程,适合各种移动设备随时随地接入网络。另外,WiFi 还具备可扩展性,能够轻松添加新设备,建立大规模网络,满足家庭、企业等不同场景下多设备同时联网的需求;并且采用了数据加密技术和密钥管理机制,能提供相对较高的系统安全性,防止数据泄露和黑客攻击等安全问题。

WiFi 的发展也经历了多个重要阶段。1997 年,IEEE 802.11 标准的第一个版本发表,定义了介质访问接入控制层(MAC 层)和物理层,奠定了 WiFi 技术的基础。随后,802.11b 标准于 1999 年发布,使用 2.4GHz 频段,最高支持 11Mbps 的传输速率,成为当时应用较为广泛的 WiFi 标准;2003 年的 802.11g 标准,同样工作在 2.4GHz 频段,最高支持 54Mbps 的传输速率,兼容 802.11b 设备,进一步提升了网络速度。2009 年,802.11n 标准问世,可在 2.4GHz 和 5GHz 频段下使用,最高支持 600Mbps 的传输速率,引入了 MIMO 技术,提高了传输性能和稳定性。2013 年发布的 802.11ac 标准,工作在 5GHz 频段,最高支持 1Gbps 的传输速率,进一步提升了网络速度和容量,满足了高清视频流、大数据传输等应用需求。2019 年,WiFi 6(802.11ax)标准正式发布,支持更高速率、更多设备连接、更低延迟等特性,最高传输速率可以达到 11Gbps,在多设备同时连接的场景下,也能保持网络的高效稳定运行,适应了物联网时代智能设备大量接入的需求。

(三)NFC

NFC 即近场通信技术,是一种短距离的高频无线通信技术,工作频率为 13.56MHz,有效距离一般在 10 厘米以内。它基于射频识别(RFID)技术发展而来,通过在发起设备和目标设备之间创建射频场,实现数据的交换 。在实际应用中,当两个支持 NFC 的设备靠近时,它们会自动检测到对方,并通过射频信号进行数据传输。例如,在移动支付场景中,用户将手机靠近支持 NFC 的 POS 机,手机中的 NFC 芯片会与 POS 机进行通信,完成支付信息的传输和验证。

NFC 具有独特的特点。首先是操作简单便捷,只需将两个设备靠近,无需复杂的配对或设置过程,即可快速完成数据传输,这种即贴即传的方式,大大提高了使用效率,特别适合在一些需要快速交互的场景中使用,如移动支付、门禁刷卡等;其次是安全性高,NFC 采用了多种安全机制,如数据加密、认证等,确保数据在传输过程中的安全性和完整性,降低了信息泄露和被篡改的风险;再者,NFC 的功耗较低,由于其通信距离短、信号强度低,设备在进行 NFC 通信时消耗的电量较少,不会对设备的电池续航造成较大影响。此外,NFC 还具备兼容性好的特点,能够与现有的许多智能设备和基础设施兼容,便于推广和应用。

NFC 的发展历程相对较短,但也取得了显著的进展。2002 年,飞利浦、索尼和诺基亚共同开发了 NFC 技术,并成立了 NFC 论坛,致力于推动 NFC 技术的标准化和应用推广。早期,NFC 技术主要应用于门禁系统、公交卡等领域,随着智能手机的普及,NFC 技术逐渐集成到手机中,开启了移动支付、电子票务等新的应用场景。如今,NFC 技术在移动支付领域得到了广泛应用,如 Apple Pay、华为 Pay、小米 Pay 等,用户只需将手机靠近 POS 机,即可完成支付,无需携带现金或银行卡;在电子票务方面,用户可以使用手机的 NFC 功能购买和使用地铁票、火车票、电影票等,方便快捷。此外,NFC 技术还在智能家居、智能标签、身份识别等领域展现出了广阔的应用前景,为人们的生活和工作带来了更多的便利和创新。

三、蓝牙:代码实践与应用场景

(一)代码实践

1. Android 平台

在 Android 平台上,实现蓝牙搜索、设备连接及数据接收涉及多个关键步骤和类的使用。首先,需要获取蓝牙适配器BluetoothAdapter,它是控制蓝牙功能的核心类,通过它可以检测蓝牙是否启用、启动发现设备的过程以及查询已配对的设备。示例代码如下:

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

if (bluetoothAdapter == null) {

// 设备不支持蓝牙功能

return;

}

if (!bluetoothAdapter.isEnabled()) {

// 请求打开蓝牙

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

}

搜索设备时,通过BluetoothAdapter的startDiscovery()方法触发搜索过程,该方法会发送一系列广播,开发者通过注册BroadcastReceiver来接收这些广播,从而获取周边蓝牙设备的信息。例如:

// 创建BroadcastReceiver来处理发现设备的广播

BroadcastReceiver mReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (BluetoothDevice.ACTION_FOUND.equals(action)) {

// 从Intent中获取BluetoothDevice对象

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

// 收集设备信息,如设备名称和地址

String deviceName = device.getName();

String deviceAddress = device.getAddress();

// 可以将设备信息添加到列表中展示给用户

}

}

};

// 注册广播接收器

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

registerReceiver(mReceiver, filter);

// 开始搜索设备

bluetoothAdapter.startDiscovery();

在连接设备时,需要先获取目标设备的BluetoothDevice对象,然后通过createRfcommSocketToServiceRecord方法创建一个BluetoothSocket,并调用connect方法进行连接。示例代码如下:

BluetoothDevice device; // 假设已获取目标设备对象

UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");// 蓝牙串口服务UUID

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid);

try {

socket.connect();

// 连接成功,可进行数据传输

} catch (IOException e) {

e.printStackTrace();

// 连接失败处理

}

数据接收通过BluetoothSocket的输入流实现。在成功建立连接后,获取输入流并读取数据,示例代码如下:

InputStream inputStream = socket.getInputStream();

byte[] buffer = new byte[1024];

int bytesRead;

while ((bytesRead = inputStream.read(buffer))!= -1) {

String data = new String(buffer, 0, bytesRead);

// 处理接收到的数据

}
2. iOS 平台

在 iOS 平台上,基于蓝牙对等网络通信使用Game Kit框架中的GKSession、GKSessionDelegate、GKPeerPickerController和GKPeerPickerControllerDelegate来实现。开发过程主要分为连接、发送数据和接收数据三个步骤。

首先是连接步骤,以创建一个简单的蓝牙连接应用为例,在视图控制器中,需要引入GameKit框架并实现相关协议。创建GKPeerPickerController对象用于连接设备,代码如下:

#import <UIKit/UIKit.h>

#import <GameKit/GameKit.h>

@interface ViewController : UIViewController <GKSessionDelegate, GKPeerPickerControllerDelegate>

@property (nonatomic, strong) GKPeerPickerController *picker;

@property (nonatomic, strong) GKSession *session;

- (IBAction)connect:(id)sender;

@end

@implementation ViewController

- (IBAction)connect:(id)sender {

_picker = [[GKPeerPickerController alloc] init];

_picker.delegate = self;

_picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; // 设置为蓝牙连接

[_picker show];

}

// 连接成功后的回调方法

- (void)peerPickerController:(GKPeerPickerController *)pk didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {

_session = session;

_session.delegate = self;

[_session setDataReceiveHandler:self withContext:nil];

_picker.delegate = nil;

[_picker dismiss];

// 连接成功,可进行后续操作

}

// 监测会话状态变化的方法

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {

if (state == GKPeerStateConnected) {

// 已连接状态处理

} else if (state == GKPeerStateDisconnected) {

// 断开连接状态处理

}

}

@end

发送数据时,通过GKSession的sendData:toPeers:withDataMode:error:方法实现。例如发送一个字符串数据:

NSString *message = @"Hello, Bluetooth!";

NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];

NSError *error;

[_session sendData:data toPeers:@[peerID] withDataMode:GKPeerDataReliable error:&error];

if (error) {

// 处理发送错误

}

接收数据则在实现GKSessionDelegate协议的session:didReceiveData:fromPeer:方法中进行处理,示例代码如下:

- (void)session:(GKSession *)session didReceiveData:(NSData *)data fromPeer:(NSString *)peerID {

NSString *receivedMessage = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

// 处理接收到的消息

}
3. J2ME 平台

在 Nokia S60 平台上,利用 J2ME 进行蓝牙编程,需要使用 JSR - 82(Java APIs for Bluetooth Wireless Technology)提供的 API。以下是一个简单的蓝牙设备搜索、连接和数据传输的代码示例。

首先,获取本地蓝牙设备并创建服务发现代理,示例代码如下:

import javax.bluetooth.*;

import javax.microedition.io.*;

public class BluetoothExample {

public static void main(String[] args) {

try {

LocalDevice localDevice = LocalDevice.getLocalDevice();

DiscoveryAgent agent = localDevice.getDiscoveryAgent();

// 设备搜索监听器

DiscoveryListener listener = new DiscoveryListener() {

public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {

try {

System.out.println("Discovered device: " + btDevice.getFriendlyName(true));

} catch (BluetoothStateException e) {

e.printStackTrace();

}

}

public void inquiryCompleted(int discType) {

System.out.println("Inquiry completed.");

}

public void serviceSearchCompleted(int transID, int respCode) {

System.out.println("Service search completed.");

}

public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {

for (int i = 0; i < servRecord.length; i++) {

System.out.println("Discovered service: " + servRecord[i].getServiceName());

}

}

};

// 开始设备搜索

agent.startInquiry(DiscoveryAgent.GIAC, listener);

// 假设已获取到目标设备和服务记录

RemoteDevice remoteDevice = RemoteDevice.getRemoteDevice("00:11:22:33:44:55");// 目标设备地址

UUID uuid = new UUID("1234567890ABCDEF", false);

ServiceRecord serviceRecord = agent.searchServices(null, new UUID[]{uuid}, remoteDevice).nextElement();

// 建立连接

StreamConnection connection = (StreamConnection) Connector.open(serviceRecord.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false));

// 发送数据

DataOutputStream out = new DataOutputStream(connection.openOutputStream());

out.writeUTF("Hello, Bluetooth!");

out.flush();

out.close();

// 接收数据

DataInputStream in = new DataInputStream(connection.openInputStream());

String receivedData = in.readUTF();

System.out.println("Received data: " + receivedData);

in.close();

connection.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

(二)应用场景

1. 智能穿戴设备

智能穿戴设备如智能手表、手环等,与手机之间的数据同步和消息提醒是蓝牙技术的常见应用场景。以智能手表为例,通过蓝牙与手机配对连接后,能实时同步手机上的各种信息。当手机接收到新的短信、微信消息、来电提醒时,智能手表会立即收到通知并进行提醒,用户无需拿出手机即可知晓重要信息。在健康监测方面,智能手表能实时监测用户的心率、运动步数、睡眠质量等数据,通过蓝牙将这些数据同步到手机上的相关应用程序中,方便用户进行数据分析和健康管理。像苹果的 Apple Watch,通过蓝牙与 iPhone 连接,用户可以直接在手表上查看手机推送的通知,包括邮件、社交媒体消息等;还能将运动数据同步到 iPhone 的健康应用中,为用户提供全面的健康数据记录和分析。

2. 智能家居控制

在智能家居领域,蓝牙技术可实现手机对智能家电的远程控制。用户通过手机上的智能家居应用程序,连接家中支持蓝牙的智能家电设备,如智能灯泡、智能插座、智能门锁等,就能轻松控制家电的开关、调节亮度、设置定时任务等。例如,用户在下班回家的路上,就可以通过手机提前打开家中的智能灯泡,让家里在自己到家时就充满光亮;或者在睡觉前,通过手机关闭所有连接的智能插座,避免电器待机耗电。小米智能家居生态系统中的部分智能设备,如小米智能灯泡、小米智能插座等,都支持蓝牙连接,用户可以通过小米米家 APP 进行远程控制,实现智能化的家居生活体验。

3. 室内定位

利用蓝牙信标技术可以实现室内定位和导航,在大型商场、医院、停车场等室内场所,这种技术发挥着重要作用。蓝牙信标是一种低功耗的无线传输设备,它会周期性地广播信号。当用户携带的手机等移动设备进入蓝牙信标的信号覆盖范围时,设备会接收到信标发出的信号,并根据信号强度和特定算法计算出与信标的距离。通过多个信标的信号,结合三角测量法或多边定位法等数学方法,就可以确定移动设备在室内的大致位置坐标,从而实现导航和定位功能。在大型商场中,顾客可以通过商场的手机应用程序,利用室内蓝牙导航快速找到心仪的店铺、餐厅、卫生间等位置;在医院里,患者和家属能够借助蓝牙导航轻松找到挂号处、科室、药房等关键区域,减少就医过程中的迷茫和时间浪费,提高医院的服务效率和患者满意度。例如,一些大型商场采用蓝牙信标技术,为顾客提供个性化的导航服务,根据顾客的位置推送周边店铺的优惠信息和推荐商品,提升顾客的购物体验和消费转化率。

四、WiFi:代码实践与应用场景

(一)代码实践

1. 笔记本共享 WiFi 上网

在 Windows 系统下,通过命令行设置实现笔记本共享 WiFi 上网,主要涉及netsh命令的使用。netsh是一个 Windows 系统自带的网络配置命令行工具,它可以用于配置和显示 Windows 系统的网络设置。

以 Windows 10 系统为例,首先需要以管理员身份运行命令提示符。在开始菜单中搜索 “命令提示符”,右键点击并选择 “以管理员身份运行”。然后,输入以下命令来设置 WiFi 热点的相关参数:

netsh wlan set hostednetwork mode=allow ssid=YourWiFiName key=YourWiFiPassword

其中,mode=allow表示允许创建承载网络,ssid后面的YourWiFiName是你自定义的 WiFi 热点名称,key后面的YourWiFiPassword是你设置的 WiFi 密码,密码长度至少为 8 位。

设置完成后,还需要共享已连接的网络。打开 “网络和共享中心”,点击左侧的 “更改适配器设置”,找到当前已连接到互联网的网络连接(通常是以太网连接或无线连接),右键单击它并选择 “属性”。在弹出的属性窗口中,切换到 “共享” 选项卡,勾选 “允许其他网络用户通过此计算机的 Internet 连接来连接”,并在下方的下拉菜单中选择 “Microsoft Wi-Fi Direct Virtual Adapter”(如果没有此选项,可能是系统版本问题或驱动未正确安装),然后点击 “确定”。

最后,在命令提示符中输入以下命令来启动承载网络:

netsh wlan start hostednetwork

执行该命令后,如果显示 “已启动承载网络”,则表示 WiFi 热点设置成功,其他设备可以搜索并连接到你设置的 WiFi 热点。如果需要停止共享 WiFi,可以在命令提示符中输入:

netsh wlan stop hostednetwork
2. 基于 ESP32 的智能机器人

在基于 ESP32 的智能机器人项目中,实现机器人与鸿蒙 OS 设备的 WiFi 通信及控制,主要利用 ESP32 的 WiFi 功能和 TCP/IP 协议。以下是一个简单的代码示例,展示了如何实现机器人的基本控制功能。

首先,需要在 ESP32 上编写代码来连接 WiFi 并建立 TCP 服务器。在 Arduino IDE 中,安装 ESP32 开发板支持包,并编写如下代码:

#include <WiFi.h>

#include <WiFiClient.h>

#include <ESP32Servo.h>

// 引脚定义

#define MOTOR_A_1 2

#define MOTOR_A_2 4

#define MOTOR_B_1 16

#define MOTOR_B_2 17

#define SERVO_PIN 18

// Wi-Fi配置

const char* ssid = "YourSSID";

const char* password = "YourPassword";

// 创建WiFi服务器

WiFiServer server(80);

// 创建舵机对象

Servo servo;

// 电机控制函数

void motorControl(int speedA, int speedB) {

// 控制电机A

digitalWrite(MOTOR_A_1, speedA > 0? HIGH : LOW);

digitalWrite(MOTOR_A_2, speedA < 0? HIGH : LOW);

analogWrite(MOTOR_A_1, abs(speedA));

// 控制电机B

digitalWrite(MOTOR_B_1, speedB > 0? HIGH : LOW);

digitalWrite(MOTOR_B_2, speedB < 0? HIGH : LOW);

analogWrite(MOTOR_B_1, abs(speedB));

}

void setup() {

Serial.begin(115200);

// 初始化电机引脚

pinMode(MOTOR_A_1, OUTPUT);

pinMode(MOTOR_A_2, OUTPUT);

pinMode(MOTOR_B_1, OUTPUT);

pinMode(MOTOR_B_2, OUTPUT);

// 初始化舵机

servo.attach(SERVO_PIN);

// 连接Wi-Fi

WiFi.begin(ssid, password);

while (WiFi.status()!= WL_CONNECTED) {

delay(1000);

Serial.println("Connecting to WiFi...");

}

Serial.println("Connected to WiFi");

Serial.print("IP address: ");

Serial.println(WiFi.localIP());

// 启动服务器

server.begin();

Serial.println("Server started");

}

void loop() {

// 监听客户端连接

WiFiClient client = server.available();

if (client) {

Serial.println("New client connected");

// 处理客户端请求

while (client.connected()) {

if (client.available()) {

String command = client.readStringUntil('\n');

command.trim();

// 解析命令

if (command.startsWith("move:")) {

// 解析电机速度

int speedA = command.substring(5, command.indexOf(',')).toInt();

int speedB = command.substring(command.indexOf(',') + 1).toInt();

motorControl(speedA, speedB);

} else if (command.startsWith("servo:")) {

// 解析舵机角度

int angle = command.substring(6).toInt();

servo.write(angle);

}

}

}

// 客户端断开连接

client.stop();

Serial.println("Client disconnected");

}

}

在鸿蒙 OS 设备上,需要开发一个应用程序来与 ESP32 进行通信。以下是一个简单的鸿蒙 OS 应用程序界面代码示例(使用 JavaScript 和 ArkUI 框架):

<div class="container">

<button onclick="moveForward()">前进</button>

<button onclick="moveBackward()">后退</button>

<button onclick="turnLeft()">左转</button>

<button onclick="turnRight()">右转</button>

<button onclick="stop()">停止</button>

<button onclick="setServoAngle()">设置舵机角度</button>

</div>

<script>

import { connect } from '@system.connect';

export default {

data() {

return {

deviceId: '', // 设备ID,需要替换为实际值

servoAngle: 90 // 初始舵机角度

};

},

onInit() {

this.discoverDevice();

},

discoverDevice() {

connect.discover({

success: (devices) => {

if (devices.length > 0) {

this.deviceId = devices[0].deviceId;

}

},

fail: (error) => {

console.error('Device discovery failed:', error);

},

});

},

sendMessage(command) {

if (this.deviceId) {

connect.send({

deviceId: this.deviceId,

message: command,

success: () => {

console.log('Message sent successfully');

},

fail: (error) => {

console.error('Message sending failed:', error);

},

});

}

},

moveForward() {

this.sendMessage('move:100,100');

},

moveBackward() {

this.sendMessage('move:-100,-100');

},

turnLeft() {

this.sendMessage('move:-100,100');

},

turnRight() {

this.sendMessage('move:100,-100');

},

stop() {

this.sendMessage('move:0,0');

},

setServoAngle() {

this.sendMessage(`servo:${this.servoAngle}`);

}

}

</script>

通过以上代码,实现了基于 ESP32 的智能机器人与鸿蒙 OS 设备之间的 WiFi 通信及控制,用户可以通过鸿蒙 OS 设备上的应用程序发送指令,控制机器人的运动和舵机的角度。

(二)应用场景

1. 家庭网络覆盖

在家庭网络覆盖中,不同户型需要采用不同的 WiFi 部署方案及设备选择。对于小户型(如 80 平米左右),由于面积较小且户型结构不复杂,常见的 WiFi 问题主要是无线路由器摆放位置不当或设备老旧。解决方法首先是合理摆放路由器,避免将其放置在弱电箱中,因为弱电箱的屏蔽作用以及与其他房间的距离和墙体阻隔,会导致 WiFi 信号不佳。大部分家用无线路由器天线增益为 5dBi,将其放置在家庭中心位置,能最大限度覆盖每个房间,保障上网体验。对于使用超过 3 年的路由器,建议更换。若家庭宽带在 200M 以下,可选择千兆双频路由器;若追求更好的网络体验和未来升级空间,也可直接选择 WiFi6 路由器,以应对未来宽带升级或接入设备增加的情况。

大户型(如三房以上的大户型、复式等),一个无线路由器很难实现全面覆盖,AC+AP 组网和 Mesh 路由组网是目前较为成熟的无线漫游方案。AC+AP 组网方案中,AP(无线访问接入点)相当于连接有线网和无线网的桥梁,将各个无线网络客户端连接到一起,并接入以太网,实现网络无线覆盖;AC(无线控制器)则集中化控制局域网内可控的无线 AP,是无线网络的核心。该方案通过一台 AC 控制器上行连接家庭网关,下行使用网线连接各个房间的 AP 面板,无线设备通过各自的 AP 接入统一的 WiFi,实现自动漫游。其优点是基础网络有线搭建,快速稳定不易出现故障;装饰效果好,AP 采用面板式或吸顶式,电源线和网线可做隐藏处理;AC+AP 统一管理,方便快捷;无线信号覆盖广,信号强度好,网速稳定。但缺点是需要提前预埋网线,且方案造价相对较高。

Mesh 路由器组网则组建方便,配置好一台主路由后,其他路由能自动进行相互间的 Mesh 组网。这种组网采用网状连接,每个网络节点都可发送和接收信号,可与一个或多个对等节点直接通信,一个节点出问题会自动切换。在这个网络中,WiFi 的 SSID 统一,无线设备可自由寻找信号最好的节点连接传输数据,用户手持设备在不同节点间穿梭时,能实现较好的无缝漫游。其优点是安装简单,第一个 Mesh 路由接入光猫设置上网后,其他路由通电即可自动组网;网络相对稳定,单个节点损坏不影响其他设备数据传输,还能自动选择最优传输节点;部署灵活,增大覆盖面积只需增加设备。不过,该方案也存在网络容量限制,由于 Mesh 网络存在转发,转发后速率会降低,需限制每个网络中节点数量;同时存在延迟,多次转发后延迟较高(具体延迟时间与设备有关)。

2. 商业场所

在酒店场景中,WiFi 覆盖是吸引顾客的重要因素之一。酒店通常采用集中式的 WiFi 部署方案,通过核心交换机连接多个无线接入点(AP),实现整个酒店区域的 WiFi 覆盖。为了提高用户体验,酒店可以采用负载均衡技术,将用户流量均匀分配到各个 AP 上,避免单个 AP 负载过高导致网络拥塞。同时,酒店还可以通过认证系统,实现用户的快速登录和管理,例如采用短信验证码、微信认证等方式,方便用户接入网络。此外,酒店还可以利用 WiFi 网络进行营销推广,如向用户推送酒店的优惠活动、特色服务等信息,提高用户的满意度和忠诚度。

景区的 WiFi 覆盖面临着范围广、地形复杂等挑战。为了实现景区的全面覆盖,通常采用分布式的 WiFi 部署方案,在景区的各个景点、休息区、餐厅等区域设置 AP。同时,为了保证信号的稳定性和可靠性,景区可以采用高功率的 AP 和定向天线,增强信号的传输距离和覆盖范围。此外,景区还可以利用 WiFi 网络实现游客流量监测、智能导游等功能,通过分析游客的上网行为和位置信息,合理安排景区的资源和服务,提高景区的管理效率和服务质量。

商场的 WiFi 覆盖需要满足大量顾客同时上网的需求,同时还要支持商家的无线支付、推广活动等功能。商场一般采用高密度的 WiFi 部署方案,在商场的各个楼层、店铺内设置多个 AP,实现无缝覆盖。为了保证网络的可靠性和安全性,商场可以采用双链路备份、防火墙等技术,防止网络故障和黑客攻击。此外,商场还可以利用 WiFi 网络进行精准营销,通过分析用户的上网行为和消费习惯,向用户推送个性化的广告和优惠信息,提高商场的销售额和用户的购物体验。例如,当用户进入商场的某个店铺时,系统可以自动向用户推送该店铺的优惠活动和新品信息,引导用户消费。

3. 工业物联网

在工业生产中,WiFi 技术在设备监控、数据传输等方面发挥着重要作用。以工厂自动化生产线为例,通过在生产设备上安装 WiFi 模块,设备可以实时将运行状态、生产数据等信息传输到中央控制系统。例如,生产线上的传感器可以采集设备的温度、压力、转速等数据,通过 WiFi 网络将这些数据发送到监控中心,管理人员可以实时了解设备的运行情况,及时发现故障隐患并进行处理,提高生产效率和产品质量。同时,通过 WiFi 网络,还可以实现对生产设备的远程控制,技术人员可以在办公室或远程地点对设备进行参数调整、启动、停止等操作,减少现场操作的工作量和风险。

在智能仓储管理中,WiFi 技术也得到了广泛应用。仓库中的货物搬运机器人(AGV)、智能货架、库存管理系统等设备通过 WiFi 网络连接在一起,实现货物的自动化存储、检索和盘点。AGV 可以根据系统的指令,通过 WiFi 网络接收导航信息,准确地将货物搬运到指定位置,提高仓储作业的效率和准确性。同时,库存管理系统可以实时更新货物的库存信息,通过 WiFi 网络将数据传输到企业的管理系统中,为企业的生产和销售提供准确的库存数据支持。此外,WiFi 技术还可以用于环境安全监测,通过在工业场所部署温湿度传感器、有害气体传感器等设备,利用 WiFi 网络将监测数据实时传输到监控中心,当环境参数超出安全范围时,系统可以及时发出警报,保障生产环境的安全。

五、NFC:代码实践与应用场景

(一)代码实践

1. Android 平台

在 Android 平台上进行 NFC 读写操作,首先要确保设备支持 NFC 功能。通过以下代码检查设备是否支持 NFC:

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);

if (nfcAdapter == null) {

// 设备不支持NFC功能

Toast.makeText(this, "该设备不支持NFC功能", Toast.LENGTH_SHORT).show();

return;

}

若设备支持 NFC,还需判断 NFC 功能是否开启,若未开启则引导用户开启:

if (!nfcAdapter.isEnabled()) {

Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);

startActivity(intent);

}

在 AndroidManifest.xml 文件中,需要声明 NFC 权限和功能:

<uses-permission android:name="android.permission.NFC" />

<uses-feature android:name="android.hardware.nfc" android:required="true" />

同时,在 Activity 标签中声明识别 NFC 标签的 IntentFilter:

<activity android:name=".NFCActivity">

<intent-filter>

<action android:name="android.nfc.action.TAG_DISCOVERED" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="*/*" />

</intent-filter>

</activity>

读取 NFC 标签数据时,在 Activity 的onNewIntent方法中获取标签信息。示例代码如下:

@Override

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())

|| NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())

|| NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

try {

Ndef ndef = Ndef.get(tag);

if (ndef!= null) {

ndef.connect();

NdefMessage ndefMessage = ndef.getNdefMessage();

NdefRecord[] records = ndefMessage.getRecords();

for (NdefRecord record : records) {

if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {

String text = readTextRecord(record);

Log.d("NFC", "读取到的文本数据: " + text);

}

}

ndef.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

private String readTextRecord(NdefRecord record) throws UnsupportedEncodingException {

byte[] payload = record.getPayload();

String textEncoding = ((payload[0] & 0x80) == 0)? "UTF-8" : "UTF-16";

int languageCodeLength = payload[0] & 0x3F;

return new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);

}

写入 NFC 标签数据的示例代码如下:

public void writeNFCToTag(String data, Tag tag) {

try {

Ndef ndef = Ndef.get(tag);

if (ndef!= null) {

ndef.connect();

if (!ndef.isWritable()) {

Toast.makeText(this, "NFC Tag是只读的!", Toast.LENGTH_LONG).show();

return;

}

NdefRecord ndefRecord = NdefRecord.createTextRecord(null, data);

NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{ndefRecord});

if (ndef.getMaxSize() < ndefMessage.toByteArray().length) {

Toast.makeText(this, "NFC Tag的空间不足!", Toast.LENGTH_LONG).show();

return;

}

ndef.writeNdefMessage(ndefMessage);

Toast.makeText(this, "已成功写入数据!", Toast.LENGTH_LONG).show();

ndef.close();

} else {

NdefFormatable format = NdefFormatable.get(tag);

if (format!= null) {

try {

format.connect();

format.format(new NdefMessage(new NdefRecord[]{NdefRecord.createTextRecord(null, data)}));

Toast.makeText(this, "已成功写入数据!", Toast.LENGTH_LONG).show();

format.close();

} catch (Exception e) {

Toast.makeText(this, "写入NDEF格式数据失败!", Toast.LENGTH_LONG).show();

}

} else {

Toast.makeText(this, "NFC标签不支持NDEF格式!", Toast.LENGTH_LONG).show();

}

}

} catch (IOException | FormatException e) {

e.printStackTrace();

}

}
2. React Native 平台

在 React Native 项目中使用 NFC,首先要安装react-native-nfc-manager库,通过 npm 或 yarn 进行安装:

npm install react-native-nfc-manager --save

# 或

yarn add react-native-nfc-manager

对于 React Native 0.60 及以上版本,自动链接会处理大部分工作。如果需要手动链接,可以运行:

react-native link react-native-nfc-manager

在 Android 平台配置方面,需要在AndroidManifest.xml文件中添加 NFC 权限和功能声明:

<uses-permission android:name="android.permission.NFC" />

<uses-feature android:name="android.hardware.nfc" android:required="true" />

在 iOS 平台配置时,需要在Info.plist文件中添加 NFC 权限描述:

<key>Privacy - NFC Usage Description</key>

<string>需要使用NFC功能进行数据读取和写入</string>

以下是一个简单的示例,展示如何在 React Native 应用中启用 NFC 并读取标签数据:


import React, { useState, useEffect } from'react';

import { SafeAreaView, Text, Button } from'react-native';

import NfcManager, { NfcEvents } from'react-native-nfc-manager';

function App() {

const [tagData, setTagData] = useState('');

useEffect(() => {

NfcManager.start();

return () => {

NfcManager.setEventListener(NfcEvents.DiscoverTag, null);

};

}, []);

async function readNdef() {

try {

await NfcManager.requestTechnology(['Ndef']);

const tag = await NfcManager.getTag();

setTagData(JSON.stringify(tag, null, 2));

} catch (ex) {

console.warn(ex);

} finally {

NfcManager.cancelTechnologyRequest();

}

}

return (

<SafeAreaView>

<Text>NFC Tag Data:</Text>

<Text>{tagData}</Text>

<Button title="Read NFC" onPress={readNdef} />

</SafeAreaView>

);

}

export default App;

写入 NFC 标签数据的示例代码如下:


async function writeNdef(data) {

try {

await NfcManager.requestTechnology(['Ndef']);

const tag = await NfcManager.getTag();

const ndefMessage = NfcManager.ndef.encodeMessage([

NfcManager.ndef.textRecord(data)

]);

await NfcManager.ndef.write(tag, ndefMessage);

console.log('数据写入成功');

} catch (ex) {

console.warn(ex);

} finally {

NfcManager.cancelTechnologyRequest();

}

}

(二)应用场景

1. 移动支付

NFC 在移动支付领域的应用十分广泛,其中公交地铁支付和商场超市购物支付是最为常见的场景。在公交地铁支付方面,许多城市都支持使用手机的 NFC 功能乘坐公交和地铁。以北京为例,用户只需在手机的钱包应用中开通北京的交通卡功能,将手机靠近公交或地铁的刷卡设备,即可完成支付,无需再携带实体公交卡。这种支付方式不仅方便快捷,还能避免忘带公交卡的尴尬。在商场超市购物支付时,像 Apple Pay、华为 Pay、小米 Pay 等移动支付方式,都利用了 NFC 技术。用户在结账时,将手机靠近支持 NFC 的 POS 机,通过指纹识别或密码验证后,即可完成支付。例如,在一家连锁超市中,消费者使用华为手机的 Huawei Pay 进行支付,只需将手机靠近 POS 机,手机屏幕上会弹出支付界面,用户验证指纹后,支付瞬间完成,大大缩短了结账时间,提高了购物效率。

2. 门禁系统

使用 NFC 技术代替传统门禁卡,为门禁管理带来了极大的便利。在写字楼场景中,员工只需将手机靠近门禁读卡器,即可完成身份验证并开门,无需再携带实体门禁卡。一些高端写字楼还支持通过 NFC 技术实现远程开门功能,员工在到达写字楼前,就可以通过手机应用提前打开门禁,方便快捷。在小区门禁管理方面,业主可以将门禁卡信息写入手机的 NFC 芯片,实现用手机刷门禁。这样一来,不仅不用担心门禁卡丢失,而且在双手提满物品时,也能轻松开门。例如,某智能小区采用 NFC 门禁系统,业主在手机上完成门禁卡绑定后,无需再携带门禁卡,只需用手机靠近门禁设备,就能快速进入小区,提升了小区的安全性和居民的生活便利性。

3. 电子门票

在旅游景区、演唱会等场所,NFC 电子门票得到了广泛应用。以旅游景区为例,游客在网上购买门票后,门票信息会以 NFC 电子门票的形式发送到游客的手机上。游客到达景区后,只需将手机靠近检票设备,即可完成验票,快速进入景区。这种方式不仅减少了纸质门票的使用,有利于环保,还提高了验票效率,减少了游客排队等待的时间。在演唱会场景中,歌迷通过手机购买 NFC 电子门票,在入场时,工作人员通过 NFC 设备读取手机中的门票信息,验证真伪后即可放行。例如,某知名歌手的演唱会采用 NFC 电子门票,歌迷们无需再担心纸质门票丢失或损坏,凭借手机即可顺利入场,享受精彩的演出。

六、技术对比与选择

(一)技术性能对比

从传输距离来看,WiFi 的覆盖范围最为广泛,一般家庭使用的无线路由器,其信号覆盖半径可达数十米,在一些公共场所,通过合理布局和信号增强设备,覆盖范围可以更大;蓝牙的传输距离相对较短,经典蓝牙的传输距离一般在 10 米以内,不过蓝牙 5.0 及以上版本在理想条件下传输距离可达到 100 米,但实际应用中仍会受到环境等因素影响;NFC 的传输距离极短,有效距离通常在 10 厘米以内,这使得它只能在非常近的距离内进行数据交换 。

在传输速度方面,WiFi 具有明显优势,以最新的 WiFi 6 标准为例,最高传输速率可以达到 11Gbps,能够满足高清视频播放、大文件传输、在线游戏等对网络速度要求较高的应用场景;蓝牙的传输速度相对较慢,蓝牙 5.0 的最高传输速率为 2Mbps,虽然能够满足一些简单的数据传输需求,如音频传输、少量数据同步等,但在处理大数据量时会显得力不从心;NFC 的传输速度则更慢,其传输速率一般为 106kbit/s、212kbit/s、424kbit/s 和 848kbit/s,仅适用于传输少量数据,如支付信息、门禁卡信息等。

功耗也是一个重要的考量因素。蓝牙的功耗较低,特别是低功耗蓝牙(BLE)技术,能够在长时间内保持低电量运行,非常适合使用电池供电的小型设备,如智能手环、智能手表等;WiFi 的功耗相对较高,尤其是在传输大量数据时,设备的耗电量会明显增加,这也是为什么一些长时间使用 WiFi 的设备,如笔记本电脑,需要经常充电;NFC 的功耗也较低,由于其通信距离短、信号强度低,设备在进行 NFC 通信时消耗的电量较少,不会对设备的电池续航造成较大影响。

安全性方面,NFC 采用了多种安全机制,如数据加密、认证等,由于其通信距离极短,只有在设备非常靠近时才能进行数据交换,大大减少了被黑客攻击的风险,安全性较高;蓝牙也具备一定的安全防护措施,如配对认证、数据加密等,但由于其传输距离相对较长,在一些不安全的环境中,存在被破解的风险;WiFi 的安全性则相对复杂,虽然 WiFi 网络可以设置密码进行加密,但如果密码强度不够或者采用了不安全的加密协议,就容易被黑客破解,导致网络被入侵和数据泄露 。

(二)适用场景分析

根据不同场景需求,合理选择合适的近场通信技术至关重要。在智能家居场景中,蓝牙和 WiFi 都有广泛应用。蓝牙适用于一些小型的智能设备,如智能灯泡、智能插座、智能门锁等,这些设备通常数据传输量较小,且对功耗要求较低,蓝牙的低功耗和短距离通信特性能够满足其需求;而 WiFi 则更适合用于智能电视、智能音箱、智能摄像头等需要大量数据传输和实时在线的设备,通过 WiFi 连接,这些设备可以实现高清视频播放、语音交互等功能。

在移动支付场景中,NFC 是首选技术。由于 NFC 的安全性高、操作便捷,只需将手机靠近 POS 机即可完成支付,无需繁琐的操作,大大提高了支付的效率和安全性,像 Apple Pay、华为 Pay 等移动支付方式都利用了 NFC 技术;而蓝牙和 WiFi 在移动支付场景中应用较少,蓝牙的安全性相对较低,且连接过程相对复杂,不适合用于支付场景;WiFi 虽然传输速度快,但在支付场景中,其安全性和便捷性不如 NFC。

在文件传输场景中,如果需要传输的文件较小,如图片、文档等,蓝牙和 NFC 都可以使用。蓝牙的传输距离相对较远,且可以在多个设备之间进行连接,适合在一定范围内的设备间进行文件传输;NFC 则更适合在两个设备非常靠近时,快速进行少量数据的传输,如交换名片、分享照片等。如果需要传输大文件,如高清视频、大型软件安装包等,WiFi 则是最佳选择,其高速的传输速度能够大大缩短文件传输的时间,提高工作效率 。

在室内定位场景中,蓝牙信标技术被广泛应用。通过在室内布置多个蓝牙信标,利用蓝牙信号的强度和特定算法,可以实现对移动设备的精确定位,适用于大型商场、医院、停车场等室内场所,帮助用户快速找到目标位置;WiFi 也可以用于室内定位,但由于其信号覆盖范围较大,定位精度相对较低,一般用于对定位精度要求不高的场景;NFC 由于传输距离极短,不适合用于室内定位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值