大家好,我是杂烩君。
嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。
内容主要来源于我们之前收集的资料:
https://gitee.com/zhengnianli/EmbedSummary
项目需要用到smartconfig,之前我也没接触过,查资料了解的过程发现了一个好东西——SmartLink,分享给大家。
SmartLink是一个在Linux下实现的smartconfig。
仓库链接:
https://github.com/jolin90/smartconfig
在介绍SmartLink的使用之前,我们先补充点相关知识。
以wifi智能插座来做说明。我们刚买回来的智能插座,第一步要做的就是给设备进行配网。
配网方式有很多,smartconfig就是其中一种:
图片来源:物联网电子世界
手机发送UDP广播报文,待配网设备扫描所有的可用无线信道,找到发送smartConfig的报文,并锁定在这一信道上开始接受数据。
查看、设置、取消混杂模式命令如:
ifconfig wlan0
#查看wlan0是否为混杂模式
ifconfig wlan0 promisc
#设置wlan0为混杂模式
ifconfig wlan0 -promisc
#取消wlan0混杂模式
通信方式分类:
IP 网络的组播一般通过组播 IP 地址来实现,组播 IP 地址就是 D 类 IP 地址,即 224.0.0.0 至 239.255.255.255 之间的IP地址。
下载得到:
我们使用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进行测试:
上面演示了SmartLink的使用,下面简单介绍一些SmartLink的组播包协议。
APP发送特定协议的组播包数据给设备,设备收到后进行解析获取路由器SSID及密码。其协议如:
每个数据包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的博客
组播地址相关介绍可阅读博文:
https://blog.csdn.net/wjz110201/article/details/114628203
这里,手机APP设置的组播IP固定如:
#define IPADDR_KEY0 "224.0.72.53" /*key0:01:00:5e:00:48:35 */
#define IPADDR_KEY1 "224.1.104.43" /*key1:01:00:5e:01:68:2b */
#define IPADDR_KEY2 "224.2.92.49" /*key2:01:00:5e:02:5c:31 */
组播IP映射为组播MAC,得到:
取后
23
位即为
0.72.53
对应
16
进制为
00
:
48
:
35
取后
23
位即为
1.104.43
对应
16
进制为
01
:
68
:
2b
取后
23
位即为
2.92.49
对应
16
进制为
02
:
5
c:
31
(2)第4包数据放的是SSID及PSW的长度。
(3)第5~15包数据放的则是SSID及PSW。
(4)第16包数据为校验码,采用连续异或校验的方式:
Crc=Crc^0x01^(byte)0x5e^0x40
以上就是本次的分享,文章如有错误,欢迎指出,谢谢!
咱们下期见~
全部0条评论
快来发表一下你的评论吧 !