使用.Net nanoFramework为ESP32进行蓝牙配网

通过前面的介绍,我们已经学会了如何使用 .NET nanoFramework 为 ESP32 设备连接 Wi-Fi 网络。然而,在实际的物联网环境中,我们往往需要使用更便捷的式来满足配网需求。这篇文章将带你了解一些常见的配网方案,并以 ESP32 为例,介绍如何使用 .NET nanoFramework 实现为 ESP32 蓝牙配网。

1. 引言

经过前面的介绍,我们已经学会了如何 为 ESP32 设备连接 Wi-Fi 网络,然后这种代码中硬编码的方式,虽然简单,但在实际的物联网环境中,我们往往需要使用更便捷的方式来满足配网需求。而且,也不适合于产品化的物联网设备。今天,我们就来看看如何使用 .NET nanoFramework 实现为 ESP32 蓝牙配网。

2. 常见配网方案

为了能让我们的物联网设备连接到网络,配网的方式也有很多种,每种方式都有其特定的应用场景和优缺点。在这里我们不再详细的描述其原理,只是带大家做一个简单的了解,如果你感兴趣,可以自行搜索。下面是一些常见的配网方式的总结:

  1. softAP:在这种模式下,待配网设备会创建一个热点,用户可以通过手机或其他设备连接到这个热点,然后通过特定的接口设置网络信息。这种方式的优点是兼容性较好,不需要额外的硬件支持,但缺点是但手机端需要做两次 Wi-Fi 连接设置的切换,步骤较复杂,用户体验较差。

  2. Sniffer模式:Sniffer模式也被称为混杂模式,待配网设备在这种模式下可以接收所有的数据包,不进行过滤。例如,SmartConfig、AirKiss、simpleConfig 等这些协议就是使用这种方式,通过监听特定的数据包来获取网络信息。这种方式的优点是不需要用户进行复杂的操作,但一般为各厂商采用私有协议,兼容性和互操作性较差。

  3. 蓝牙配网:待配网设备在这种模式下会开启蓝牙接口,用户可以通过手机或其他设备的蓝牙连接到待配网设备,然后通过蓝牙传输网络信息。这种方式的优点是操作简单,用户体验好,但缺点是需要蓝牙硬件支持。

  4. 二维码配网:如果待配网设备有摄像头,可以通过扫描二维码来获取网络信息。这种方式的优点是操作简单,用户体验好,但缺点也是非常明显,需要摄像头硬件支持,而且摄像头聚焦,用户二维码放置的远近都需要提示好用户,影响用户体验。

  5. 声波配网:如果待配网设备有麦克风,可以通过声音编码来获取网络信息。这种方式的优点是不需要额外的硬件支持,但缺点是可能会受到环境噪音的干扰,影响配网的成功率。

3. 蓝牙配网的实现

虽然方案有很多,但是针对这一款 ESP32-S3-Zero 开发板,其拥有蓝牙模块,刷写 ESP32_S3_BLE 固件后,我们可以使用蓝牙配网的方式来为其配网。

3.1. 蓝牙配网协议 Improv

使用蓝牙配网我们处理可以自己定义进行私有的实现外,也可以使用开源的协议快速完成开发。除了不用自己造轮子外,配网的工具也不需要自己设计了。Improv 是一个免费且开放的标准,它允许设备通过蓝牙进行安全的 Wi-Fi 配网,这个过程可以通过以下步骤完成:

  1. 打开设备
  2. 客户端使用Improv协议将Wi-Fi凭据发送到待配网设备
  3. 设备连接到Wi-Fi网络并返回一个URL。
  4. 客户端使用该URL连接到设备并继续设置设备。

Improv协议可以通过蓝牙低功耗(Bluetooth Low Energy)或通过串行端口使用。这两种协议都可以从浏览器中使用。不过,串口就需要连线了,我们这里使用的是蓝牙低功耗的方式。

关于 Improv 协议的详细信息,可以参考其官方文档。

3.2 依赖准备

首先我们需要安装以下三个包:

  • nanoFramework.System.Device.Wifi:用于连接 Wi-Fi 网络
  • nanoFramework.Device.Bluetooth:用于实现蓝牙配网
  • nanoFramework.System.Net.Http:用于演示联网后的网络服务

对于 Improv 协议的实现,没有依赖包,但是在官方的 Samples 仓库中有一个ImprovWifi示例,我们可以参考其实现,直接使用其 Improv.cs,然后 using ImprovWifi; 即可。

3.3 编码实现

ImprovWifi 已经实现了 Improv 协议,我们只需要在 Program.cs 中实现一些简单的代码。

这里我们在完成配网后,启动一个简易的网络服务,用于演示配网成功后的网络服务。这里我们使用 HttpListener 来实现一个简易的网络服务,当然你也可以使用其他的方式,比如 WebServer 等等。

static Improv _imp;public static void Main()
{Console.WriteLine("蓝牙配网 Improv 协议示例");_imp = new Improv();// 配网完成后的回调_imp.OnProvisioningComplete += Imp_OnProvisioningComplete;// 开始配网服务,设备名称这里可以自定义,中文也是支持的,在搜索设备时会显示该名称_imp.Start("ESP32 桑榆肖物");// 纯演示,这里直接授权_imp.Authorise(true);Console.WriteLine("等待设备配网...");while (_imp.CurrentState != Improv.ImprovState.provisioned){Thread.Sleep(500);}Console.WriteLine("设备配网完成,IP地址:" + _imp.GetCurrentIPAddress());// 停止配网服务_imp.Stop();_imp = null;Console.WriteLine("启动一个简易的网络服务,用于演示配网成功后的网络服务");SimpleWebListener();Thread.Sleep(Timeout.Infinite);
}private static void Imp_OnProvisioningComplete(object sender, EventArgs e)
{SetProvisioningURL();
}private static void SetProvisioningURL()
{_imp.RedirectUrl = "http://" + _imp.GetCurrentIPAddress() + "/start.htm";
}private static void SimpleWebListener()
{string responseString ="<html><head><meta charset='utf-8'>" +"<title>Hello from ESP32</title></head>" +"<body><h2>Hello from ESP32</h2>" +"<p>It works!</p>" +"<p>这里可以根据需求继续进行更多的设备配置信息</p>" +"</body></html>";byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);HttpListener listener = new("http", 80);listener.Start();while (true){try{HttpListenerContext context = listener.GetContext();Console.WriteLine("Request received");HttpListenerResponse response = context.Response;response.ContentLength64 = buffer.Length;response.OutputStream.Write(buffer, 0, buffer.Length);context.Response.Close();Console.WriteLine("Response sent");context.Close();}catch (Exception ex){Console.WriteLine("Error: " + ex.Message + "\nSack = " + ex.StackTrace);}}
}

注意:以上代码只是功能的演示,在实际项目中,需要根据自己的需求进行修改,比如我们需要在验证连接后下次也自动完成连接,再者为了安全性,我们还需要进行验证等等。后面我会有一个实际的开源项目演示,介绍如何使用近期介绍的相关功能,敬请关注。

4. 配网测试

编译并刷写完成后,通过调试的数据输出,我们可以看设备成功进入等待配网状态。这时我们通过网页打开 Improv 的 web 配网客户端,也就是之前的 Improv 官方介绍站点。当然,站点和协议都是开源的,你可以自己搭建一个。

这里我们直接使用官方的进行测试使用即可,不过,需要注意的是,因为使用了蓝牙配网,所以这里需要你的电脑也支持蓝牙,否则无法搜索到设备。如果你的电脑没有蓝牙,也可以使用手机的 Chrome 或 Egde 浏览器打开该网页进行配网。

请添加图片描述

这里可以看到,设备列表中已经搜索到了我们的设备,点击配对即可。配对成功后,我们可以会弹出下面的对话框,这里我们可以设置 Wi-Fi 的 SSID 和密码,然后点击 Connect 按钮即可。

请添加图片描述

连接成功后,我们可以看到设备的状态已经变成了 Provisioned,这时我们就可以访问到设备启动的网络服务了。

请添加图片描述

5. 总结

通过这篇文章,我们学习了如何使用 .NET nanoFramework 为 ESP32 设备进行蓝牙配网。虽然这里我们使用的是 Improv 协议,但是其实现原理都是类似的,只是协议不同而已。在实际的项目中,我们可以根据自己的需求,选择合适的配网方式,或者自己实现一个配网协议,这里就不再赘述了。

对于 Improv 协议的配网客户端,我们也可以通过微信小程序来实现,或者通过集成SDK到自己的应用中方便的实现配网,有兴趣的同学可以自行了解实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java运算符简单介绍

文章目录 1. 算术运算符2. 赋值运算符3. 比较&#xff08;关系&#xff09;运算符4. 逻辑运算符5. 位运算符6. 条件运算符&#xff08;三元运算符&#xff09;7. 运算符优先级 1. 算术运算符 &#xff1a;加法 int a 5; int b 3; int sum a b; // 结果为8-&#xff1a;减…

docker——docker compose简介和案例(部署prometheus+granfana+node-exporter)

docker compose Docker Compose 是 Docker 官⽅编排&#xff08;Orchestration&#xff09;项⽬之⼀&#xff0c;负责快速的部署分布式应⽤。 它允许⽤户通过⼀个单独的 docker-compose.yml 模板⽂件 &#xff08;YAML 格式&#xff09;来定义⼀组相关联的应⽤容器为⼀个项⽬…

基于java,springboot的论旅游管理系统设计与实现

环境以及简介 基于java,springboot的论旅游管理系统设计与实现&#xff0c;Java项目&#xff0c;SpringBoot项目&#xff0c;含开发文档&#xff0c;源码&#xff0c;数据库以及ppt 源码下载 环境配置&#xff1a; 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服…

vue生成动态表单

Vue动态表单可以根据不同的数据动态地生成表单组件&#xff0c;方便快速地实现表单的创建和处理。下面给出一个示例&#xff0c;演示如何使用Vue动态表单生成一个简单的注册表单。 <template><form submit.prevent"submitForm"><div v-for"fiel…

PDF文档转换工具箱流量主小程序开发

PDF转换小助手&#xff0c;不仅是文件格式转换的利器&#xff0c;更是一位得力的助手。它精通PDF与各类文档间的自由转换&#xff0c;如Word、Excel、PowerPoint等。 转换选项丰富多样&#xff0c;满足您对文件保护、页面设置、图像品质等细致要求。处理大量文件&#xff1f;…

翻译!翻译!AI是什么?

2023年开年以来&#xff0c;AI突然开窍&#xff0c;终于不再是以前那个上下文不能连贯的呆子了&#xff0c;变得非常智能&#xff0c;非常好用。随后AI开始井喷式爆发&#xff0c;各大厂商开始发力&#xff0c;开始发布自家的AI产品。AI也逐渐成为我们日常生活的常态。我们也能…

Unity SVN更新提交小工具

Unity SVN更新提交小工具 前言使用说明必要前提源码参数说明 感谢 前言 Unity开发时每次都要到文件夹中操作SVN&#xff0c;做了一个小工具能够在Editor中直接操作。 使用说明 必要前提 前提是要安装好SVN&#xff0c;在文件夹右键能够看到安装的SVN 源码 using System…

用友U8+CRM 逻辑漏洞登录后台漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 reservationcomplete.php文件存在逻辑漏洞&#xff0c;未授权的攻击者通过…

渗透第四天 (抽空再看一天 )

网站不同的加密 ok  常用的对称加密算法有&#xff1a;DES、3DES、RC2、RC4、AES 常用的非对称加密算法有&#xff1a;RSA、DSA、ECC 使用单向散列函数的加密算法&#xff08;摘要算法&#xff09;&#xff1a;MD5、SHA 密码存储加密 md5 32位或者16位 0-9 a-f…

word表格跑到下一页,老是空很多在上一页,且与标题分离?

1、方法一 表格属性里边&#xff0c;行设置中&#xff0c;有一个“跨页断行”的选项&#xff0c;勾上应该可以解决你这个问题&#xff0c;你可以先试试&#xff1b; 2、方法二 鼠标点击表格任意位置&#xff0c;将光标定位到表格中&#xff0c;然后单击鼠标右键&#xff0c;…

第11章 GUI Page462~476 步骤二十三,二十四,二十五 Undo/Redo ②“添加操作”支持“Undo/Redo”

工程二 1.为AddAction类添加Undo() Redo() GetName()成员函数 2.实现AddAction类的Undo() Redo()函数 3.运行效果&#xff0c;但是日志窗口没有记录 原因&#xff1a;AddAction(EditAction* newAction)函数没有实现&#xff0c;另外参数是EditAction类型 所以我们还需要在基…

2023版本QT学习记录 -11- 多线程的使用(QT的方式)

———————多线程的使用(QT方式)——————— &#x1f384;效果演示 两个线程都输出一些调试信息 &#x1f384;创建多线程的流程 &#x1f384;头文件 #include "qthread.h"&#x1f384;利用多态重写任务函数 class rlthread1 : public QThread {Q_OBJE…

imgaug库指南(六):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

web期末作业动态时钟UI界面毛玻璃版

效果图 html代码奉上 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

Android Canvas图层saveLayer剪切clipRect原图对应Rect区域,Kotlin(1)

Android Canvas图层saveLayer剪切clipRect原图对应Rect区域&#xff0c;Kotlin&#xff08;1&#xff09; 上面一个ImageView&#xff0c;下面一个ImageView&#xff0c;两个ImageView同等大小。当手指在上面的ImageView滑动时候&#xff0c;在下面ImageView里面显示对应区域“…

真核微生物基因组质量评估工具EukCC的安装和详细使用方法

介绍&#xff1a; GitHub - EBI-Metagenomics/EukCC: Tool to estimate genome quality of microbial eukaryotes 安装&#xff1a; docker&#xff1a; docker pull microbiomeinformatics/eukcc 推荐conda 环境&#xff1a; conda install -c conda-forge -c bioconda …

OpenHarmony应用构建工具Hvigor的构建流程

前言 OpenHarmony 应用和服务使用 Hvigor 作为工程的构建工具。本篇文章将介绍 Hvigor 的构建流程&#xff0c;通过修改脚本配置使 Hvigor 执行自定义任务。 Hvigor 的构建流程 加载命令行参数和环境变量&#xff1b;初始化项目结构&#xff0c;创建 Project 和 Module 实例…

Guava Cache 异步刷新技巧

前言 Guava Cache是一款非常优秀的本地缓存框架&#xff0c;提供简洁易用的 API 供开发者使用。 这篇文章&#xff0c;我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。 1 基本用法 首先&#xff0c;在 Java 应用中添加 maven 依赖&#xff1a; <dependency&g…

我发现了一个还行的生成图片的网站(新人登录可领30金币)

这个网站是一个生成图片的在线工具&#xff0c;它提供了多种功能和选项&#xff0c;让用户可以轻松地创建各种风格和类型的图片。它的界面简洁易用&#xff0c;新用户登录后还可以获得30个金币的奖励。这些金币可以用来解锁更多的高级功能和特效。用户可以选择不同的背景、字体…

彻底认识Unity ui设计中Space - Overlay、Screen Space - Camera和World Space三种模式

文章目录 简述Screen Space - Overlay优点缺点 Screen Space - Camera优点缺点 World Space优点缺点 简述 用Unity中开发了很久&#xff0c;但是对unity UI管理中Canvas组件的Render Mode有三种主要类型&#xff1a;Screen Space - Overlay、Screen Space - Camera和World Spa…