数码之家

 找回密码
 立即注册
搜索
查看: 7603|回复: 31

[Arduino] Arduino ESP8266 AP 中继 (可修改AP的MAC地址)

[复制链接]
发表于 2023-1-10 14:51:12 | 显示全部楼层 |阅读模式
最早跟网上搜了一大堆,要么就是编译好的bin,要么就是无法用arduino编译的(懒得折腾esp开发环境)只会用arduino写代码

后来才搜到github的代码,发现作者的代码已经被收录到 esp8266 arduino 示例中,费眼的找了好久才发现

最早的中继名字叫,esp8266 wifi repeater,也就是早期满天飞的 bin 文件

现在这玩意叫 NAPT ,用8266连wifi,再发射一个新的AP,默认代码是在原来ssid名字后面加上extender发射

再说代码修改部分功能,我加上了AP默认SSID和密码,重要的是加了AP默认mac地址的修改,这功能太有用了。。。很多需要绑mac验证的功能。。。不说了
会用的自然知道用在哪里,不会用的就随便玩玩就好,不过看帖子有人说AP只能连4个client,这个我没试,另外8266天生低能。。。网速不要抱太大希望,毕竟重要的还是ssid和mac地址

有兴趣的可以看下这个8266管理界面,暂时没想好怎么把AP功能放进去,最近更新了LittleFS替换原来的SPIFFS,加了兼容ESP32,不过ESP32库缺少读取LittleFS信息的代码,就都留空了

另外,esp8266 broads 我升级到了最新的 2.0.3 老版本我不清楚是否有 include 的库,最好用最新的

https://github.com/happysoul/esp8266web
https://gitee.com/happysoul/esp8266web




基于这个例子修改的

本来想给代码加颜色的,发现代码中不支持,算了。。我都加上了   //-----------------------------------  来标注是我修改的部分


  1. // NAPT example released to public domain

  2. #if LWIP_FEATURES && !LWIP_IPV6

  3. #define HAVE_NETDUMP 0

  4. //要连接的wifi
  5. #ifndef STASSID
  6. #define STASSID "123456" //-----------------------------------
  7. #define STAPSK  "password" //-----------------------------------
  8. #endif

  9. //AP配置信息
  10. #ifndef APSTASSID
  11. #define APSTASSID  "AP_SSID" //-----------------------------------
  12. #define APPASSWORD "password" //-----------------------------------
  13. #endif

  14. //修改AP的MAC地址
  15. uint8_t newMACAddress[] = {0x00, 0xaa, 0xbb, 0xcc, 0xdd, 0xee};//-----------------------------------

  16. #include <ESP8266WiFi.h>
  17. #include <lwip/napt.h>
  18. #include <lwip/dns.h>
  19. #include <LwipDhcpServer.h>

  20. #define NAPT 1000
  21. #define NAPT_PORT 10

  22. #if HAVE_NETDUMP

  23. #include <NetDump.h>

  24. void dump(int netif_idx, const char* data, size_t len, int out, int success) {
  25.   (void)success;
  26.   Serial.print(out ? F("out ") : F(" in "));
  27.   Serial.printf("%d ", netif_idx);

  28.   // optional filter example: if (netDump_is_ARP(data))
  29.   {
  30.     netDump(Serial, data, len);
  31.     //netDumpHex(Serial, data, len);
  32.   }
  33. }
  34. #endif

  35. void setup() {
  36.   Serial.begin(115200);
  37.   Serial.printf("\n\nNAPT Range extender\n");
  38.   Serial.printf("Heap on start: %d\n", ESP.getFreeHeap());

  39. #if HAVE_NETDUMP
  40.   phy_capture = dump;
  41. #endif

  42.   // first, connect to STA so we can get a proper local DNS server
  43.   WiFi.mode(WIFI_STA);
  44.   WiFi.begin(STASSID, STAPSK);
  45.   while (WiFi.status() != WL_CONNECTED) {
  46.     Serial.print('.');
  47.     delay(500);
  48.   }
  49.   Serial.printf("\nSTA: %s (dns: %s / %s)\n",
  50.                 WiFi.localIP().toString().c_str(),
  51.                 WiFi.dnsIP(0).toString().c_str(),
  52.                 WiFi.dnsIP(1).toString().c_str());

  53.   // give DNS servers to AP side
  54.   dhcpSoftAP.dhcps_set_dns(0, WiFi.dnsIP(0));
  55.   dhcpSoftAP.dhcps_set_dns(1, WiFi.dnsIP(1));

  56.   WiFi.softAPConfig(  // enable AP, with android-compatible google domain
  57.     IPAddress(172, 217, 28, 254),
  58.     IPAddress(172, 217, 28, 254),
  59.     IPAddress(255, 255, 255, 0));
  60. //  WiFi.softAP(STASSID "extender", STAPSK);

  61.   Serial.print("mac:");                                      //-----------------------------------
  62.   Serial.println(WiFi.macAddress());                   //-----------------------------------

  63.   WiFi.softAP(APSTASSID, APPASSWORD);
  64.   //修改AP的MAC地址
  65.   
  66.   //wifi_set_macaddr(STATION_IF, &newMACAddress[0]);//ST模式           //-----------------------------------
  67.   wifi_set_macaddr(SOFTAP_IF, &newMACAddress[0]);//AP模式               //-----------------------------------
  68.   
  69.   Serial.print("mac:");                                      //-----------------------------------
  70.   Serial.println(WiFi.macAddress());                   //-----------------------------------

  71.   Serial.printf("AP: %s\n", WiFi.softAPIP().toString().c_str());

  72.   Serial.printf("Heap before: %d\n", ESP.getFreeHeap());
  73.   err_t ret = ip_napt_init(NAPT, NAPT_PORT);
  74.   Serial.printf("ip_napt_init(%d,%d): ret=%d (OK=%d)\n", NAPT, NAPT_PORT, (int)ret, (int)ERR_OK);
  75.   if (ret == ERR_OK) {
  76.     ret = ip_napt_enable_no(SOFTAP_IF, 1);
  77.     Serial.printf("ip_napt_enable_no(SOFTAP_IF): ret=%d (OK=%d)\n", (int)ret, (int)ERR_OK);
  78.     if (ret == ERR_OK) {
  79.       Serial.printf("WiFi Network '%s' with same password is now NATed behind '%s'\n", STASSID "extender", STASSID);
  80.     }
  81.   }
  82.   Serial.printf("Heap after napt init: %d\n", ESP.getFreeHeap());
  83.   if (ret != ERR_OK) {
  84.     Serial.printf("NAPT initialization failed\n");
  85.   }
  86. }

  87. #else

  88. void setup() {
  89.   Serial.begin(115200);
  90.   Serial.printf("\n\nNAPT not supported in this configuration\n");
  91. }

  92. #endif

  93. void loop() {
  94. }
复制代码




补充内容 (2023-2-10 10:13):
帖子无法改了
补充,这里只分享8266现有功能,请在法律法规允许范围内讨论和使用
就像菜刀正常使用合法,但威胁他人生命时就要接受法律制裁了...

补充内容 (2024-2-2 11:05):
完整版本 看20楼大佬的帖子,功能上就是 某些 app 的某些操作会判断 当前连接的 无线网ssid名字和mac地址,才能做某些操作。8266用来模拟 AP

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 4家元 +150 收起 理由
jf201006 + 10 謝謝分享
cushion + 20 原創內容
2545889167 + 20
家睦 + 100

查看全部打赏

发表于 2023-1-10 15:04:00 | 显示全部楼层
谢谢分享!有空时试一试
回复 支持 反对

使用道具 举报

发表于 2023-1-10 15:25:09 | 显示全部楼层
给物联网家电什么的 做中继还是可以的,反正不要求网速
回复 支持 反对

使用道具 举报

发表于 2023-1-10 15:49:04 | 显示全部楼层
牛,,,,给物联网家电什么的 做中继还是可以的,反正不要求网速
回复 支持 反对

使用道具 举报

发表于 2023-1-11 15:44:12 | 显示全部楼层
以前玩过,主要是某些打卡软件是只需要SSID和MAC一样,就不需要定位,懂的都懂吧
回复 支持 2 反对 0

使用道具 举报

发表于 2023-1-11 19:09:33 | 显示全部楼层
学习了。
以前找个一个类似的,基本没法用。
空了试试楼主这个
回复 支持 反对

使用道具 举报

发表于 2023-1-18 11:41:49 | 显示全部楼层
已经下载,


打算完成扫描后,保存E2ROM。
回复 支持 反对

使用道具 举报

发表于 2023-1-18 12:13:33 | 显示全部楼层
bg4rff 发表于 2023-1-11 15:44
以前玩过,主要是某些打卡软件是只需要SSID和MAC一样,就不需要定位,懂的都懂吧 ...

能展开说说吗?不然确实没发现怎么个有用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-18 14:42:30 | 显示全部楼层
bg4rff 发表于 2023-1-11 15:44
以前玩过,主要是某些打卡软件是只需要SSID和MAC一样,就不需要定位,懂的都懂吧 ...

哈哈 你看懂了   
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-18 14:46:05 | 显示全部楼层

wifi配置里,就是把ssid和密码保存成littleFS文件,好处就是不直接读写地址,应该能平衡存储来延长寿命,这也就是为啥我不用那些wifi库来配网
回复 支持 反对

使用道具 举报

发表于 2023-1-18 15:13:14 | 显示全部楼层
学习了,谢谢分享
回复 支持 反对

使用道具 举报

发表于 2023-1-18 22:16:00 | 显示全部楼层
学习学习,谢谢分享
回复 支持 反对

使用道具 举报

发表于 2023-1-19 12:04:00 | 显示全部楼层
LittleFS  上传插件,默认不支持 ESP32

                if(!PreferencesData.get("target_platform").contentEquals("esp8266")){
                        System.err.println();
                        editor.statusError("LittleFS Not Supported on "+PreferencesData.get("target_platform"));
                        return;
                }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-20 10:11:39 | 显示全部楼层
本帖最后由 firseve 于 2023-1-20 10:19 编辑
devcang 发表于 2023-1-19 12:04
LittleFS  上传插件,默认不支持 ESP32

                if(!PreferencesData.get("target_platform").contentEquals("es ...

https://github.com/lorol/arduino-esp32littlefs-plugin
我没试 你可以看看

补充内容 (2023-2-10 09:47):
地址写错了
https://github.com/lorol/arduino-esp32fs-plugin
右侧有下载 按照步骤放到指定位置重启ide 就能看到上传功能了
回复 支持 反对

使用道具 举报

发表于 2023-1-21 23:34:09 来自手机浏览器 | 显示全部楼层
如果有esp8266的wifi驱动开源就好了
回复 支持 反对

使用道具 举报

发表于 2023-2-8 03:34:19 | 显示全部楼层
请教下楼主。这个地方 如果只修改AP不修改ST模式的MAC地址,手机显示连不上,获取IP地址失败,如果都修改,似乎MAC地址还是esp8266本身的原装IP,好奇怪
  //wifi_set_macaddr(STATION_IF, &newMACAddress[0]);//ST模式           //-----------------------------------
  wifi_set_macaddr(SOFTAP_IF, &newMACAddress[0]);//AP模式               //-----------------------------------
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-8 17:28:03 | 显示全部楼层
2545889167 发表于 2023-2-8 03:34
请教下楼主。这个地方 如果只修改AP不修改ST模式的MAC地址,手机显示连不上,获取IP地址失败,如果都修改, ...

奇怪,发帖子的时候看功能是正常的,现在运行看到的就有问题。。。
可以看下这个
https://randomnerdtutorials.com/ ... ac-address-arduino/

另外改下
WiFi.mode(WIFI_AP_STA);
再有就是 wifi_set_macaddr 前面的注释去掉,ST和AP 要2个mac

我后面再找时间详细研究下怎么使用 再搞个功能完整的
回复 支持 反对

使用道具 举报

发表于 2023-2-8 17:45:54 | 显示全部楼层
firseve 发表于 2023-2-8 17:28
奇怪,发帖子的时候看功能是正常的,现在运行看到的就有问题。。。
可以看下这个
https://randomnerdtuto ...

谢谢楼主,我自己研究了下,搞定了。需要先设置MAC再连网,就ok了,连了wifi再改MAC好像会导致DHCP崩盘
我做了个有网页配网的版本
ESP8266网络AP中继 可网页设置SSID和修改MAC地址(开源,免编译)
https://www.mydigit.cn/forum.php ... amp;fromuid=1795013
(出处: 数码之家)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 11:41 , Processed in 0.202800 second(s), 9 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表