panda's tech note

Advent Calendar 2020: ソフトウェア無線

注意LimeSDR などのソフトウェア無線は技術基準適合証明(通称,技適)を受けていないため,これらの機器を日本国内で無線機として利用することは電波法により禁じられています。無線機として使用するためには,実験試験局免許を取得するか電波暗室・シールドボックスなどの設備を使用する必要があります。または,アンテナの代わりにケーブルとアッテネータを用い有線接続をし電波を発しないようにすることで,無線通信ではなく有線通信とはなりますが実験することができます(この場合も電波が漏れないように注意してください)。このページを参照される方は,実験される国や地域の法令などを遵守するようにご注意ください。また,実験等はご自身の責任でお願いします。

Day 13: オリジナルプロトコルの実装 (3)

今日はデータリンク層の実装を行います。

+-------+---------+-------------+-------------+----------+---...---+-------+
| Frame | Symbols | Destination | Source      | Sequence | Data    | FCS   |
| type  |         | address     | address     | number   |         |       |
+-------+---------+-------------+-------------+----------+---...---+-------+
 1 byte  2 bytes   4 bytes       4 bytes       2 bytes              4 bytes

今回は Frame type として以下の値を定義します。

  • 0x00: Data

コードの中では以下のように定義しておきます。

FRAME_TYPE_DATA = bitstring.BitArray(hex='00')

ACKやRTS/CTSなどは余裕があれば今後実装しますがおそらく今回はこのタイプのみの実装となります。

32ビットの bitstring.BitArray 型の宛先アドレス dst および 送信元アドレス src,整数シーケンス番号 seqnobitstring.BitArray 型のデータビット列 data を引数に取り,データリンク層のフレームを構築する関数 build_datalink() を以下のように定義します。今回は入力のチェックは行っていないので,例えば宛先アドレスや送信元アドレスが32ビットとならない入力についてもエラーとはならずに誤ったフレームを構築していしまうので,注意してください。

"""
Build datalink frame
"""
def build_datalink(dst, src, seqno, data):
    # Count the number of symbols (including CRC-32)
    symbols = bitstring.BitArray(int=data.len + 136, length=16)
    # Sequence number
    seq = bitstring.BitArray(int=seqno, length=16)
    # Build a frame
    frame = FRAME_TYPE_DATA + symbols + dst + src + seq + data
    # Calculate the checksum
    cksum = crc32_checksum(frame.bytes)
    frame += cksum
    return modulate_bpsk(frame)

上記のコードでは,BPSKで変調するため,データリンク層のフレームのシンボル数は,送信する data のビット数に136ビットを加えたものになります。フレーム種別にこのシンボル数,宛先アドレス,送信元アドレス,シーケンス番号,データを付け,最後にここまでのフレームのCRC-32チェックサムを付けてBPSKで変調します。

今日のまとめと明日の予定

今日はオリジナルプロトコルのデータリンク層のフレーム構築を実装しました。明日はこれらを組み合わせてデータの送信を実装します。