mbedでTCP通信する
mbed LPC1768ではチップにEthernetの物理層(PHY)を内蔵しているため、LANコネクタ(RJ45)を追加するだけでEthernetを使った通信を行うことができます。ここではmbedを使って実際にTCP通信を行ってみます。
1. 準備
以下の部品を用意します。
mbed LPC1768
LANコネクタDIP化キット
秋月電子で購入することができます。
LANコネクタDIP化キット: パーツ一般 秋月電子通商-電子部品・ネット通販
2. 接続
mbedとLANコネクタDIP化キットを以下のように接続します。
MBED | LANコネクタDIP化キット |
---|---|
RD- | pin 6 |
RD+ | pin 3 |
TD- | pin 2 |
TD+ | pin 1 |
3. コード(mbed側)
mbedの公式handbookのページからSocket通信するためのコードとライブラリをインポートします。
[Import program]ボタンを押すとmbedコンパイラが開いてコードとライブラリをインポートすることができます。
インポート画面でImport AsがProgramにチェックがはいっていることと、Update all libraries to the latest versionにチェックが入っていないこと( NOT CHECKED )を確認してインポートします。Import Nameは任意の値で構いません。
【重要】ライブラリのアップデートは正常動作しなくなるためおすすめしません。
インポートしたらそのままコードを使用しても構いませんが、もう少し動作がわかりやすいように以下のコードをmbedに書き込みます。今回mbedはクライアントで動作します。
#include "mbed.h" #include "EthernetInterface.h" const char* ECHO_SERVER_ADDRESS = "10.0.1.7"; const int ECHO_SERVER_PORT = 3000; int main() { printf("starting...\n"); EthernetInterface eth; eth.init(); // Use DHCP eth.connect(); printf("Client IP Address is %s\n", eth.getIPAddress()); // Connect to Server TCPSocketConnection socket; while (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT) < 0) { printf("Unable to connect to (%s) on port (%d)\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT); wait(1); } printf("Connected to Server at %s\n",ECHO_SERVER_ADDRESS); // Send message to server char hello[] = "Hello World"; printf("Sending message to Server : '%s' \n",hello); socket.send_all(hello, sizeof(hello) - 1); // Receive message from server while (1) { char buf[256]; int n = socket.receive(buf, 256); if (n > 0) { buf[n] = '\0'; printf("Received message from server: '%s'\n", buf); } } // Clean up socket.close(); eth.disconnect();
内容は起動したら"Hello World"メッセージをサーバに送り、その後はサーバからのメッセージ受け続けます。
4. コード(サーバ側:PC)
PC側にサーバを用意します。TCPサーバが立てられれば何でも構いませんが、今回はnode.jsを使いました。
server.js
const net = require('net'); var count = 0; const server = net.createServer(socket => { socket.on('data', data => { console.log(data + ' from ' + socket.remoteAddress + ':' + socket.remotePort); setInterval(() => { count++; console.log(count) socket.write(String(count)); }, 500); }); socket.on('close', () => { console.log('client closed connection'); }); }).listen(3000); console.log('listening on port 3000');
内容は500msec毎に数値をカウントアップしてmbed(クライアント)に送信しています。
以下のコマンドで上記のサーバ側のコードを実行することができます。
$ npm init $ npm install net $ node server.js
5. 実行
LANコネクタにLANケーブルを接続し、mbedもシリアル通信でログを確認します。mbedはDHCPでネットワーク設定を取得するため、ルーターはDHCPサーバが機能していることを確認してください。正常に動作していればシリアル通信で以下のようにログを確認することができます。