| XML Parser (ESP32/Arduino) 2023.09.01
 
   YouTube でも紹介しています。画像をクリックすると再生できます。
 
 RSS(Rich Site Summary)はXMLで記述され、ニュースやブログなどのヘッドライン情報(タイトルや概要など)を配信するための文書フォーマットの総称です。 
それらの更新情報を配信するためのテキストデータは、RSS feed と呼ばれます。
 
 ここで、
  RSS一覧 - Yahoo!ニュース
をみてみます。 
 
  トピックス内「国内」リンク先
 https://news.yahoo.co.jp/rss/topics/domestic.xml
 のXML形式ファイルは下記のような構文になってます。
 
 domestic.xml
 
 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rss version="2.0">
  <channel>
    <language>ja</language>
    <copyright>© Yahoo Japan</copyright>
    <pubDate>Thu, 31 Aug 2023 04:12:54 GMT</pubDate>
    <title>Yahoo!ニュース・トピックス - 国内</title>
    <link>https://news.yahoo.co.jp/topics/domestic?source=rss</link>
    <description>Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。</description>
    <item>
      <title>岸田首相 北発射「容認できない」</title>
      <link>https://news.yahoo.co.jp/pickup/6473916?source=rss</link>
      <pubDate>Thu, 31 Aug 2023 02:25:06 GMT</pubDate>
      <comments>https://news.yahoo.co.jp/articles/6a1d41b85a08e95f58e0b032834d66df07b801ae/comments</comments>
    </item>
    <item>
      <title>概算要求114兆円程度 過去最大に</title>
      <link>https://news.yahoo.co.jp/pickup/6473904?source=rss</link>
      <pubDate>Thu, 31 Aug 2023 00:22:10 GMT</pubDate>
      <comments>https://news.yahoo.co.jp/articles/827e6eddd96695056e00ab75c7509100ad61b39e/comments</comments>
    </item>
    <item>
      <title>コロナ高額薬、一部自己負担へ</title>
      <link>https://news.yahoo.co.jp/pickup/6473900?source=rss</link>
      <pubDate>Wed, 30 Aug 2023 23:57:50 GMT</pubDate>
      <comments>https://news.yahoo.co.jp/articles/9b1d4dffabcdd8396b4d8a7d4e5d19b6ac931504/comments</comments>
    </item>
    <item>
      <title>関東大震災から6年後 東京の様子</title>
      <link>https://news.yahoo.co.jp/pickup/6473925?source=rss</link>
      <pubDate>Thu, 31 Aug 2023 03:24:43 GMT</pubDate>
    </item>
    <item>
      <title>台風が沖縄接近 西日本は大雨恐れ</title>
      <link>https://news.yahoo.co.jp/pickup/6473896?source=rss</link>
      <pubDate>Wed, 30 Aug 2023 23:02:24 GMT</pubDate>
      <comments>https://news.yahoo.co.jp/articles/cc13b07e0f831896fa4e5297fe4065eaf27f6cab/comments</comments>
    </item>
    <item>
      <title>最高検 供述誘導疑惑で検事聴取へ</title>
      <link>https://news.yahoo.co.jp/pickup/6473895?source=rss</link>
      <pubDate>Wed, 30 Aug 2023 22:55:50 GMT</pubDate>
      <comments>https://news.yahoo.co.jp/articles/e39755ec949dba00d9e065ec8071ad7a673cf077/comments</comments>
    </item>
    <item>
      <title>王座戦始まる 藤井竜王が八冠挑む</title>
      <link>https://news.yahoo.co.jp/pickup/6473912?source=rss</link>
      <pubDate>Thu, 31 Aug 2023 01:27:33 GMT</pubDate>
      <comments>https://news.yahoo.co.jp/articles/900e08b5363a775b109b2bccfb59f2a93508b437/comments</comments>
    </item>
    <item>
      <title>三浦雄一郎さん90歳 富士山頂到達</title>
      <link>https://news.yahoo.co.jp/pickup/6473899?source=rss</link>
      <pubDate>Wed, 30 Aug 2023 23:19:01 GMT</pubDate>
      <comments>https://news.yahoo.co.jp/articles/dec60f4b0f69d9f4634b71cf6f8f4e46151b7e81/comments</comments>
    </item>
  </channel>
</rss>
 このXML構文を解析して、任意のXMLタグの内容を抽出するツールがXML Parser です。
 上記の RSS feed は、Chromeブラウザの機能を使えば容易に取得できますが、このRSS feed のURLはhttpsによるSSL暗号化通信です。
Arduino言語によりfeedをダウンロードするには認証情報が必要なので、まずは証明書を取得しましょう。
 
 今回は、Yahoo!ニュース の認証情報を取得します。
 
  サイトURLの左側の鍵マークをクリック、セレクトボックスから「この接続は保護されています」を選びます。
 
 
  「証明書は有効です」をクリックします。
 
 
  証明書ビューア内の「詳細(D)」タブをクリック、「エクスポート」ボタンを押します。
 このビューア内の「証明書」→「有効期限」→「終了時刻」で証明書の有効期限を確認できます。
 
 
  ファイルの種類(T)で、「Base64エンコードASCII形式の証明書チェーン(*.pem;*.crt)」を選択します。
 
 edge01.yahoo.co.jp.crt
 
  この証明書チェーンの各ブロックは下記のように構成されています。
 認証には3番目ブロックのroot証明書を使います。
 
 —–BEGIN CERTIFICATE—–
 発行されたサーバー証明書ファイルの記述内容
 —–END CERTIFICATE—–
 —–BEGIN CERTIFICATE—–
 中間証明書ファイルの記述内容
 —–END CERTIFICATE—–
 —–BEGIN CERTIFICATE—–
 root 証明書ファイルの記述内容
 —–END CERTIFICATE—–
 
 1番下のブロック、root証明書を使用します(後述)。
 
 
  SSLサーバ証明書のインストールに必要な .PEMファイルを作る 
 ●Adafruit QT Py ESP32-S2 WiFi Dev Board with STEMMA QT
 
  ・ESP32-S2 240MHz ・4 MB Flash & 2 MB PSRAM
 ・2.4 GHz Wi-Fi (SoC)
 ・Two I2C ports
 ・Hardware UART
 ・Hardware SPI
 ・Hardware I2S on any pins
 ・3.3V regulator with 600mA peak output
 
  Adafruit QT Py ESP32-S2 
 ●Qt Py ESP32-S2 Pinout
 
 
 
  右側に写っているのが、Raspberry Pi Zero 2 W + 拡張ボード、Qt Py ESP32-S2 です。 Raspberry Pi はノートパソコンから Telnet で操作しています。
 
 ●プログラム概要
 ニュースサイトからRSS feed を取得し、ヘッドライン情報(タイトルとリンク)を抽出します。
 
 ソースコードのビルドには、PlatformIOを使用しています。
 
  Arduino開発環境構築 PlatformIO 
 XML構文解析ライブラリには、NunniMCAXを使用しました。
 
  
  NunniMCAX 解凍してソースディレクトリに配置します。
 
 NunniMCAX を使ったサンプルコードが掲載されているサイトです。
 
  
  ArduinoでXMLを解析する 
 ESP32 での https の使い方を解説しているサイトです。
 
  
  ESP32からWiFiClientSecureをつかってHTTPS GETをする方法をちょっと理解した 
 $ mkdir -p ~/XMLParser
 $ cd ~/XMLParser
 $ pio init -b adafruit_qtpy_esp32s2
 $ vi src/datalink.h
 
 
#define SECRET_SSID "xxxxxxxxxxxx"
#define SECRET_PASS "xxxxxxxxxxxxx"
const char* yahoo_co_jp_crt = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIDdzCCAl+gAwBADANBgkqhkiG9w0BAQsFADBdMQswCQQGEwJKUDEl" \
"MCMGA1UEChMcU0gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjUGA1UECxMe" \
"U2VjdXJpdHkgQ2uaWNhdGlvbiBSb290Q0EyMB4XDTA5MDA1MDAzOVoX" \
                        ~~~~~~~~~
"t/2jioSgrGK+PBqAbubKVY8/gA3zyNs8U6qtnRGEmyV7JqR50S+kDFy" \
"1UkC9gLl9B/ran/7Ir5mUf/NVoCqgTLiluHcSmRvaS9mvVXIwAHIRc/" \
"SjnRBUkLp7Y3KozXoEofKd9J+sAro03" \
"-----END CERTIFICATE-----";
複数行の root証明書 をC言語構文に従い、文字列配列として定義します。
この際、証明書ヘッダーの最後に改行コードを付加します。
 $ vi src/XMLParser.ino
 
 
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <NunniMCAX.h>
#include <datalink.h>
WiFiClientSecure https_client;
#define MAXLEN 256
static char m_characters[MAXLEN];
struct NunniMCAXContentHandler handler;
bool RootDetected = false;
void setup()
{
	Serial1.begin(115200);
	Serial1.println();
	Serial1.print("Connecting to ");
	Serial1.println(SECRET_SSID);
	WiFi.begin(SECRET_SSID, SECRET_PASS);
	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial1.print(".");
	}
	Serial1.println("");
	Serial1.println("WiFi connected");
	Serial1.print("IP address: ");
	Serial1.println(WiFi.localIP());
	// set up the paser handler functions
	handler.startDocument = startDocument;
	handler.startElement = startElement;
	handler.characters = characters;
	handler.endElement = endElement;
	handler.endDocument = endDocument;
	getRSS();
}
void getRSS()
{
	char get_cmd[256];
	unsigned long timeout = millis();
	// https://news.yahoo.co.jp/rss/topics/domestic.xml
	const char* host   = "news.yahoo.co.jp";
	const char* page   = "/rss/topics/domestic.xml";
	int port           = 443; // This should not be changed
	https_client.setCACert(yahoo_co_jp_crt);
	if (https_client.connect(host, port)) {
		sprintf(get_cmd, "GET https://%s%s HTTP/1.1\r\nHost: %s\r\nUser-Agent: BuildFailureDetectorESP32\r\nConnection: close\r\n\r\n\0", host, page, host);
		https_client.print(get_cmd);
		https_client.flush();
		while(https_client.available() == 0){
			if(millis() - timeout > 5000){
				Serial1.println(">>> Client Timeout !");
				https_client.stop();
				return;
			}
		}
	} else {
		Serial1.println("##https connection failed");
		delay(5000);
		return;
	}
	// パーサーの呼び出し 
	NunniMCAXparse( &getcFunc, &handler );
	https_client.stop();
	RootDetected = false;
	delay(5000);
	return;
}
int getcFunc()
{
	while(!RootDetected) {
		if (getChar() == '<') {
			RootDetected = true;
			return '<';
		}
	}
	return getChar();
}
int getChar()
{
	if (https_client.available() ) return https_client.read();
	if (!https_client.connected()) return EOF;
}
int startDocument(void) 
{
	return 0;
}
int startElement( const char *tagname, struct NunniHashtable *args ) 
{
	const int size = NunniHashtableSize( args );
	char ** keys;
	int i, ret;
	const char *name, *value;
	keys = (char**)calloc( size, sizeof( char * ) );
	ret = NunniHashtableKeys( args, keys );
	for ( i = 0; i < size; ++i ) {
		name = keys[i];
		value = NunniHashtableGet( args, name );
//		Serial1.print("  attrName: ");
//		Serial1.print(name);
//		Serial1.print("   attrValue: ");
//		Serial1.print(value);
	}
	memset( m_characters, 0, MAXLEN );
	free(keys);
	return 0;
}
int characters( char ch[], int start, int length ) 
{
	int i = strlen( m_characters );
	if ( i == MAXLEN ) return -1;
	strncat( m_characters, &(ch[start]), length );
	return 0;
}
int endElement( const char *tagname ) 
{
	int len;
	char *data = m_characters;
	while( isspace( *data ) ) {
		++data;
	}
	len = strlen( data );
	while( isspace( data[--len] ) ) {
		data[len] = 0;
	}
	if ( data != NULL && strncmp( data, "", 1 ) ) {
		if ( (strncmp(tagname,"title",5)==0) || (strncmp(tagname,"link",4)==0) ) {
			Serial1.println(data);
		}
	}
	memset( m_characters, 0, MAXLEN );
	return 0;
}
int endDocument(void) 
{
	return 0;
}
void loop() {}
 $ pio run -t upload
 
 デバイスモニターを起動して、プログラムを実行します。
 $ pio device monitor -p /dev/ttyAMA0 -b 115200
 
 Connecting to xxxxxxxxxxxx
 .
 WiFi connected
 IP address: 192.168.13.56
 Yahoo!ニュース・トピックス - 国内
 https://news.yahoo.co.jp/topics/domestic?source=rss
 岸田首相 北発射「容認できない」
 https://news.yahoo.co.jp/pickup/6473916?source=rss
 概算要求114兆円程度 過去最大に
 https://news.yahoo.co.jp/pickup/6473904?source=rss
 コロナ高額薬、一部自己負担へ
 https://news.yahoo.co.jp/pickup/6473900?source=rss
 関東大震災から6年後 東京の様子
 https://news.yahoo.co.jp/pickup/6473925?source=rss
 台風が沖縄接近 西日本は大雨恐れ
 https://news.yahoo.co.jp/pickup/6473896?source=rss
 最高検 供述誘導疑惑で検事聴取へ
 https://news.yahoo.co.jp/pickup/6473895?source=rss
 王座戦始まる 藤井竜王が八冠挑む
 https://news.yahoo.co.jp/pickup/6473912?source=rss
 三浦雄一郎さん90歳 富士山頂到達
 https://news.yahoo.co.jp/pickup/6473899?source=rss
 
 
 
 |  Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。 
				
 
    Arduinoで学ぶ組込みシステム入門(第2版) ●Arduinoを使って組込みシステム開発を理解する
 ・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
 
 
    最新 使える! MATLAB 第3版 ◆◆すぐに「使える!」 全ページフルカラー!◆◆
 ・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
 
 
    Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版 1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
 
 
    C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著 学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
 
 
    1冊ですべて身につくJavaScript入門講座 ・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
 
 
    図解! Git & GitHubのツボとコツがゼッタイにわかる本 ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
 
 
    C自作の鉄則!2023 (日経BPパソコンベストムック) メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
 
 
    Interface 2023年6月号 特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
 
 
    日経Linux 2023年5月号 【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
 
 
    ラズパイマガジン2022年秋号 特集:5大人気ボード 電子工作超入門
 「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
 
 
    地方で稼ぐ! ITエンジニアのすすめ 学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
 
 
    Raspberry Piのはじめ方2022 本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
 
 
    ハッカーの学校 IoTハッキングの教科書 生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
 
 
    攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング 本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
 
 
    ポチらせる文章術 販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
 
 
    プログラマーは世界をどう見ているのか 西村博之著 イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
 
 
    ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア 「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
 
 
    Newtonライト2.0 ベイズ統計 ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
 
 
    白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81 
 
 
    無水エタノールP 500mlx2個パック(掃除) 
 
 
    ケイバ(KEIBA) マイクロニッパー MN-A04 
 
 
    サンハヤト SAD-101 ニューブレッドボード 
 
 
    白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02 
 
 
    [Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠 
 
 |