文章包含内容

  1. 什么是配网?
  2. 常见的配网方案;
  3. 常见WiFi快连技术厂商;
  4. 实际开发中问题;
  5. GitHub 项目地址;
  6. CSDN 项目地址;

纵然WIFI设备配网目前虽然已经非常成熟,市面上也有了很多的配网框架,但是在实际的开发过程中还是遇到一些小坎坷,在这里做个记录,以见证自己的成长。

一、什么是配网

当设备要与用户进行交互时,首先得让设备连接上网络(连上路由器),那么这个设备联网的过程我们称之为配网。当然这里我们主要介绍WIFI设备的配网过程,如蓝牙、Zigbee、NB-Iot等协议的智能设备,在需要实现远程控制时一般都是与WIFI模块配合使用(原因不多解释)。


二、常见的配网方案

2.1 快速配对过程

1.发送广播 ssid & password
2.设备解析广播数据获取到 ssid & password 后连上路由器并返回确认包
3.返回确认包
4.设备建立 TCP或UDP server
5.发送配对请求
6.返回设备信息
7.发送服务器和WIFI信息并连接
6.接收到信息返回状态码
APP
路由器
wifi智能设备

具体流程:

  1. 设备进入配置模式:
  2. touch模式 设备等待APP广播 SSID & password
  3. 设备获取到 SSID & password 后连上路由器,返回 touch UDP 确认包
  4. 设备建立 TCP或UDP server(http server)
  5. 手机发送:(请求配对)
  6. 设备回应:(设备信息)
  7. 手机回应:(服务器信息和WIFI信息等)
  8. 设备回应是否接收成功

到这里就可以对设备进行控制了,做个j简单的思路介绍,具体的app和设备之间的通讯协议规范,就由厂商或您自己来规定了。

2.2 AP配对过程

1.app连接上设备AP热点
2.手机发送配对请求
3.返回设备信息
4.发送服务器信息和WIFI信息让设备连接上服务器和路由
5.返回状态码
6.设备连接上路由器
3.手机连接路由器
APP
wifi智能设备
路由器

具体流程:

  1. 设备进入配置模式:AP 热点,TCP 或UDP server(http server)
  2. 手机连到 AP热点
  3. 手机发送:(请求配对)
  4. 设备回应:(设备信息)
  5. 手机回应:(服务器信息和WIFI信息等)
  6. 设备回应是否接收成功

想要了解详细配对过程,建议了解WiFi的四种工作模式,包含Staion、SoftAP、Sniffer、Promisc,在配对过程中WIFI模式的转换,快连模式中udp数据的加密,手机和设备建立通讯后之间的详细交互等。

2.3 重点参见

下面是大神们对快连模式的技术讲解,原封不动的贴上了:
参见:IOT小能手

实现原理是这样:手机通过UDP广播,将AP的相关信息组帧发出。而WiFi模块一直处于UDP监听状态。获取到AP信息之后,WiFi模块便可以接入AP了。

这里有一个难点是,如果WLAN都是不加密的话,那UDP直接把相关信息发出来就好,但可惜路由器AP的加密方式是不固定的,模块没法知道UDP数据是何种加密方式,因此没办法解析出DATA信息。

如下是802.2的封装格式。

所以,DATA不行,聪明的人类打算从其他字段下手,大部分字段手机端无法获得权限,最适合的只剩下长度字段。


这里举个例子,比如要发送“1,2,3”,即[0x31, 0x32, 0x33]。那么应该发送如下数据:


三、常见WiFi快连技术厂商

怎么说、、、?嗯.网上大家都是这么说的,快连技术其实原理上都是类似,但各家都分别给这项技术取了名字,不同的厂商还专门申请了不同的专利而已。在他们这些技术大佬眼中,TI才是最牛逼的厂商,他们是最早将这项技术进行攻克,并将其称之为SmartConfig,这也是目前最多的叫法。

厂商 技术名称
TI SmartConfig
MTK SmartConnection
Marwell EasyConnect
Reltek SmipleConfig
乐鑫 Smartconfig
微信 Airkiss
阿里云 C-SDK
涂鸦 tuya-SDK
酷宅 coolkit-SDK

四、实际开发中问题

4.1 初识配网Demo

本demo仅介绍快连模式中如何广播wifi帐号密码以及接收设备返回的确认包(如设备连接路由的ip),至于手机和设备之间的通讯(常用TCP/UDP)获取设备id等信息就因不同的厂商而有所不同了,Demo架构如下图:


不要问我什么年代了还贴eclipse项目,我只能说这种感觉就像谈女朋友一样,也许你明知道她有很多缺点,但每当提出分手却都在挽留。Android Demo传送门内涵半颗心脏的(Esp8266驱动ws2812源码限于gpio0),需要什么工具自己进去选吧,这次我随大流。

4.2 Android6.0以上不能连上指定Wifi问题

参见:Good包籽

大概的意识是Andorid6.0以上版本,由于权限问题,不能连上指定Wifi,所以大神们做了一点兼容的小改变,总结大致如下:

 <!-- wifi控制和状态权限 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!-- 网络状态改变的权限 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><!-- 6.0以上打开蓝牙和wifi最好加上定位权限,获取wifi列表要用 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 获取网络权限 --><uses-permission android:name="android.permission.INTERNET"/
/*** 连接指定wifi* 6.0以上版本,直接查找时候有连接过,连接过的拿出wifiConfiguration用* 不要去创建新的wifiConfiguration,否者失败*/
public void addNetWork(String SSID, String password, int Type)
{int netId = -1;/*先执行删除wifi操作,1.如果删除的成功说明这个wifi配置是由本APP配置出来的;2.这样可以避免密码错误之后,同名字的wifi配置存在,无法连接;3.wifi直接连接成功过,不删除也能用, netId = getExitsWifiConfig(SSID).networkId;*/if (removeWifi(SSID)){//移除成功,就新建一个netId = mWifiManager.addNetwork(createWifiInfo(SSID, password, Type));} else{//删除不成功,要么这个wifi配置以前就存在过,要么是还没连接过的if (getExitsWifiConfig(SSID) != null){//这个wifi是连接过的,如果这个wifi在连接之后改了密码,那就只能手动去删除了netId = getExitsWifiConfig(SSID).networkId;} else{//没连接过的,新建一个wifi配置netId = mWifiManager.addNetwork(createWifiInfo(SSID, password, Type));}}//这个方法的第一个参数是需要连接wifi网络的networkId,第二个参数是指连接当前wifi网络是否需要断开其他网络//无论是否连接上,都返回true。。。。mWifiManager.enableNetwork(netId, true);
}/*** 获取配置过的wifiConfiguration*/
public WifiConfiguration getExitsWifiConfig(String SSID)
{wifiConfigurationList = mWifiManager.getConfiguredNetworks();for (WifiConfiguration wifiConfiguration : wifiConfigurationList){if (wifiConfiguration.SSID.equals("\"" + SSID + "\"")){return wifiConfiguration;}}return null;
}/*** 移除wifi,因为权限,无法移除的时候,需要手动去翻wifi列表删除* 注意:!!!只能移除自己应用创建的wifi。* 删除掉app,再安装的,都不算自己应用,具体看removeNetwork源码** @param netId wifi的id*/
public boolean removeWifi(int netId)
{return mWifiManager.removeNetwork(netId);
}/*** 移除wifi** @param SSID wifi名*/
public boolean removeWifi(String SSID)
{if (getExitsWifiConfig(SSID) != null){return removeWifi(getExitsWifiConfig(SSID).networkId);} else{return false;}
}

4.3 Android8.0以上系统无法获取ssid问题

当然我是后来者,无需重新造轮子,但是在整合大神们的代码时发现,在Android8.0后,无法获取wifi的ssid(wifi名称),我的解决如下:

public class EspWifiAdminSimple {private final Context mContext;public EspWifiAdminSimple(Context context) {mContext = context;}/*** 获取ssid* * @return*/public String getWifiConnectedSsid() {WifiInfo mWifiInfo = getConnectionInfo();String ssid = null;if (mWifiInfo != null && isWifiConnected()) {int len = mWifiInfo.getSSID().length();if (mWifiInfo.getSSID().startsWith("\"")&& mWifiInfo.getSSID().endsWith("\"")) {ssid = mWifiInfo.getSSID().substring(1, len - 1);} else {ssid = mWifiInfo.getSSID();}// 换个方法再来获取if (ssid.equals("<unknown ssid>")) {NetworkInfo networkInfo = getWifiNetworkInfo();ssid = networkInfo.getExtraInfo();if (ssid.startsWith("\"") && ssid.endsWith("\"")) {ssid = ssid.substring(1, len - 1);}}}return ssid;}/*** 获取Bssid* * @return*/public String getWifiConnectedBssid() {WifiInfo mWifiInfo = getConnectionInfo();String bssid = null;if (mWifiInfo != null && isWifiConnected()) {bssid = mWifiInfo.getBSSID();}return bssid;}/*** 获取wifi设置中“连接”的wifi信息*/private WifiInfo getConnectionInfo() {WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);WifiInfo wifiInfo = mWifiManager.getConnectionInfo();return wifiInfo;}private boolean isWifiConnected() {NetworkInfo mWiFiNetworkInfo = getWifiNetworkInfo();boolean isWifiConnected = false;if (mWiFiNetworkInfo != null) {isWifiConnected = mWiFiNetworkInfo.isConnected();}return isWifiConnected;}/*** android 8.0后* * @return*/private NetworkInfo getWifiNetworkInfo() {ConnectivityManager mConnectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getActiveNetworkInfo();return mWiFiNetworkInfo;}
}

GitHub 项目地址;

主页:https://github.com/Life1412378121
Demo:https://github.com/Life1412378121/EsptouchDemo

CSDN 项目地址;

主页:https://download.csdn.net/my/downloads
Demo:https://download.csdn.net/download/qq_35350654/11074560
Esp8266驱动ws2812源码:https://download.csdn.net/download/qq_35350654/11074543

【Android工程师与智能家居产品的第一次接触②】给设备配网 Esp8266 wifi模块的快速配网和AP配网简介(付Android demo)相关推荐

  1. 【Android开发—智能家居系列】(三):手机连接WIFI模块

    [Android开发-智能家居系列](三):手机连接WIFI模块 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有两个方 ...

  2. 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+

    ## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+ ...

  3. ESP8266 WIFI模块学习之路(7)——自写Android手机APP接受单片机数据

    上一篇是写关于自写Android手机APP给单片机下发数据的,这次我将写一下APP如何接受单片机数据. 其实使用调试助手,或者别人开的的APP同样能够实现接受单片机数据,但想学习的,我还是建议能够自己 ...

  4. 自动化工程师与数字化项目的第一次接触

    周一我早早来到办公室准备处理同事升级过来的现场难题,刚打开电脑,我的电话响了,是王工打来的,我想王工这么早打电话一定是有很重要的事. 接通电话,王工没有像往常那样寒暄几句,而是直接就问我:" ...

  5. android 8 esp8266,ESP8266 WIFI模块学习之路(8)——自写Android手机APP控制直流电机正反转...

    本次向通过Android远程控制直流电机正反转,在这之前可以看一下我写的"STC单片机简单控制直流电机正反转"有助刚学的同学理解. 可以看一下我的硬件连接电路,如图: 单片机硬件程 ...

  6. android 伪装 wifi,移动数据伪装wifi软件xposed手机版-手机移动数据伪装wifi模块xposedv1.4最新版_新绿资源网...

    手机移动数据伪装wifi模块xposed是一款wifi伪装移动数据模块,配合xp框架.应用变量实现移动数据伪装.应用参数修改.模拟器过检测开挂辅助等功能,完全免费无毒,下载安装吧! 应用介绍: 手机移 ...

  7. SSM+智能家居产品销售管理 毕业设计-附源码161618

    目  录 摘要 1 绪论 1.1 选题意义 1.2研究现状与发展趋势 1.3论文结构与章节安排 2智能家居产品销售管理系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 2.2. ...

  8. SSM智能家居产品销售管理毕业设计源码161618

    目  录 摘要 1 绪论 1.1 选题意义 1.2研究现状与发展趋势 1.3论文结构与章节安排 2智能家居产品销售管理系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 2.2. ...

  9. Android工程师成长路线

    Android开发给人的感觉是门槛很低,因此有不少人会说Android很简单,实际上Android开发说简单也不简单.简单是因为它入门快.上手简单:不简单是因为Android的知识点比较琐碎,如何从琐 ...

最新文章

  1. 60 张图详解 98 个常见网络概念
  2. asp.net oracle优化,[转]ASP.NET性能优化
  3. linux 双网卡浮动ip,Linux 双网卡绑定一个IP原理及实现
  4. java 中while编译之后_从APK反编译的Java-while循环什么也不做
  5. Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库
  6. elcentro matlab,EL-Centro地震波积分计算与基线调整.docx
  7. java filter加时间戳_java filter加时间戳
  8. python直方图均衡_Python实现图像直方图均衡化算法
  9. sqoop导入数据(保持一致性)--staging-table
  10. Jmeter安装及配置
  11. SpringBoot整合Redis
  12. 数据:FIT2CLOUD飞致云连续进入云管理软件市场权威研究报告
  13. 宝德自强AI智能小站 PI300T
  14. java生成docx文件、pdf文件、docx转pdf、docx转图片 pdf转图片工具
  15. Pisces集成logback
  16. idea怎么替换git地址(简单明了的教程)
  17. STM8S编译错误unable to allocate space for sections/blocks with a total
  18. 笔记本计算机声音小,笔记本麦克风声音小的简单解决办法【图文教程】
  19. 计算机操作系统第四章虚拟存储器
  20. OPENCV(四)对图像进行水平投影和竖直投影

热门文章

  1. DETR-二分图匹配 匈牙利算法
  2. 找不到工作的可以看看
  3. h5动画 php,用H5的canvas做恐怖动画
  4. 如何用AI的混合工具给路径上色
  5. 分享一下我的人生经历
  6. python autocad库_在Python中加载AutoCad DWG文件
  7. 进程/协程/简述进程,线程的优缺点?
  8. 新写的php到底是支持7.0还是7.1,PHP7.1.1和7.0.15正式发布,新功能抢眼
  9. idea 光标 快捷键_idea 设置光标回到上一次位置的快捷键
  10. 解决OpenCV中SIFT,SURF不能使用,修改成ORB检测特征