智能家居设备连接路由的技术AirKiss

智能配网方案 Airkiss 技术原理介绍及应用 写在前面 站在巨人的肩膀上,可以看得更远 一、什么是Air Kiss 可以说AirKiss 是微信硬件平台提供的一种WIFI硬件设备快速配置连接网络的技术,是一种创新性的信息传递技术。通过该技术可以便捷的向一台具有WIFI功能的设备传递配网信息,比如wifi的ssid,密码。 在嵌入式设备或没有交互功能的智能设备,需要连接网络时,使用手机将设备需要配网的ap信息发送到空中,待配网设备捕获所发送的信息,通过解析获取需要的ssid和pwd. 示意图如下所示 二、应用场景 随着移动互联网与物联网. 阅读详情

AirKiss原理分析 
一、 AirKiss概述 
AirKiss技术是一种创新性的信息传递技术。通过该技术可以便捷的向一台 与外界没有建立任何一种实质性连接(包括有线、无线、蓝牙、NFC等)的设备传递信息(可以是环境中Wifi的ssid、密码等信息)。 
AirKiss 技术示意图如下图所示,智能插座与外界没有建立任何一种实质性连接, 可以称之为信息孤岛。通过 Air Kiss 技术,微信客户端 可以将环境中的 Wifi 的ssid 与密码便捷的隔空传递给智能插座,从而使得智能插座能够快速的接入 Wifi。 


二、传统配置上网过程 
例如我们买了一个路由器,路由器是没有按键和屏显示的。而我们都知道,路由器要配置好运营商的账号和密码才能接入互联网的。一般的做法都是路由器作为热点AP,其提供一个WebServer来设置路由的各项参数,默认IP是192.168.1.1(或者其他IP,路由器说明书上会说明);我们通过电脑有线接入路由器,通过DHCP自动分配到一个192.168.1段的地址。然后通过浏览器来访问http://192.168.1.1,即可以进入路由器设置界面进行设置,包括运营商的账号和密码、本机的SSID和密码。然后我们的手机就可以开启wifi扫描到SSID,输入密码即可以访问互联网了。 
再比如,我们家里已经有了一个可以上网的路由器(SSIDx和pwdx)。我们购买了一个无线摄像头装在家里。它自然也要连到家里的路由,才能访问这个摄像头的厂商,这样我们才可以用手机的APP接收到厂商服务器传过来的数据进行显示。摄像头也没有显示屏和按键(reset键不算啦)。传统的配置方法是: 
1)摄像头恢复出厂设置后默认进入AP(热点)+Station(工作站)状态。AP热点的SSID和密码由摄像头的说明书说明,是厂商默认的。手机通过wifi连接到该AP,然后通过浏览器访问http://192.168.1.1(也是厂商默认的),在该界面设置家里的路由器的SSID和密码,便于其作为Station连入家里的路由器。 
2)当摄像头连接路由器成功后,其即单独以Station的模式运行(不用再做AP可以省功耗),其会立即访问厂商的服务器(其内部程序代码会hardcode厂商服务的域名或者IP),告知其已经上线,并且要在一段周期内发送Beacon心跳包维持长连接。 
3)手机断开摄像头的AP热点,连接家里的路由器。打开摄像头的APP,即可以通过厂商服务器查看家里的摄像头的效果。 
所以传统的配置上网方法是wifi设备必须以AP的模式运行,配置好以后再转回Station模式运行。是不是比较费事? 
三 、 Airkiss配网基本流程 
1. wifi智能设备以station混杂模式运行 
2. 手机微信客户端通过Airkiss发送家里的路由器ssid和密码 
3. wifi设备通过抓包获取到ssid和密码,然后连接到家里的路由器 
四、智能配置的基本原理 
1.混杂模式 
wifi设备刚开始同样是以Station的模式运行,但是还有一个混杂模式。是什么意思?它是指正常的wifi设备都有一个MAC地址,其硬件电路会自动过滤目标MAC地址跟其MAC不同的数据包。开启混杂模式就是我们平常时说的抓包,就是空中符合802.11格式的数据包都接收进来,不管MAC是否一样。 
很明显,手机智能配置APP并不知道该wifi设备的MAC地址,所以手机wifi发送出的数据包,通过家里的路由器转发出去时,wifi设备必须要在混杂模式下才能接收到这些数据包。 
2. 信道切换 
802.11有多个信道,某一个时候wifi设备和路由器都处于某一个信道。路由器一般都是默认在第六信道,所以要想家里的网信号好一点,可以尝试将路由器的信道改到一个其他道,这样就不会和邻居家的wifi信道重叠了。wifi信号混在同一个频道就会互相干扰 
同理,我们也不能假定wifi设备是处于哪个信道,但是我们可以在app中确定手机wifi的发送信道,这样要求wifi设备在一定的时刻切换信道,以便与接收到数据包。当wifi设备检测到有效的数据包,药锁定在该信道进行后续的通信 
3. 利用数据帧的长度来承载有效信息 
我们先来看一看802.2 SNAP(802.11的物理层协议)的数据帧格式


DA字段表示目标mac地址,SA字段表示源mac地址,Length字段表示后面数据的长度,LLC字段表示LLC头,SNAP字段包括3bytes的厂商代码和2bytes的协议类型标识,DATA字段为负载,对于加密信道来说是密文的,FCS字段表示帧检验序列。 
从无线信号监听方的角度来说,不管无线信道有没有加密DA、SA、Length、LLC、SNAP、FCS字段总是暴露的,因此信号监听方便有了从这6个字段获取信息的可能。但从发送方的角度来说,由于操作系统的限制(比如ISO或者Android),DA、SA、LLC、SNAP、FCS五个字段的控制需要很高的控制权限,发送方一般是很难拿到的。因此只剩下Length这一字段,发送方可以通过改变其所需要发送数据包的长度进行很方便的控制。所以,只要制定出一套利用长度编码的通信协议,就可利用802.2 SNAP 数据包中的Length字段进行信息传递 
在实际应用中,我们采用UDP广播包作为信息的载体。信息发送方向空间中发送一系列的UDP广播包,其中每一包的长度(即Length字段)都按照AirKiss通信协议进行编码,信息接收方利用混杂模式监听空间中的无线信号,并从数据链路层截取802.2 SNAP格式数据包,便可得到已编码的Length字段,随后接收方便可根据Air Kiss通信协议解析出需要的信息。

五、Airkiss通信协议 
5.1 物理层协议 
在信号载体方面,采用 wifi 无线信号进行信息传递,1-14 全信道支持。 在信号编码方面,802.2 SNAP 数据包中的 Length 字段为数据发送方唯一可 AP 转发 UDP 广 播包 发 送 长 度 经 过 编码的 UDP 广 播包 监听无线广播包,从数据链 路层截取数据包,得到已编 码的 Length 字段 ,再 根据 Air Kiss 通信协议解析出需要 的信息 控字段,因此 Air Kiss 通信协议利用发送数据包的长度进行编码。由于受到 MTU 的限制,Length 字段最大可编码位数为 10bit。但实际测试过程中发现, UDP 包长度与丢包率、乱序率成正比。因此本协议中,我们把 Length 字段编码位 数限制在 9bit,即 UDP 广播包的发送长度不大于 512 字节 
我们身处的无线网络环境有可能及其复杂,很有可能在同一个空间中存在 多个 AP,而这些 AP 又分布在相同或者不同的信道上,这样接收者一开始是 不知道发送方在 1-14 哪个信道上发送信息,而且同一个信道上也可能会有很 多设备在发送 UDP 广播包。在这种情况下,接收方监听到的数据包是海量的。 必须从海量的数据信息中定位出发送方所在的信道和发送方的 mac 地址。另外, 由于在 UDP 广播包发送过程中,一个 UDP 层的数据包,要经过 IP 层、数据链 路层的封装,并且通过加密(加密方式包括 WPA2、WPA、WEP 三种)后才会被发 送出去,所以发送方发送 UDP 广播包的长度与接收方监听 SNAP 包中的 Length 字段值存在差异,这就需要进行转义。然而,由于底层加密方式的不确 定性,使得这个差异值也具有不确定性。 为解决这两个问题,在发送链路层数据(见下节)之前,需要先发送 400ms 的前导域(400ms = 8*50ms,即如果设备端以 50ms 的频率切换信道, 则可以覆盖 8 个信道,因为一般用户环境不用监听 14 个信道,所以覆盖 8 个 信道足已)。前导域由 4 个字节组成,其值固定为{1,2,3,4}。接收方在接收到这 些前导域数据包后,利用 SNAP 包中的 Length 字段与之相减,从而获取到这 个差异值。 举个例子,接受方通过监听,在链路层截获 802.2 SNAP 格式的前导数据 包,其 Length 字段的值分别为 53,54,55,56,那差异值就能确定为 53- 1=52。之后接收方接收到数据之后都用 SNAP 包的 Length 字段值减去 52,即能 得到实际的信息数据。 
5.2 链路层协议 
5.2.1链路层数据结构如下图所示: 

链路层数据结构可分为两类,control 字段与 data 字段,magic code、prefix code、sequence header field 属于 control 字段,data field 属于 data 字段。control 字 段与 data 字段以第 8bit 位(最高位)加以区别,该位为 1 表示 data field 字段, 为 0 表示 control 字段。在 control 字段中,magic code 字段与 prefix code 字段完 全相同,magic code 字段与 sequence header 字段通过第 7bit 位加以区分,该位 为 1 表示 sequence header 字段,为 0 表示 magic code 字段。 
以下分别对各个字段进行详细介绍。

5.2.2 magic code 字段的数据结构如下图所示:
1

Magic为4个数据帧,前两个帧的两个9bit记录将要发送的数据(PWD+Ramdon+SSID)的长度。每个bit的高 5 位为 magic code 字段,低 4 位为 information 字段。前两个 9bits 的 information 字段分别装载要发送数据长度 的高 4 位和低 4 位, 
后两个帧的两个9bit记录SSID的CRC校验值。两个 9bits 的 information 字段分别装载要发送 ssid 的 crc8 值的高 4 位和低 4 位。路由器的SSID是会被路由器广播出来的,例如我们手机wifi扫描到路由器的名称就是SSID。因此wifi设备也能得到路由器的SSID,其只要计算目前所能获取到的SSID的CRC值跟MAGIC的SSID CRC值一样,那之后的SSID数据就不用接收了,这样能够提高配置上网速度。Magic很重要,因此发送5遍。 
5.2.3 prefix code 字段的数据结构如下图所示: 


PrefixCode为4个数据帧,前两个帧的两个9bit记录PWD的数据长度, 
前两个帧的 information 字段分别装载PWD的长度的高4位和低4位。 
后两个帧的两个9bit记录PWD长度的CRC校验值。这两个帧的 information 字段分别装载发送密码长度 的 crc8 值的高 4 位和低 4 位。 
PrefixCode有两个作用,首先是表示数据序列的正式开始,其次告诉接收 端发送密码的长度,以便接收方在接收完数据后,对数据进行分割解密。 
Magic中发送的长度是所有数据的长度,包括密码PWD、随机数(wifi配置成功后要回复该随机数作为回复)和SSID。而这里是PWD的长度,用于对接收到的数据进行分段。 
5.2.3 Sequence序列包括一个sequence header序列索引和一个data field序列 
我们把待发送的数据以 4字节进行划分,每 4 个数据组成一个 sequence, 以 sequence 为单位进行数据的发送。每个sequence 都由sequence header字段和data 字段组成。最后一个sequence 如果不够 4 个数据,不用补全。如我家路由的PWD是8313huang,那其会分为3个序列,分别是“8313”、“huan”“g”进行发送。Sequence header包括索引值和CRC值,而Data field就是4个数据帧,包含要发送的数据,如“8313”等。 
5.2.3.1 sequence header 字段的数据结构如下图所示: 

sequence header 字段由两个 9bits 组成,第一个的低 7位装载的是从本 sequence index 开始到本 sequence 结束发送的所有数据的 crc8 的低 7 位值(计算 过程中不计入字段标识位,因此 sequence index 最高位需补 0),在接收完一个 sequence 的数据之后,需进行 crc8 值的效验,如果不相同,证明该 sequence 的 数据接收出错,应该丢弃。 
5.2.3.2 data 字段的数据结构如下图所示: 

data 字段由 4 个 9bits 组成,每个 9bits 的第 8 位为控制位,固定为 1,其余 的 8 位装载需要传输的数据。 
六、应用层协议 
发送方所要发送的数据由三部分组成:密码、随机数、ssid。其中随机数的作用 是,当数据接收方连上 AP 之后,立即发送以该随机数为内容的 UDP 广播包, 当发送方收到该广播包后就能确认接收方已经准确接收到所有数据。密码和 ssid 都’\0’结尾,并且分别用 AES 进行加密,再发送。这三部分数据的发送顺序为先 发送密码,再发送随机数,最后发送 ssid,如下图所示:

巴法云一键配网 3 种协议对比:SmartConfig vs AirKiss vs SoftAP 选型指南 本文深入对比了巴法云小程序支持的三种一键配网协议:SmartConfig、AirKiss和SoftAP,分析其技术原理、适用场景和实战表现。通过详细的成功率、兼容性、安全机制和资源占用对比,提供协议选型决策树,帮助开发者在物联网设备配网中选择最优方案。文章还包含巴法云集成实战技巧和性能优化建议,助力提升用户体验。 阅读详情

相关推荐

ESP8266/ESP32 一键配网实战:3种协议(SmartConfig/SoftAP/Airkiss)对比与选型指南

本文深入解析ESP8266/ESP32一键配网技术,对比SmartConfig、SoftAP和Airkiss三种协议的优缺点及适用场景,提供详细的工程实践指南。重点介绍Airkiss协议与微信生态的整合方法,帮助开发者快速实现高效、安全的物联网设备配网方案,提升用户体验。

weixin_30443813的博客 412

airkiss技术原理

AirKiss原理分析 一、 AirKiss概述 AirKiss技术是一种创新性的信息传递技术。通过该技术可以便捷的向一台 与外界没有建立任何一种实质性连接(包括有线、无线、蓝牙、NFC等)的设备传递信息(可以是环境中Wifi的ssid、密码等信息)。 AirKiss 技术示意图如下图所示,智能插座与外界没有建立任何一种实质性连接, 可以称之为信息孤岛。通过 Air Kiss 技术,微信客户

lb5761311的专栏 2万+

SmartConfig配网技术解析:从UDP广播到WiFi连接的实现奥秘

本文深入解析了SmartConfig配网技术,揭秘其如何利用UDP广播或组播,在设备未联网状态下,通过WiFi混杂模式捕获数据包元数据(如长度或MAC地址)来编码并传递WiFi的SSID和密码。文章详细对比了长度编码与地址编码两种核心方案,并拆解了从设备监听、手机发送到最终连接成功的完整配网流程,是理解IoT设备便捷联网实现原理的权威指南。

weixin_29161785的博客 358

图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)

ESP32 IDF 一键配网(Smartconfig、Airkiss),ESP32+VSCODE+IDF开发环境 1)使用smart_config例程,使用乐鑫ESPTouch APP或者微信公众号配网。 2)修改smart_config例程,使ESP32复位后,如果已配过网,则不再进行配网,而是直接连接路由器上网,使贴近实际项目开发。......

felix_tao的博客 3万+

ESP8266 巴法云一键配网实战:从代码解析到 5 次复位机制详解

本文详细解析了ESP8266与巴法云平台的一键配网实战方案,涵盖SmartConfig、AirKiss和SoftAP三种配网协议的技术实现,重点介绍了5次复位机制的硬件恢复原理及密钥与主题的自动生成流程,帮助开发者快速掌握物联网设备的Wi-Fi配网技术。

weixin_30381317的博客 323

告别手动配网!用Mixly+巴法云实现ESP8266一键联网最全指南(含Airkiss/AP模式对比)

本文详细介绍了如何利用Mixly和巴法云扩展库实现ESP8266一键联网,涵盖Airkiss和AP模式对比、环境搭建、配网方案选择及生产环境部署技巧。通过巴法云中间件平台,开发者可大幅缩短智能设备开发周期,实现高效配网和设备管理。

weixin_30175731的博客 315

乐鑫Esp32实现smartConfig和微信airKiss一键配网教程:轻松连接路由器的利器

乐鑫Esp32实现smartConfig和微信airKiss一键配网教程:轻松连接路由器的利器 【下载地址】乐鑫Esp32实现smartConfig和微信airKiss一键配网教程 乐鑫Esp32芯片支持smartConfig和微信airKiss两种一键配网方式,极大简化了设备连接路由器的过程。通过本教程,您可以快速掌握...

gitblog_06750的博客 1255

STM32 ESP8266 微信Airkiss智能配网连接WiFi并接入OneNET

你是否还在直接将wifi的ssid和密码直接写入STM32程序中通过串口发送给ESP8266?本文教你用微信Airkiss协议实现可视化地为ESP8266发送WiFi ssid和密码信息并连接WiFi,并使STM32主控设备接入OneNET。 微信Airkiss协议是微信提供的一款为设备配网的技术。它为ESP8266配网的原理可以简单理解为:微信尽管不知道我们所使用的ESP8266的物理地址,但以Airkiss协议发送WiFi信息后,只要ESP8266工作在Station混杂模式下(开启了SmartConf

weixin_44509533的博客 5796

一文看懂智能家居物联网设备配网方式:WIFI 配网方式、蓝牙、(AP模式、Smartconfig、airKiss、一键配网、零配等模式)

当前很多物联网设备大都无没有人机交互界面,也就没有像手机或者PC那样有wifi的配置界面,汇总了一下设备入网的方式大概有如下几种:1:AP 模式流程如下将Dev手动设置为AP模式,手机为正常的station模式手机连接到Dev的AP热点,组成局域网,手机将WiFi的SSID和密码发送给DevDev收到WiFi的SSID和密码后,切换回station模式,连接WiFi2:一键配置模式:即为通常所说的smartconfig 或者smartlink具体流程如下手机正常连接家庭局域网WiFi。

南七小僧的学海无涯 8190

airkiss原理

自己总结airkiss原理 大家随便看看。有需要的自己下载 自己总结airkiss原理 大家随便看看。有需要的自己下载

2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(3卷)解析

我们先绘制题组中所有设计图我这边作图用的国内的在线作图工具。

2301_76737000的博客 5419

ESP8266接入小爱同学系列--3.设备配网

参考代码 配网原理 配网需求 在前面我们写Blinker设备时,都是把WIFI信息写到程序中,烧录到模块中,因此当网络信息发生改变时,涉笔就无法连接到网络。此时需要重新修改代码,重新烧录。对于用户来说,修改程序比较繁琐,怎样做才能让设备去适应不同的场景呢?这就需要配网功能了。 配网模式 常见的配网模式有: 直接配网 -> SSID(Wi-Fi名称)和PWD(Wi-Fi密码)保存在设备中(每...

weixin_43482414的博客 1万+

Habitat安装全网最详细教程,手把手带你跑通example.py(全网唯一)

全网最详细具身智能仿真平台habitat的安装教程

shannanshouyin的博客 2756

开源 | 智能家居场景,基于 AriKiss 配网的微信小程序

一次偶然的机会,群里某开发者问我为什么他的微信配网出问题了,我跟着回复了些问题,发现并不是那么简单,于是乎帮这位朋友适配了下并成功了,决定在全网首个开源可实现Airkiss配网的微信小程序...

3073

保姆级教程:用GPU-Burn给你的NVIDIA Tesla服务器做个“压力体检”(附温度功耗监控脚本)

本文提供了一份详细的GPU服务器压力测试指南,重点介绍如何使用GPU-Burn工具对NVIDIA Tesla服务器进行全面的性能测试和温度功耗监控。从环境部署、多GPU测试策略到专业级监控指标解析,帮助运维人员构建标准化的GPU健康评估体系,确保AI训练和科学计算等关键业务的稳定性。

weixin_30619101的博客 395

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7781

用机智云APP控制ESP8266-01S的3种配网模式实测:Airlink/SoftAP/微信Airkiss哪个更稳?

本文深度评测了ESP8266-01S模块在机智云平台下的三种配网模式:Airlink、SoftAP和微信Airkiss。通过真实环境测试数据,分析了各模式在稳定性、兼容性和用户体验上的差异,并提供了针对复杂场景的优化建议和工程实践方案,帮助开发者选择最适合的物联网设备配网策略。

weixin_30733003的博客 493

别再只当代码阅读器了!手把手教你用Understand的实体定位器和信息浏览器,5分钟精准定位代码逻辑

本文深入解析Understand代码分析工具的高级功能,重点介绍实体定位器和信息浏览器的实战应用。通过5分钟快速定位代码逻辑的技巧,帮助开发者从代码阅读者升级为逻辑侦探,提升大型代码库的分析效率。文章包含过滤搜索、调用链追踪等实用方法,是掌握Understand核心功能的必备指南。

weixin_28745821的博客 292

ESP8266学习进阶实用篇(1)——SmartConfig智能配网(附带完整简配版有害气体检测仪开发)

家里有智能家居的小伙伴应该都知道,给新买的玩具配网上线都是直接安装教程扫描二维码然后安装个软件输入家里路由器的账号密码或者直接到一个网页输入这种联网方式,然而我们在玩8266还没出新手村之前都是将WiFi的账号密码写死在程序里,开机直接上网的新手模式,这就很没有使用价值了。 ESP8266-RTOS-SDK中提供了两种(SmartConfig)智能配网的方案接口: 乐鑫提供的ESP-TOUCH ...

大大棋的博客 3342

【报错解决】彻底解决 MySQL 登录报错 ERROR 1045 (28000)

MySQL 报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 通常是由于用户名或密码错误、权限不足、服务未启动或配置文件异常导致的。通过检查并确认密码、重置 root 用户密码、授予完整权限、校验配置文件以及确保 MySQL 服务正常运行,可以彻底解决该问题。掌握这一流程不仅能够恢复 root 登录,还能保障数据库的安全性与稳定性。

博客 1749

PD3.0详解 电源规则,全解!!!全解!!!

电源规则 大师匈今天谈一下PD3.0的电源规则,PD3.0标准标定的规则。 USB协议声称,为了世界和平世界环境,让大家用上统一标准的充电器,不用再为每一个用电设备都配一个专门的充电器,这些充电器各种各样的都有,所以有时候大师匈也很烦!!!那么为了维护世界和平,USB协议呢就制订了这个PD快充协议,还有它的规则,只要全世界都用PD,就解决了这个大问题。 在这里先了解一个关键字,PDP: Power Delivery Power PD电源的功率。 每个PD充电产品的功率要以0.5W的精度上报,比如大师匈做的P

大师匈的博客 1万+

ESP-IDF SmartConfig技术解析与一键配网实现

Wi-Fi配网是物联网设备开发中的关键技术挑战,尤其对于无输入界面的智能设备。SmartConfig通过特殊数据包传输机制,使设备能自动获取Wi-Fi凭证,解决了这一痛点。其核心原理是利用手机发送包含网络信息的编码数据包,设备通过监听解析实现自动连接。ESP-IDF框架提供ESP-Touch和Airkiss两种主流协议,其中ESP-Touch v2采用AES加密和自定义数据字段,在安全性和效率间取得平衡。该技术广泛应用于智能家居、工业物联网等场景,特别适合智能插座、传感器等设备。通过合理设置加密密钥、超时策

weixin_30889885的博客 344

【数据集】中国2003年至2022年全天空每日气温数据集

中国2003年至2022年全天空每日气温数据集

WW、forever的博客 603

WIFI类物联网产品配网方式简述

总述 智能家居类物联网产品常使用WIFI通信方式,这类产品在初始化时都必须要有一个配网过程,配网方式很大程度上影响着用户体验。 配网方式 比较 方式 简介 Airkiss 微信一键配网方式,操作简单,采用广播长度编码方式,不适用于5G路由器配网,有失败概率 SmartConfig 种类较多,各大厂家都有,有广播长度编码、组播长度编码、组播IP编码,操作简单,有失败概率 AP配网 设备端作为AP热点等待手机连接,固定IP地址作为服务端,等待手机连接建立通信通道接收SSID和PWD,操作

静默与黑白的博客 2410

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

小智音箱结合ESP32与Wi-Fi连接实现自动组网配置指南

本文介绍基于ESP32的智能音箱Wi-Fi自动组网方案,涵盖Web配网、ESP-Touch、SmartConfig等主流技术原理与实战代码,结合Captive Portal和mDNS实现无感配置,并探讨批量部署、安全存储、超时处理等关键问题,提升智能家居设备的用户体验与可维护性。

weixin_42629522的博客 892

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

什么是一键配网?

万物互联的时代,物联网是大势所趋了。是个设备就想要联网,但是也不能给每个设备都设计一个屏幕和键盘,首先成本太高,其次只用来输入wifi名字密码未免太浪费。最开始的解决办法就是让设备工作在AP模式,类似一个wifi路由器,手机连接AP,然后再打开通讯用的软件输入wifi名字密码。虽然可行,但总归还是有些许的麻烦。于是一键配网就诞生了,只要设备通电,然后局域网内广播一下(APP、扫码、微信等),设备就联网了。...

weixin_43719752的博客 2126

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: iOS链接外部设备的几种方式
下一篇: iOS线程和队列的关系
敬业的程序猿
博客等级 码龄11年 51粉丝 77原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值