nbtk / azarashi

QZSS DCR Decoder
MIT License
20 stars 2 forks source link

[UnicodeDecodeError] 'utf-8'... のエラー #5

Closed currycooqoo closed 1 year ago

currycooqoo commented 1 year ago

Spresenseで動作確認中ですが、デコードに失敗します。 Python 3.9.16です。

Spresenseにはこちらを書き込んであります。 https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_qzss_災危通報を出力する

azarashi nmea -f /dev/cu.SLAB_USBtoUART
2023-04-22T01:28:04.821471 --------------------------------
# [UnicodeDecodeError] 'utf-8' codec can't decode byte 0xb7 in position 0: invalid start byte

また、以下の場合は最後に Encountered EOF が表示されるようです。 これらは私の環境でしょうか?

echo '$QZQSM,55,C6AF89A820000324000050400548C5E2C000000003DFF8001C00001185443FC*05' | azarashi nmea
2023-04-22T01:40:12.147776 --------------------------------
防災気象情報(緊急地震速報)(発表)(訓練/試験)
*** これは訓練です ***
緊急地震速報
強い揺れに警戒してください。

発表時刻: 3月10日10時0分

震央地名: 日向灘
地震発生時刻: 10日10時0分
深さ: 10km
マグニチュード: 7.2
震度(下限): 震度6弱
震度(上限): 〜程度以上
島根、岡山、広島、山口、香川、愛媛、高知、福岡、佐賀、長崎、熊本、大分、宮崎、鹿児島、中国、四国、九州

Encountered EOF

HEXでも

Python 3.9.16

echo C6AF89A820000324000050400548C5E2C000000003DFF8001C00001185443FC | azarashi hex
2023-04-22T01:41:51.201866 --------------------------------
防災気象情報(緊急地震速報)(発表)(訓練/試験)
*** これは訓練です ***
緊急地震速報
強い揺れに警戒してください。

発表時刻: 3月10日10時0分

震央地名: 日向灘
地震発生時刻: 10日10時0分
深さ: 10km
マグニチュード: 7.2
震度(下限): 震度6弱
震度(上限): 〜程度以上
島根、岡山、広島、山口、香川、愛媛、高知、福岡、佐賀、長崎、熊本、大分、宮崎、鹿児島、中国、四国、九州

Encountered EOF
nbtk commented 1 year ago

こんにちは。

# [UnicodeDecodeError] 'utf-8' codec can't decode byte 0xb7 in position 0: invalid start byte

デバイスの出力に '0xb7' が現れるということですね。それを文字にデコードしようとしたけど、文字コードにないので失敗すると。ということは、まずデバイスから正しく NMEA センテンスが出力されていることを確認してくみてださい。例えばこのようなコマンドで。

$ cat /dev/cu.SLAB_USBtoUART

レポートお待ちしています。

nbtk commented 1 year ago

さて、EOFの件ですね。echo が終了しているので、そのストリームを受けていた azarashi は Encountered EOF と出力して終了しています。これは正常な動作です。エラーなく完走したと解釈してください。

間違ってこのイシューをクローズしましたがオープンしましたので、追加レポートお待ちしています。

nbtk commented 1 year ago

そうだ。OSはなんでしょうか? 詳細な環境を教えてもらえると解決の助けになれるかもしれません。

currycooqoo commented 1 year ago

ご返信ありがとうございます。

環境 macOS 11.7.5 Bash 5.2.15 Python 3.9.16

echo $LANG
ja_JP.UTF-8

シリアルモニタだと正常に表示されているので何も疑問に思いませんでしたが、catで表示すると文字化けしていたので私のターミナルの問題のようでした。 他に確認すべき点ございますでしょうか?

シリアルモニタ

pio device monitor -b 115200 -p /dev/cu.SLAB_USBtoUART
--- Terminal on /dev/cu.SLAB_USBtoUART | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
$QZQSM,56,C6ADE2587680060003005A04002F7012CC80FB800000000000000013130DA10*71
$QZQSM,56,53ADF2584C8005047EA178542F32861350C30A18754322A864A000136096554*0B
$QZQSM,56,9AADF2584C8002CBCC5993CB3EF96A002D77AA08214106A823A000139FA1ED0*0D
以下略

上のセンテンスのひとつ

echo '$QZQSM,56,C6ADE2587680060003005A04002F7012CC80FB800000000000000013130DA10*71' | azarashi nmea
2023-04-22T15:03:23.155147 --------------------------------
防災気象情報(台風)(発表)(通常)
台風解析・予報情報が発表されました。

発表時刻: 4月22日12時45分

台風番号: 1号
基点時刻: 24日9時0分
基点時刻分類: 予報
情報の基点時刻からの経過時間: 45時間後
大きさ: なし
強さ: なし
緯度・経度: 北緯11度55分0秒 東経150度25分0秒
中心気圧: 1006hPa
最大風速: 不明
最大瞬間風速: 不明

Encountered EOF

cat

cat /dev/cu.SLAB_USBtoUART
�
��
  ��
������
���
�J!���
�$�
���
�������
以下略
currycooqoo commented 1 year ago

シリアルモニタで通信速度を指定しない場合はcatと同様文字化けしていました。

pio device monitor -p /dev/cu.SLAB_USBtoUART
--- Terminal on /dev/cu.SLAB_USBtoUART | 9600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
�
������
���
��␌��

README、I/O StreamのExamplesを実行した場合ももちろんエラーが出ます。

azarashi-test.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# https://github.com/nbtk/azarashi

import azarashi
import sys

def example():
    with open('/dev/cu.SLAB_USBtoUART', mode='r') as f:
        while True:
            try:
                azarashi.decode_stream(f, msg_type='spresense', callback=print)
            except azarashi.QzssDcrDecoderException as e:
                print(f'# [{type(e).__name__}] {e}', file=sys.stderr)
            except azarashi.QzssDcrDecoderNotImplementedError as e:
                print(f'# [{type(e).__name__}] {e}', file=sys.stderr)
            except EOFError as e:
                print(f'{e}', file=sys.stderr)
                return 0
            except Exception as e:
                print(f'# [{type(e).__name__}] {e}', file=sys.stderr)
                return 1

exit(example())
python /azarashi-test.py
# [UnicodeDecodeError] 'utf-8' codec can't decode byte 0xb7 in position 0: invalid start byte

READMEのAPI、decord()やget_params()Exampleは正常に表示されていました。

currycooqoo commented 1 year ago

Encountered EOF

の件は承知しました。

currycooqoo commented 1 year ago

何度もすみません。 azarashi-test.py の中の msg_type='spresense',はPython 3.7で試していたのをそのままコピペしていました。 Python 3.9で msg_type='nmea でも同様です。

currycooqoo commented 1 year ago

pipで pyserial をインストール後、通信速度を指定した以下を実行した場合は無事表示されました。

azarashi-test.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# https://github.com/nbtk/azarashi

import azarashi
import sys
import serial

def example():
    ser = serial.Serial("/dev/cu.SLAB_USBtoUART", 115200)
    while True:
        try:
            azarashi.decode_stream(ser, msg_type='nmea', callback=print)
        except azarashi.QzssDcrDecoderException as e:
            print(f'# [{type(e).__name__}] {e}', file=sys.stderr)
        except azarashi.QzssDcrDecoderNotImplementedError as e:
            print(f'# [{type(e).__name__}] {e}', file=sys.stderr)
        except EOFError as e:
            print(f'{e}', file=sys.stderr)
            return 0
        except Exception as e:
            print(f'# [{type(e).__name__}] {e}', file=sys.stderr)
            return 1

exit(example())
python ./azarashi-test.py
防災気象情報(海上)(発表)(通常)
海上警報が発表されました。

発表時刻: 4月22日11時25分

警報等情報要素: 海上風警報
檜山津軽沖

警報等情報要素: 海上風警報
関東海域北部

警報等情報要素: 海上風警報
関東海域南部

警報等情報要素: 海上風警報
沿海州南部沖

警報等情報要素: 海上風警報
秋田沖

警報等情報要素: 海上風警報
佐渡沖

警報等情報要素: 海上風警報
東海海域東部

警報等情報要素: 海上風警報
東海海域西部
防災気象情報(海上)(発表)(通常)
海上警報が発表されました。

発表時刻: 4月22日11時25分

警報等情報要素: 海上濃霧警報
関東海域南部

警報等情報要素: 海上濃霧警報
東海海域南部

警報等情報要素: 海上濃霧警報
四国沖南部

警報等情報要素: 海上濃霧警報
長崎西海上

警報等情報要素: 海上濃霧警報
東シナ海南部

警報等情報要素: 海上風警報
宗谷海峡

警報等情報要素: 海上風警報
北海道西方海
currycooqoo commented 1 year ago

通信速度を指定する場事で無事表示出来ました。

stty -F /dev/cu.SLAB_USBtoUART 115200
cat /dev/cu.SLAB_USBtoUART | azarashi nmea

ご迷惑おかけ致しました。 とても便利そうなので使わせて頂きます! ありがとうございました。

要望ですが、get_params()のパラメータのドキュメント作って頂けるととてもありがたいです。 よろしくお願い致します。

nbtk commented 1 year ago

ボーレートを指定していなかったため、デフォルトの 9600 が使われて同期できていなかったということですね。解決してよかったですね。がんばってください。

気に入ってもらえたならぜひ ☆ をください。☆ の数は開発を続ける上でとても重要なんです。押すだけで貢献できるのでお願いします。

要望ですが、get_params()のパラメータのドキュメント作って頂けるととてもありがたいです。

get_params() メソッドが返すレポートオブジェクトのメンバ変数が知りたいということですよね? とりあえずこのあたりを見てください。 https://github.com/nbtk/azarashi/blob/main/azarashi/qzss_dcr_lib/report/qzss_dc_report.py

テストデータがここに入っているので実際に動かしてみるとよいかと思います。 https://github.com/nbtk/azarashi/tree/main/tests

値の意味は みちびき 災害・危機管理通報サービス のインタフェース仕様書が詳しいです。 https://qzss.go.jp/technical/download/ps-is-qzss.html

ドキュメントは時間がないのですぐにできるかはわかりませんが検討します。オープンソースウェアなのでプルリクしてもらっても大丈夫です。とはいえ、そこまでのコントリビューションを求めるのは酷なので、よかったら ☆ をください。☆ に飢えてます。

問題の管理が複雑になるので、つぎからは1つのイシューに1つの問題でお願いします。 それではよいアプリが完成するといいですね。応援しています。Happy Hacking!