首页|资源下载
登录|注册

您现在的位置是:首页 > 技术阅读 >  嵌入式大杂烩周记 | 第 5 期

嵌入式大杂烩周记 | 第 5 期

时间:2022-09-28

大家好,我是杂烩君。

嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。

内容主要来源于我们之前收集的资料:

https://gitee.com/zhengnianli/EmbedSummary

本期主角: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的博客

组播地址相关介绍可阅读博文:

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:5c:31 

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

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

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

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

以上就是本次的分享,文章如有错误,欢迎指出,谢谢!

咱们下期见~

温馨提示

由于微信公众号近期改变了推送规则,如果您想经常看到我们的文章,可以在每次阅读后,在页面下方点一个「赞」或「在看」,这样每次推送的文章才会第一时间出现在您的订阅列表里。

往期推荐:

嵌入式大杂烩周记 | 第 4 期

嵌入式大杂烩周记 | 第 3 期

嵌入式大杂烩周记 | 第 2 期

嵌入式大杂烩周记 | 第 1 期

干货 | 嵌入式OTA升级实现原理

几个Makefile通用模板分享!

分享一份嵌入式软件工具清单!

实用 | 一个高性能通信库的简单使用分享

实用工具 | LVGL GUI-Guider的使用分享

C语言、嵌入式中几个非常实用的宏技巧

在公众号聊天界面回复1024,可获取嵌入式资源;回复 ,可查看文章汇总。


点击阅读原文,查看更多分享。