見出し画像

ESP32でTWSNMPのセンサー開発4日目:C++の文字列の型が沢山あって混乱した

今朝は3時に、助手の猫さんが起こしてくれました。なんだか昨日から猫さんは調子が悪いようです。

Blunetoothのセンサーの開発の続きです。少しづつArduino IDEとC++に慣れてきたので少し難しい処理も書けるようになってきましたが、C++の文字列の型が沢山あって混乱しながら作っています。GO言語だとstringだけでほとんど何も考えないで書けますが、ESP32の開発をArudino IDE とC++で行うと文字列だけで、char* ,String,std::stringの3種類でてきます。char*はC言語の低レベルの文字列、std::stringはC++の標準、Stringは、Arudino IDE特有の文字列クラスのようです。ライブラリごとにStringとstd::stringが使われているので、混ぜて使わざるおえないのですが、単純に代入すると、コンパイラにいろいろ怒られてしまいます。これだからC++が好きになれないです。

コンパイルエラーを地道に修正する作業を繰り返してなんとか動作するようになりました。
2年半前にGO言語版を作った時には

のように考えていました。その時、Bluetoothデバイスのベンダーコードを

からダウンロードしていました。この時はCSVがあったようですが、今はyamlだけになっているようです。

このデータを

package main

import (
	"fmt"
	"os"
	"strings"
)

func main() {
	b, err := os.ReadFile("../company_identifiers.yaml")
	if err != nil {
		panic(err)
	}
	code := ""
	a := strings.Split(string(b), "\n")
	for _, l := range a {
		l = strings.TrimSpace(l)
		if strings.HasPrefix(l, "- value:") {
			code = strings.Replace(l, "- value:", "", 1)
		} else if strings.HasPrefix(l, "name: '") {
			name := strings.Replace(l, "name: ", "", 1)
			name = strings.ReplaceAll(name, "'", `"`)
			fmt.Printf("{%s,%s},\n", code, name)
		}
	}
}

で変換して組み込んでみましたが、データ量が多すぎてプログラムが異常終了するようになってしまいました。とりあえず、家にあるものだけ

std::map<int16_t, const char *> codeToVendor = {
  { 0x004C,"Apple, Inc."},
  { 0x0969,"Woan Technology (Shenzhen) Co., Ltd."},
  { 0x0059,"Nordic Semiconductor ASA"},
  { 0x02D5,"OMRON Corporation"},
  { 0x012D,"Sony Corporation"},
  { 0x0171,"Amazon.com Services LLC"},
  { 0x009E,"Bose Corporation"},
  { 0x0006,"Microsoft"},


};

のように組み込むと動きました。

明日に続く


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