分享一种实用的配网方案!

描述

大家好,我是LinuxZn。

什么是SmartLink?

项目需要用到smartconfig,之前我也没接触过,查资料了解的过程发现了一个好东西——SmartLink,分享给大家。

SmartLink是一个在Linux下实现的smartconfig。

仓库链接:

https://github.com/jolin90/smartconfig

SmartLink的介绍及使用

1、相关知识补充

在介绍SmartLink的使用之前,我们先补充点相关知识。

(1)什么是smartconfig?

以wifi智能插座来做说明。我们刚买回来的智能插座,第一步要做的就是给设备进行配网。

配网方式有很多,smartconfig就是其中一种:

智能插座智能插座

图片来源:物联网电子世界

手机发送UDP广播报文,待配网设备扫描所有的可用无线信道,找到发送smartConfig的报文,并锁定在这一信道上开始接受数据。

(2)网卡工作模式

广播模式:物理地址(MAC)是0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。

多播模式:如果将网卡设置为多播模式,它可以接收所有的多播传送帧,而不论他是不是组内成员。

直接模式:只接收目的地址是自己MAC地址的帧。

混杂模式:工作在混杂模式下的网卡接收所有流经网卡的帧。

查看、设置、取消混杂模式命令如:

 

ifconfig wlan0 #查看wlan0是否为混杂模式
ifconfig wlan0 promisc #设置wlan0为混杂模式
ifconfig wlan0 -promisc #取消wlan0混杂模式
智能插座

 

(3)通信方式

通信方式分类:

单播:单台主机与单台主机之间的通信;

广播:单台主机与网络中所有主机的通信;

组播:单台主机与选定的一组主机的通信;

IP 网络的组播一般通过组播 IP 地址来实现,组播 IP 地址就是 D 类 IP 地址,即 224.0.0.0 至 239.255.255.255 之间的IP地址。

2、SmartLink使用

下载得到:

智能插座

我们使用arm板子来做实验。首先,需要交叉编译,执行命令:

 

make CC=arm-linux-gnueabihf-gcc

 

把编译生成的smartlink可执行程序传到板子里。运行时需要跟上接口的名称。如:

 

./smartlink wlan0

 

然后执行如下命令重新编译:

 

make clean
make

 

生成的mcast_app可执行程序在pc上运行,模拟手机APP发送。运行时需要传入WiFi名称及密码。如:

 

./mcast_app Tenda_552F18 0987654321

 

测试时需要先运行mcast_app,再运行smartlink。smartlink收到WiFi名称及密码时会打印出来。

运行结果如:

智能插座

这里,使用mcast_app来模拟手机APP。smartlink也提供了一个简易的安卓手机APP,也可以使用APP进行测试:

智能插座

4、SmartLink组播包协议分析

上面演示了SmartLink的使用,下面简单介绍一些SmartLink的组播包协议。

APP发送特定协议的组播包数据给设备,设备收到后进行解析获取路由器SSID及密码。其协议如:

每个数据包6个字节,

第1~3字节:组播包地址,为固定值0x01 0x00 0x5e。

第4字节:数据包序号。

第5字节:指定数据。

第6个字节:指定数据。

每次传输若干字节。举例说明:

SSID为"TP-LINK_hys" ,PSW为"12345678",发送组播地址如下:

 

0x01 0x00 0x5e 0x00  0x48  0x35
0x01 0x00 0x5e 0x01  0x68  0x2b
0x01 0x00 0x5e 0x02  0x5c  0x31
0x01 0x00 0x5e 0x03  0x0b  0x08
0x01 0x00 0x5e 0x04  'T'  '1'
0x01 0x00 0x5e 0x05  'P'  '2'
0x01 0x00 0x5e 0x06  '-'  '3'
0x01 0x00 0x5e 0x07  'L'  '4'
0x01 0x00 0x5e 0x08  'I'  '5'
0x01 0x00 0x5e 0x09  'N'  '6'
0x01 0x00 0x5e 0x0a  'K'  '7'
0x01 0x00 0x5e 0x0b  '_'  '8'
0x01 0x00 0x5e 0x0c  'h'  0x00
0x01 0x00 0x5e 0x0d  'y'  0x00
0x01 0x00 0x5e 0x0e  's'  0x00
0x01 0x00 0x5e 0x40  0x1c  0x03

 

其中:

(1)第1~3包数据,为特征码包,后三个字节由组播IP映射为为组播MAC。取组播IP的后23位作为MAC,映射图如:

智能插座

图片来源:jasonj33的博客

这里,手机APP设置的组播IP固定如:

 

#define IPADDR_KEY0 "224.0.72.53"   /*key0000035 */
#define IPADDR_KEY1 "224.1.104.43"  /*key100012b */
#define IPADDR_KEY2 "224.2.92.49"   /*key2000231 */

 

组播IP映射为组播MAC,得到:

 

取后23位即为0.72.53对应16进制为00:48:35
取后23位即为1.104.43对应16进制为01:68:2b
取后23位即为2.92.49对应16进制为02:5c:31 

 

(2)第4包数据放的是SSID及PSW的长度。

(3)第5~15包数据放的则是SSID及PSW。

(4)第16包数据为校验码,采用连续异或校验的方式:

 

Crc=Crc^0x01^(byte)0x5e^0x40

 

以上就是本次的分享。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分