panda's tech note

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

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

Day 21: インタラクティブ操作のための準備

双方向のインタラクティブ通信のために,入力された文字列を他の端末に送り表示するプログラムを書こうと思います。 SoapySDR.Device.readStream() はビジーループで呼び出す必要があるため,無線通信とキーボード入力は別スレッドで動かすことにします。そのため,Python の threading モジュールを使います。

workerSdr 関数が無線通信用のワーカーで,workerKeyInput 関数がキーボード入力を扱うワーカーとして,workerKeyInput から messages 変数に入力されたメッセージを追加(Producer)し,workerSdr がこの messages から取り出す(Consumer)ようなものを以下のように実装しました。

import sys
import threading
import time

# Messages
messages = []

"""
Key input worker
"""
def workerKeyInput(semaphore):
    while True:
        s = sys.stdin.readline()
        with semaphore:
            global messages
            messages.append(s)

"""
SDR worker
"""
def workerSdr(semaphore):
    while True:
        with semaphore:
            global messages
            if messages:
                print(messages.pop(0))
        time.sleep(1)

if __name__ == '__main__':
    semaphore = threading.Semaphore(1)
    t1 = threading.Thread(target=workerKeyInput, args=(semaphore,))
    t2 = threading.Thread(target=workerSdr, args=(semaphore,))
    t1.start()
    t2.start()

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

明日は,これを昨日まで実装したものと組み合わせて双方向通信を実装します。