乐鑫官网关于ESP-Touch的说明中, 主要文档在于资源-文档-用户指南中.
但翻开用户指南的pdf文件, 发现其中说明似乎缺少了点什么:

  1. 说明了通过UDP的2个字节的Length字段发送SSID和密码
  2. 说明了在ESP32和ESP8266上如何启动ESPTouch(在PDF的示例代码中又称之为smartconfig了, 这个名字不是TI的吗?)

唯独缺少了手机端如何组装和发送数据的说明.
通过阅读手机端的源码 (Android DatumCode.javaIOS DatumCode.m), 发现了其数据的构造过程在源码中注释如下

// Data = total len(1 byte) + apPwd len(1 byte) + SSID CRC(1 byte) +
// BSSID CRC(1 byte) + TOTAL XOR(1 byte)+ ipAddress(4 byte) + apPwd + apSsid apPwdLen <=
// 105 at the moment

在源码中,private static final int EXTRA_HEAD_LEN = 5;正好是前面的长度/CRC/XOR共5个字节,总长度:char totalLen = (char) (EXTRA_HEAD_LEN + ipLen + apPwdLen + apSsidLen); 只是奇怪的是,在apSSid之后,又通过奇妙的方法去插入bssid:

        // add bssid
        int bssidInsertIndex = EXTRA_HEAD_LEN;
        for (int i = 0; i < apBssid.length; i++) {
            int index = totalLen + i;
            char c = ByteUtil.convertByte2Uint8(apBssid[i]);
            DataCode dc = new DataCode(c, index);
            if (bssidInsertIndex >= mDataCodes.size()) {
                mDataCodes.add(dc);
            } else {
                mDataCodes.add(bssidInsertIndex, dc);
            }
            bssidInsertIndex += 4;
        }

看上述方法,似乎是从EXTRA_HEAD_LEN开始,每隔4字节插入一字节的bssid直到插完为止(事实上应该是原数据上每隔3字节,因为每插入一个bssid后原数据剩余部分都往后挤出1个字节). 如果原数据插完不够长,就把剩下的bssid插在最后面...奇怪的做法啊.

而实际在传输中, 竟然会把1个字节数据拆成6个字节传输.
整个看起来挺复杂的,也升级了很多个版本, 没时间的话还是不建议自己再实现一遍了.

标签: none 阅读量: 2740

添加新评论