見出し画像

ESP32でTWSNMPのセンサー開発2日目:Wifi APのセンサーはできたが、Bluetoothのセンサーはプログラムのサイズ問題に悩まされる

今朝は2時から助手の猫さんが騒いでいました。ご飯をあげた後も、何か言いに来ていましたが無視して寝ていました。次は4時に起こしにきました。そこで起きて4時から開発開始です。

ESP32をTWSNMPのセンサーにする開発の続きです。Wifiのアクセスポイントを探すセンサーはなんとかできました。

を参考にして、

#include <map>
#include <WiFi.h>
#include <WiFiUdp.h>
#include <time.h>
#include "AsyncUDP.h"
#include "NTPClient.h"
#include "WifiAPInfo.h"

#define PIN_LED 2
#define SYSLOG_PORT 8514

const char *ssid_AP = "xxxx";
const char *password_AP = "xxxx";
const IPAddress dst = IPAddress(192, 168, 1, 250);


WiFiUDP udp;
NTPClient ntp(udp, "ntp.nict.jp", 32400, 60000);

AsyncUDP syslog;
WiFiClass wifi;

std::map<String, std::unique_ptr<WifiAPInfo>> wifiApInfoMap;

// タイムスタンプを取得する
String getTimeStamp() {
  char ts[128];
  time_t t;
  struct tm *tm;
  t = ntp.getEpochTime();
  tm = localtime(&t);
  strftime(ts, sizeof(ts), "%FT%X+09:00", tm);
  return String(ts);
}


int count = 0;

void setup() {
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);
  delay(2000);
  Serial.println("Setup start2");
  wifi.mode(WIFI_STA);
  wifi.setAutoConnect(false);
  wifi.begin(ssid_AP, password_AP);
  Serial.println(String("Connecting to ") + ssid_AP);
  delay(3000);
  int n = 0;
  while (wifi.status() != WL_CONNECTED) {
    digitalWrite(PIN_LED, n % 2 == 0 ? HIGH : LOW);
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected, IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Setup End");
  ntp.begin();
}

// Wifi APの情報を送信
void sendWifiAPInfo() {
  int16_t scan_res = wifi.scanNetworks();
  if (scan_res == 0)
    Serial.println("no wifi ap");
  else {
    // 発見したwifiAPを表示
    Serial.print(scan_res);
    Serial.println(" wifi aps。");
    for (int i = 0; i < scan_res; ++i) {
      AsyncUDPMessage msg;
      String bssid = wifi.BSSIDstr(i);
      String ssid = wifi.SSID(i);
      int32_t rssi = wifi.RSSI(i);
      int32_t channel = wifi.channel(i);
      auto e = wifiApInfoMap.find(bssid);
      if (e != wifiApInfoMap.end()) {
        WifiAPInfo *p = e->second.get();
        p->update(ssid, rssi, channel, ntp.getEpochTime());
      } else {
        wifiApInfoMap[bssid] = std::unique_ptr<WifiAPInfo>(new WifiAPInfo(bssid, ssid, rssi, channel, ntp.getEpochTime()));
      }
      e = wifiApInfoMap.find(bssid);
      WifiAPInfo *p = e->second.get();
      msg.printf("<%d>%s %s twWifiScan: %s", 21 * 8 + 6, getTimeStamp().c_str(), WiFi.localIP().toString().c_str(), p->get().c_str());
      syslog.sendTo(msg, dst, SYSLOG_PORT);
      Serial.print(i + 1);
      Serial.print(":");
      Serial.println(p->get());
    }
  }
}

void loop() {
  ntp.update();
  if (count % 60 == 0) {
    sendWifiAPInfo();
  }
  digitalWrite(PIN_LED, count % 2 == 0 ? HIGH : LOW);
  delay(1000);
  count++;
}

のような感じです。
最初ログが文字化けしていました。

msg.printfの"%s"にStringクラスを渡していたのが原因でした。c_str()でchar *の文字列にしないといけないようです。

のお世話になりました。
シン・TWSNMPでsyslogを受信すると

のような感じです。

Bluetoothのセンサー

も作れそうと思って、

を参考に作ってみると、プログラムのサイズ問題で止まってしまいました。
書いてあるパテーションを変える方法がうまくいかなかったので、別の方法を検討中です。FLASHメモリが4MBではなく8MBか16MBのボードを買うのがよいのかもしれないと思っています。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。