Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

  在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的。有图为证,哈哈。

  

  上一篇文章【Android开发—智能家居系列】(一):智能家居原理的文末总结中写到:

  手机APP控制智能温控器就两步:一是通过手机,让WIFI模块接入网络,而是通过网络,使用手机对模块发送指令。在这篇文章中,我们来介绍第一个步骤。

【时序图】

  

【概念】

【两种模式】:

AP:即无线接入点,是一个无线网络的中心节点。通常使用的无线路由器就是一个AP,其它无线终端可以通过AP相互连接。

STA:即无线站点,是一个无线网络的终端。如笔记本电脑、PDA等。

【两个端口】

48899端口:我所用的WIFI模块(USR-WIFI232-S)的端口

49000端口:除去我用的WIFI(USR-WIFI232-S)模块,其他WIFI模块的端口

【IP地址】

广播地址:X.X.X.255(如:255.255.255.255)

WIFI模块默认IP:10.10.100.254

接入路由器之后,由路由器动态分配的IP。

【实现过程描述】

使用UDP广播方式搜索wifi模块

  • 第一阶段是在WIFI模块处于AP模式下,对其进行搜索。
  • 第二阶段是在WIFI模块处于STA模式下,对其进行搜索。

第一阶段

  模块工作在AP模式下时,会开启一个用于接收“快速联网协议命令”的UDP端口,端口号为48999(出厂设置默认IP为10.10.100.254)

  1. 通过UDP广播(广播地址:x.x.x.255,端口48899),发送HF-A11ASSISTHREAD(该口令可用AT+ASWD命令设置)

    (这里也可以用单播的形式搜索,目的地址:10.10.10.254,端口48899,命令不变)

  2. 模块收到指令后,如果口令正确,向源地址(单播:端口48899)发送IP地址、Mac地址和模块名称。
  3. 收到模块返回的IP地址及MAC地址后,立即回送一个“+ok”,模块收到后进入连接状态。
  4. 进入连接状态后,模块可以正常接收网络AT指令。 如:设置网络协议参数:AT+NETP=TCP,CLIENT,30000,X.X.X.X 设置STA的网络参数:AT+WANN=DHCP

过渡阶段:

  1. UDP广播(端口:49000)发送指令ff 00 01 01 02(十六进制)
  2. 模块收到指令后返回路由列表
  3. 将用户选择的SSID(路由名称)和密钥发送给模块(端口:49000),模块连入此路由,转化成STA模式,并回送一个指令ff 00 03 82 01 01 87

第二阶段:

  

  在STA模式下,我们要找到此WIFI模块,并对其发送开、关等操作指令。步骤同第一阶段,但是返回的IP地址会不一样。模块作为STA链接到路由中,以为此时模块的IP地址是由路由器分配的,不是确定IP地址,所以手机无法与模块建立连接,故需要采用广播搜索,获取到模块在STA模式下的地址。

【总结】

  有了基本的思路,了解并熟悉整个连接和通信过程,接下来就是比较简单的和基础的部分了,包括UDP通信以及字符和十六进制之间的转换等基本功了。整个开发过程中,对以上内容的理解是一点一点来的,刚开始组长给我讲一遍什么都不明白,给了我一堆资料和工具也不知道怎么用,但是开发着开发着就搞清楚了。开发过程中还请教了WIFI模块生产公司的工程师,解决了我的问题。遇到问题时,还是要多想办法,总会有解决的办法,看你有没有决心和信心要把它解决出来。

时间: 2024-11-07 00:04:37

Android开发—智能家居系列】(二):用手机对WIFI模块进行配置的相关文章

【Android开发—智能家居系列】(四):UDP通信发送指令

思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指令,让WIFI模块接入指定路由 [5]手机连接路由 [6]发送指令,获得WIFI模块的动态IP地址 UDP通信线程类 package com.jczb.smartlife.common; import java.io.IOException; import java.net.DatagramPack

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

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有两个方法: 其中有一个Connect方法,还有一个connectSpecificAP方法,对于不需要密码就能链接的WIFI模块,我使用的是后者. 主要步骤 连接WIFI大致分为一下几个步骤: [1]打开WIFI openWifi [2]配置网络信息 createWifiInfo返回WIFiConfi

自己动手打造属于自己的智能家居(二)

上篇讲完了手机如何连接智能主机,这篇开始讲解智能主机如何去控制家中各个设备.这篇会写的比较详细,涉及到的基本知识也会讲解,意在让大家明白里面的原理. 下面我们把家里的设备分一下类:(这里写的一些典型的设备,等明白原理后对于其他的设备,也可以自己去添加了) 第一类:电视.空调 第二类:家里的各种灯 第三类:热水器.电饭煲 第四类:台灯 第五类:窗帘 ================================详细讲解分割线============================== 一.第一类

基于Laravel+Swoole开发智能家居后端

基于Laravel+Swoole开发智能家居后端 在上一篇<Laravel如何优雅的使用Swoole>中我已经大概谈到了Laravel结合Swoole的用法. 今天,我参与的智能家居项目基本上已经结束了Web服务器及android端的开发(熬了个通宵突击把剩下的做了,好累), 趁热来聊聊基于Laravel+Swoole开发智能家居后端的关键技术点. 16进制ASCII码协议的解析 硬件我不谈,我只需要关心数据解析.如何基于Swoole如果在php中解析16进制的ascii码,这种文章还比较少呢

Android 开发技巧总结(二)

1.首选项的存取数据 写一个类,里面放入存取方法,然后在外面进行调用 public class PrefsUtils { private static final String PREFS_NAME="com.yomoto.util.OtherPrefs"; //这里放入的名字存入的地址是:data/data/项目包名/shared_prefs/PREFS_NAME //得到首选项中的数据 public static String getValue(Context context,St

Android开发之自定义Dialog二次打开报错问题解决

之前自定义了一个AlertDialog对话框,第一次点击时正常,但第二次调用时会出现错误:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 关于这个错误纠结了我好久,在网上百度了也不少,但感觉解决效果都达不到自己想要的效果.网上的解释说是一个子视图指定了多个父视图.由此可以推断出,在第二

【Android开发VR实战】二.播放360&amp;#176;全景视频

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发VR实战]二.播放360°全景视频 VR即Virtual Reality虚拟现实.虚拟现实技术是一种能够创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,怎样在Android中去开发VR功能的APP

【Android开发VR实战】二.播放360&#176;全景视频

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发VR实战]二.播放360°全景视频 VR即Virtual Reality虚拟现实.虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,如何在Android中去开发VR功能的APP

Android开发之大位图二次采样压缩处理(源代码分享)

图片有各种形状和大小.在许多情况下这些图片是远远大于我们的用户界面(UI)且占据着极大的内存空间,如果我们不对位图进行压缩处理,我们的程序会发生内存泄露的错误. MainActivity的代码 package com.example.g08_bitmap; import android.os.Bundle; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitm