DIY マイコン、データを「盗む」方法をエレガントに!#
背景#
最近、個人プロジェクトのために、ネットワーク接続が許可されていないホスト内のデータベースのデータをリモートサーバーに送信する必要がありました。ホストがネットワークに接続できないので、マイコンを中間者として使用して、データをシリアルポートでマイコンに送信し、ネットワークに接続されたマイコンからデータをサーバーに送信することにしました。これで「データの盗み」を完璧に実現できます!やるぞ!
ホストデータの取得#
データをマイコンに送信するためには、まずデータを取得する必要があります。ホストがオフラインで最高の権限を持っているため、Python 環境をインストールしました(これにより、データを分析し、異常値と有効なデータを区別して送信することができます)。データの取得には pyserial と pymssql を使用しました。詳細なコードは省略しますが、途中で遭遇した問題について説明します。
最初は、Python プログラムに終了記号が設定されていなかったため、テスト時にマイコンがデータの終了位置を特定できず、リモートサーバーに送信されるデータが途切れ途切れになってしまいました。しかし、メインプログラムに終了記号を追加することで、この問題を完璧に解決しました。
import serial
import json
import pymssql
def get_data():
"""
"""
return(data)
# 終了記号の送信を追加
def deliver_data():
myChar='#'
# 対応するシリアルポート番号と通信ボーレートを設定
ser = serial.Serial(port="COM4", baudrate=115200)
# JSON形式に変換して送信
data=get_data()
comdata=json.dumps(data)
write_len = ser.write(comdata.encode())
ser.write(myChar.encode())
print("シリアルポートから{}バイト送信しました。".format(write_len))
ser.close()
def main():
deliver_data()
print('転送完了')
if __name__=='__main__':
main()
ちなみに、ホストがネットワークに接続できず、Windows 7 オペレーティングシステムであるため、Python 環境の設定も非常に困難でした!さまざまな問題を乗り越えた後、データをキャプチャするスクリプトを正常に実行できたとき、私の目は涙で濡れました。
マイコンプログラムの作成#
ESP8266 は Arduino フレームワークを使用して非常に簡単に開発できるため、私たち初心者のハードルが大幅に低くなりました。「arduino (2)-- 通过 ESP8266 模块实现串口接收数据,使用 TCP 协议进行局域网通信」という記事を参考に、少し変更を加えることで、シリアルポートからデータを読み取り、送信することができました。
#include "ESP8266WiFi.h"
#define led 2
const char *ssid = "Wi-Fi名";
const char *password = "Wi-Fiパスワード";
const char *host = "サーバーアドレス";
WiFiClient client;
const int tcpPort = サーバーポート;
static String comdata = "";
char myChar='#';
void setup()
{
Serial.begin(115200);
pinMode(led,OUTPUT);
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);//開始
//ここで目標ネットワークに正常に接続しているかどうかをチェックし、接続されていない場合はブロックする。
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
//いくつかのヒント
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop()
{
/******************シリアルポートからデータを受信************************/
while (Serial.available() > 0 ) // シリアルポートで受信した文字数が0より大きい場合。
{
comdata = Serial.readStringUntil(myChar);
}
/******************シリアルポートにデータを出力************************/
if(comdata!="")//データを受信した場合
{
client.print(comdata);//サーバーにデータを送信
}
comdata="";//データをクリア
if (client.connected()) //目標アドレスにアクセスしようとすると、LEDが消える。このようなことは控えめにしましょう。
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
while (!client.connected())//サーバーに接続されていない場合、クライアントが接続を試みます。
{
if (!client.connect(host, tcpPort))//実際には、ここでサーバーに接続しています。接続に成功した場合、この関数はtrueを返します。
{
Serial.println("接続中....");
delay(500);
}
}
}
ここまでくれば、すべてのプロセスが完全に動作しており、「データの盗み」も成功しています。ただし、ホストの後ろにデータケーブルを接続し、データケーブルを大きな NodeMCU 開発ボードに接続するのは非常に優雅ではありません!受け入れられません!
淘宝でよりシンプルなソリューションを探してみましょう。USB から TTL 通信ボード + ESP-01s だけでこの問題を解決できるようです。さっそく購入して元のソリューションを置き換えました。
しかし、想像していたほどうまくいかず、通信が不安定な問題がありました。ホストのデータがマイコンに正しく送信されませんでした。そのため、別の 2 台のホストで実験してみましたが、1 台は正常に通信でき、もう 1 台は常に失敗しました。一方、古いソリューションは非常に安定しており、データの送信に成功しています。初めは新しいソリューションの電源が不安定なためかと思いましたが、続行の検証は行っていません。もし詳しい方がいらっしゃれば、教えていただけると幸いです。
DIY マイコン#
既存のソリューションが要件を満たさない場合、私たちにはもう 1 つの選択肢しかありません!自分で小さくてエレガントで性能の安定したマイコンを作ることです。私のような初心者は直接取り組むことは不可能ですので、オープンソースハードウェアプラットフォームを見て、すでに類似のプロジェクトを行った大先輩がいないか確認してみましょう。それを参考にして、自分で作ってしまえばいいのです!
usb-esp8266 - 嘉立创 EDA 开源硬件平台 (oshwhub.com)
moguiliue さんがオープンソースで公開してくれたプロジェクトに感謝します。基板を作成し、作業開始!
大先輩のソリューションは本当に素晴らしいです!完成品は安定して動作し、私の要件を完璧に満たしています。ただし、プロセス中に気づいたことがあります。元の設計では、USB コネクタの位置が干渉する可能性があります(購入した部品が間違っているのかもしれません🤦)。各基板セットで干渉する部分をやすりで削り、USB コネクタをはんだ付けする必要があります。少し手間がかかります。
また、このソリューションは基本的なデータ通信にしか対応しておらず、他の GPIO ピンを引き出していないため、センサーやディスプレイなどを接続することができません。優雅ではありますが、遊び心がないですね。どうしましょう?
DIY マイコン 2.0#
優雅でありながらも拡張性があるソリューションを求めるなら、大先輩のアイデアを参考にして、自分で最初から設計し直すのはどうでしょう!
自分で設計した開発ボードでは、CH340G の代わりに CH340C を使用し、周辺のクリスタル発振回路のスペースを節約し、I2C 通信に引き出すための 4 ピンメスコネクタを追加しました。元の設計の配線とレイアウトを変更するのは難しいため、全体を再構築するしかありませんでした。現在、基板は作成済みですが、まだ製作は行っていません。材料が届いたら、自分で最初から設計したマイコンが正常に動作することを願っています!
2023/4/23 更新:#
今日、自分で設計したマイコンを作りました。すべてが正常に動作し、うれしいです〜