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の運営にも貢献できるのでよろしくお願います。