Re: note

技術的な知見やポエムなど役に立たない情報を書き連ねる場所

mbedでTCP通信する

f:id:hik0leaf:20190614172133j:plain mbed LPC1768ではチップにEthernet物理層(PHY)を内蔵しているため、LANコネクタ(RJ45)を追加するだけでEthernetを使った通信を行うことができます。ここではmbedを使って実際にTCP通信を行ってみます。

1. 準備

以下の部品を用意します。

mbed LPC1768

f:id:hik0leaf:20190614172310j:plain

LANコネクタDIP化キット

秋月電子で購入することができます。

LANコネクタDIP化キット: パーツ一般 秋月電子通商-電子部品・ネット通販

f:id:hik0leaf:20190614172402j:plain
LANコネクタDIP化キット

2. 接続

mbedとLANコネクタDIP化キットを以下のように接続します。

f:id:hik0leaf:20190614172648j:plain
接続図

MBED LANコネクタDIP化キット
RD- pin 6
RD+ pin 3
TD- pin 2
TD+ pin 1

3. コード(mbed側)

mbedの公式handbookのページからSocket通信するためのコードとライブラリをインポートします。

Socket - Handbook | Mbed

[Import program]ボタンを押すとmbedコンパイラが開いてコードとライブラリをインポートすることができます。 f:id:hik0leaf:20190614230002j:plain

インポート画面でImport AsがProgramにチェックがはいっていることと、Update all libraries to the latest versionにチェックが入っていないこと( NOT CHECKED )を確認してインポートします。Import Nameは任意の値で構いません。

f:id:hik0leaf:20190614174433j:plain
Import Program

【重要】ライブラリのアップデートは正常動作しなくなるためおすすめしません。

インポートしたらそのままコードを使用しても構いませんが、もう少し動作がわかりやすいように以下のコードを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サーバが機能していることを確認してください。正常に動作していればシリアル通信で以下のようにログを確認することができます。

f:id:hik0leaf:20190614180709p:plain

6. 参考リンク