大家好,我是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
以上就是本次的分享。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !