2024年10月

作为一个程序员,想要学习物联网控制,并将学习过程记录下来,方便他人查阅。

  1. 准备硬件:选择ESP8266 12F,它内置WiFi,适合入门。
  2. 安装工具:使用Arduino IDE进行代码编写和上传。
  3. 安装驱动与库:使用提供的一键安装包,简化ESP8266驱动和MQTT库的安装。
  4. 获取Bmob云服务信息:注册并获取MQTT服务的必要信息。
  5. 编写与上传代码:配置WiFi和MQTT连接,控制ESP8266内置灯。
  6. 远程控制灯光:通过Bmob云实现远程开关灯。

首先我们看最终效果

输入on 开灯

输入off 关灯

这是是最终效果的录制视频

https://www.ixigua.com/7403595674341605942?utm_source=iframe_share

  1. 准备硬件:选择ESP8266 12F,它内置WiFi,适合入门。

    ESP8266-12F 是一个经济实惠的 WiFi 模块,广泛应用于物联网(IoT)开发。它自带 WiFi 功能,支持 2.4GHz 无线网络连接,适合需要无线通信的小型电子项目。模块体积小巧,拥有多个 GPIO 引脚,可轻松集成到各种硬件项目中。由于其低功耗和强大的处理能力,ESP8266-12F 在远程控制、智能家居、传感器网络等领域得到了广泛应用,成为了物联网开发的首选硬件之一。

主要是他便宜,国产,并且最新手友好,他长这样,价格就十几块,网上随便找个店铺即可

image.png

下单,我这因为购买了一些其他材料,所有价格需要30多

image.png

  1. 安装工具:使用Arduino IDE进行代码编写和上传。

    这里选择Arduino IDE,下载地址:www.arduino.cc/en/software

    image.png

  2. 安装驱动与库:使用提供的一键安装包,简化ESP8266驱动和MQTT库的安装。

    1. 下载安装后,安装esp8266模块

    image.png

    1. 开发工具安装mqtt链接库,由于github 被墙,这里我传个国内代码镜像,封装为bat命令,安装时关闭开发工具

      https://link.juejin.cn/?target=https%3A%2F%2Fbmob-cdn-31082.bmobpay.com%2Fiot%2Fesp8266_install.zip

      [图片上传失败...(image-72868c-1725876245397)]

    2. 我们把代码上次的时候,需要选择我们上传的端口

      image.png

      这样我们就可以把代码烧录到esp8266

  3. 获取Bmob云服务信息:注册并获取MQTT服务的必要信息。

登录控制台

[图片上传失败...(image-5d830f-1725876245397)]

左侧IOT栏目,拿到链接参数

image.png

  1. 编写与上传代码:配置WiFi和MQTT连接,控制ESP8266内置灯。

代码直接复制使用,把里面几个参数跟Bmob后端云一致即可

// 加载WIFI头文件
#include <ESP8266WiFi.h>
// 加载MQTT库文件
#include <PubSubClient.h>

// 你的WIFI名称,需要修改
const char* WIFI_SSID = "WiFi名称";
// 你的WIFI密码,需要修改
const char* WIFI_PASSWORD = "WiFi密码";
// Bmob云的物联网地址
const char* MQTT_SERVER = "broker.codenow.cn";
// Bmob云的物联网端口
const int MQTT_PORT = 1883;
// 灯光引脚
const int LED = 2;
// 用户名,到Bmob云->创建的应用-> IOT -> 连接信息 中获取
#define APPID  "603b85d874d1b5ea"
// 密码,到Bmob云->创建的应用-> IOT -> 连接信息 中获取
#define APPPASSWORD "19a66167a0eadaca"
// 你自己定义的设备类型,方便记忆就好,这里的LINE表示灯光的意思
#define TYPE  "LINE"

WiFiClient espClient;
PubSubClient client(espClient);

// 打开灯泡
void turnOnLed() {
  Serial.println("打开灯光");
  digitalWrite(LED, LOW);
}
// 关闭灯泡
void turnOffLed() {
  Serial.println("关闭灯光");
  digitalWrite(LED, HIGH);
}

// 配置esp8266的WIFI账号和密码
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  // 设置WIFI的账号和密码
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  // 检测WIFI是否联通
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi已连接");
}

// MQTT服务的回调
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print(topic);
  Serial.print(" 主题收到消息");
  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[I];
  }
  Serial.print(message);
  Serial.println();

  if (message == "on") {
    //如果接收到on字符串,调用开灯方法
    turnOnLed();//开灯函数

  } else if (message == "off") {
    //如果接收到off字符串,调用关灯方法
    turnOffLed();
  }
  message = "";
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("正在尝试MQTT连接...");

    String client_id = "esp8266client";
    client_id += String(WiFi.macAddress());
    if (client.connect(client_id.c_str(), APPID, APPPASSWORD)) {
      Serial.println("正常连接");

      //这是你的主题名称
      String topic = "devices/" + String(TYPE) + "/" + String(APPID) + "/" + client_id;
      client.subscribe(topic.c_str());
    } else {
      Serial.print("连接异常,rc=");
      Serial.print(client.state());
      Serial.println(" 5秒后重试");
      // 5秒重试
      delay(5000);
    }
  }
}

void setup() {
  pinMode(LED, OUTPUT);
  // 设置波特率
  Serial.begin(115200);
  // 配置WIFI并连接上网
  setup_wifi();
  // 连接MQTT服务
  client.setServer(MQTT_SERVER, MQTT_PORT);
  // 设置MQTT消息回掉
  client.setCallback(callback);
  digitalWrite(LED, HIGH);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

image.png

查看日志

查看串口输出的时候,记得选择波特率位115200(代码中设置的)。

[图片上传失败...(image-5ebe06-1725876245397)]

这样esp8266 就已经链接上mqtt服务。 只要远程下指令,就可以实现开与关

开关核心代码

if (message == "on") {
    //如果接收到on字符串,调用开灯方法
    turnOnLed();//开灯函数

  } else if (message == "off") {
    //如果接收到off字符串,调用关灯方法
    turnOffLed();
  }
  1. 远程控制灯光:通过Bmob云实现远程开关灯。

image.png
image.png

这样就实现了服务器控制远程开关灯, 后面我们把这个开关操作,使用小程序实现。

XCode15, XCode16版本使用Cocoapods报错解决

Xcode版本 Version 16.0 (16A242d)

新建一个项目bmob202407

1.界面加入一个按钮

Xnip2024-10-23_10-06-19.jpg

2.新增一个podfile文件

platform :ios, '11.0'  # Specify the platform and deployment target

target 'bmob202407' do
  pod 'BmobSDK'
end

3.安装pod

 pod install
Analyzing dependencies

――― MARKDOWN TEMPLATE ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

### Command

```
/Users/magic/.rbenv/versions/3.2.5/bin/pod install
```

### Report

* What did you do?

* What did you expect to happen?

* What happened instead?


### Stack

```
   CocoaPods : 1.15.2
        Ruby : ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [arm64-darwin24]
    RubyGems : 3.5.22
        Host : macOS 15.0.1 (24A348)
       Xcode : 16.0 (16A242d)
         Git : git version 2.39.5 (Apple Git-154)
Ruby lib dir : /Users/magic/.rbenv/versions/3.2.5/lib
Repositories : master - git - git@github.com:CocoaPods/Specs.git @ 3c25b942607c8dc669d5d708aeafaa9067522375

               trunk - CDN - https://cdn.cocoapods.org/
```

### Plugins

```
cocoapods-deintegrate : 1.0.5
cocoapods-plugins     : 1.0.0
cocoapods-search      : 1.0.1
cocoapods-trunk       : 1.6.0
cocoapods-try         : 1.2.0
```

### Podfile

```ruby
platform :ios, '11.0'  # Specify the platform and deployment target

target 'bmob202407' do
  pod 'BmobSDK'
end
```

### Error

```
RuntimeError - `PBXGroup` attempted to initialize an object with unknown ISA `PBXFileSystemSynchronizedRootGroup` from attributes: `{"isa"=>"PBXFileSystemSynchronizedRootGroup", "exceptions"=>["3036C49C2CC74D2A00E71FAF"], "path"=>"bmob202407", "sourceTree"=>"<group>"}`
If this ISA was generated by Xcode please file an issue: https://github.com/CocoaPods/Xcodeproj/issues/new
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:359:in `rescue in object_with_uuid'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:349:in `object_with_uuid'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:300:in `block (2 levels) in configure_with_plist'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:299:in `each'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:299:in `block in configure_with_plist'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:296:in `each'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:296:in `configure_with_plist'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project.rb:272:in `new_from_plist'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:350:in `object_with_uuid'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:290:in `block in configure_with_plist'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:287:in `each'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project/object.rb:287:in `configure_with_plist'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project.rb:272:in `new_from_plist'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project.rb:213:in `initialize_from_file'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/xcodeproj-1.25.1/lib/xcodeproj/project.rb:113:in `open'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:1194:in `block (2 levels) in inspect_targets_to_integrate'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:1193:in `each'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:1193:in `block in inspect_targets_to_integrate'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/user_interface.rb:64:in `section'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:1188:in `inspect_targets_to_integrate'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:107:in `analyze'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:422:in `analyze'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:244:in `block in resolve_dependencies'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/user_interface.rb:64:in `section'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:243:in `resolve_dependencies'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:162:in `install!'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/command/install.rb:52:in `run'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/claide-1.1.0/lib/claide/command.rb:334:in `run'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/lib/cocoapods/command.rb:52:in `run'
/Users/magic/.rbenv/versions/3.2.5/lib/ruby/gems/3.2.0/gems/cocoapods-1.15.2/bin/pod:55:in `<top (required)>'
/Users/magic/.rbenv/versions/3.2.5/bin/pod:25:in `load'
/Users/magic/.rbenv/versions/3.2.5/bin/pod:25:in `<main>'
```

――― TEMPLATE END ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

[!] Oh no, an error occurred.

Search for existing GitHub issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=%60PBXGroup%60+attempted+to+initialize+an+object+with+unknown+ISA+%60PBXFileSystemSynchronizedRootGroup%60+from+attributes%3A+%60%7B%22isa%22%3D%3E%22PBXFileSystemSynchronizedRootGroup%22%2C+%22exceptions%22%3D%3E%5B%223036C49C2CC74D2A00E71FAF%22%5D%2C+%22path%22%3D%3E%22bmob202407%22%2C+%22sourceTree%22%3D%3E%22%3Cgroup%3E%22%7D%60%0AIf+this+ISA+was+generated+by+Xcode+please+file+an+issue%3A+https%3A%2F%2Fgithub.com%2FCocoaPods%2FXcodeproj%2Fissues%2Fnew&type=Issues

If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new

Be sure to first read the contributing guide for details on how to properly submit a ticket:
https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md

Don't forget to anonymize any private data!

Looking for related issues on cocoapods/cocoapods...
Searching for inspections failed: undefined method `map' for nil:NilClass

这个错误,你把项目转为组即可解决

1.打开你的 Xcode 项目。
2.在左侧的项目导航器中,右键点击项目文件夹(通常是项目名称)。
3.选择“Convert to Group”(转换为组)。

Xnip2024-10-23_09-50-08.jpg

继续pod install

Don't forget to anonymize any private data!

Looking for related issues on cocoapods/cocoapods...
 - Cocoapods not working in Xcode 16 macOS 15.0.1
   https://github.com/CocoaPods/CocoaPods/issues/12625 [open] [12 comments]
   a day ago

 - PBXFileSystemSynchronizedRootGroup causing pod init to fail with CocoaPods 1.15.2a
   https://github.com/CocoaPods/CocoaPods/issues/12627 [closed] [7 comments]
   a week ago

 - pod install has bug
   https://github.com/CocoaPods/CocoaPods/issues/10723 [closed] [33 comments]
   11 Jun 2024

and 2 more at:
https://github.com/cocoapods/cocoapods/search?q=%5BXcodeproj%5D%20Unable%20to%20find%20compatibility%20version%20string%20for%20object%20version%20%6077%60.&type=Issues&utf8=✓

[!] [!] Xcodeproj doesn't know about the following attributes {"preferredProjectObjectVersion"=>"77"} for the 'PBXProject' isa.
If this attribute was generated by Xcode please file an issue: https://github.com/CocoaPods/Xcodeproj/issues/new

[!] [Xcodeproj] Xcode project version (77) is higher than the latest supported by xcodeproj (63).

错误已经发生改变, 提示我们本地Xcode版本77太高, pod最新版本最高支持63

1.找到并打开 `project.pbxproj` 文件,使用文本编辑器(如 sublime之类)。
    2.删除以下两行:
        minimizedProjectReferenceProxies = 1;
        preferredProjectObjectVersion = 77;
    3.更新以下行:
        objectVersion = 77; 
      修改为:
        objectVersion = 63;

提示安装成功

>bmob202407 pod install
Analyzing dependencies
Downloading dependencies
Installing BmobSDK (2.4.21)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `bmob202407.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

安装之后,真机可以,模拟器不行,提示

building for ios simulator but linking in object file built for ios m1

Xnip2024-10-23_10-58-31.jpg

这样设置即可解决,有更多问题也可以留言给我