2024年2月5日月曜日

JSONについての説明と、Ambient.iotでのrequests モジュールの

JSON(JavaScript Object Notation)は、軽量なデータ交換フォーマットです。人間にとって読み書きが容易で、マシンにとっても簡単にパース(解析)や生成を行える構造を持っています。そのシンプルさと効率の良さから、Webアプリケーションのデータ交換や、多くのプログラミング言語間でのデータ共有に広く使われています。


JSONの基本構造

JSONは2つの構造を基本としています。


名前/値のペアの集合(オブジェクト): これは多くのプログラミング言語で、オブジェクト、レコード、構造体、辞書、ハッシュテーブル、キー付きリスト、または連想配列として認識されます。JSONでは、オブジェクトは波括弧({})で囲まれ、名前/値のペアはコロン(:)で区切られ、ペア同士はコンマ(,)で区切られます。例: {"name": "John", "age": 30}


値の順序付きリスト(配列): 多くの言語でこれは配列、ベクトル、リスト、またはシーケンスとして認識されます。JSONでは、配列は角括弧([])で囲まれ、値はコンマ(,)で区切られます。例: ["apple", "banana", "cherry"]


JSONのデータ型

JSONで使用できる値は、以下のタイプに分類されます。


数値: 整数または浮動小数点。例: 123, 99.99

文字列: 0個以上の文字から成る、ダブルクォーテーション(")で囲まれた文字列。例: "Hello, World!"

ブーリアン: true または false

配列: 値の順序付きリスト。

オブジェクト: 名前/値のペアの集合。

null: 値がないことを示す。

JSONの使用例

Web APIとの通信: クライアントとサーバー間でデータをやり取りする際、JSON形式でデータを送受信します。

設定ファイル: アプリケーションの設定をJSONファイルで保存、読み込みします。

データストレージ: データベースシステムがJSON形式でデータを保存することがあります。

JSONとXMLの比較

JSONはXML(eXtensible Markup Language)と比較して、より軽量であり、データをパースする速度が速く、構文がシンプルです。このため、特にWeb開発においてはJSONが好まれる傾向にあります。


JSONはその柔軟性、簡潔さ、そして広範なプログラミング言語のサポートにより、現代のデータ交換のデファクトスタンダードとなっています。 

ーーーーーーーーー

IoT(Internet of Things)では、多様なデバイスがインターネットを介してデータを交換します。これらのデバイスは、環境のモニタリングからスマートホームの管理、工業用途まで幅広く、それぞれ異なるタイプのデータを生成します。JSON(JavaScript Object Notation)は、その軽量性と人間にもマシンにも読みやすい形式であることから、IoTデバイス間のデータ交換や、デバイスとサーバー間の通信に広く利用されています。


IoTでのJSONの使い方

デバイスからサーバーへのデータ送信

IoTデバイスがセンサーから取得したデータ(温度、湿度、位置情報など)をサーバーに送信する際にJSON形式を使用します。例えば、温度センサーのデータをサーバーに送信するJSONメッセージは以下のようになります。


{

  "deviceId": "12345",

  "type": "temperatureSensor",

  "data": {

    "temperature": 22.5,

    "unit": "Celsius"

  },

  "timestamp": "2023-04-01T12:30:45Z"

}

サーバーからデバイスへの命令送信

サーバーからIoTデバイスへ特定の操作を指示する命令もJSON形式で送信されます。たとえば、エアコンの温度設定を変更する命令は以下のようになります。


{

   "deviceId": "67890",

   "command": "setTemperature",

   "parameters": {

      "temperature": 24,

      "unit": "Celsius"

   }

}

データの保存と分析

IoTプラットフォームやデータベースは、デバイスから送られてくるJSON形式のデータを使用して、長期間のデータトレンドの分析、リアルタイムの監視、アラートの発行などを行います。JSON形式であれば、データの構造を柔軟に変更できるため、異なるタイプのデバイスやセンサーからのデータを統一的に扱うことができます。


コンフィギュレーションと管理

IoTデバイスの設定情報をJSON形式で保存、交換することができます。これにより、デバイスのファームウェアアップデート、ネットワーク設定、動作モードの変更など、リモートからのデバイス管理が容易になります。


利点

軽量性: JSONはテキストベースで、余分なマークアップを必要としないため、通信のオーバーヘッドが少ないです。

可読性: 人間にも読みやすく、デバッグや開発が容易になります。

柔軟性: データ構造の変更が容易で、新しいデータフィールドを追加する場合も、既存のシステムに大きな影響を与えずに対応できます。

広範なサポート: ほとんどのプログラミング言語でJSONのパースや生成をサポートしており、IoTプラットフォームやデータベースもJSON形式でのデータ交換を広くサポートしています。

JSONはこれらの特性により、IoTアプリケーションにおけるデータ交換の標準的なフォーマットとなっています。

--------------------

requestsモジュールはPythonでHTTPリクエストを送るためのシンプルで使いやすいライブラリです。Ambientへデータを送信するには、requestsモジュールを使用してHTTP POSTリクエストを行います。以下は、基本的な使い方を紹介します。


Ambientへのデータ送信のステップ

requests モジュールのインストール: まだインストールしていない場合は、pipコマンドを使用してインストールします。

pip install requests

リクエストの準備: Ambient APIへデータを送信するためのURL、ヘッダー(必要に応じて)、そしてデータを準備します。


POSTリクエストの送信: 準備したURL、ヘッダー、データを使用してPOSTリクエストを送信します。


レスポンスの処理: リクエストのレスポンスを受け取り、成功したかどうかを確認します。


サンプルコード

以下のサンプルコードは、Ambientに温度データを送信する例を示しています。

import requests

import json


# AmbientのAPIエンドポイント

AMBIENT_URL = "http://ambidata.io/api/v2/channels/YOUR_CHANNEL_ID/data"


# データ送信のためのヘッダーとパラメータ

headers = {

    "Content-Type": "application/json",

}

data = {

    "writeKey": "YOUR_WRITE_KEY",  # Ambientのライトキー

    "d1": 25.2,  # 送信するデータ(例:温度)

}


# POSTリクエストを送信

response = requests.post(AMBIENT_URL, data=json.dumps(data), headers=headers)


# レスポンスの確認

if response.status_code == 200:

    print("Data successfully sent to Ambient.")

else:

    print("Failed to send data to Ambient. Status code:", response.status_code)



このコードを実行する前に、YOUR_CHANNEL_IDとYOUR_WRITE_KEYをAmbientで取得したチャンネルIDとライトキーに置き換えてください。また、d1の値は送りたいデータに応じて変更します。Ambientでは、d1からd8までのデータフィールドを使用できます。


注意点

AmbientのAPIエンドポイントやパラメータは、AmbientのAPIドキュメントに基づいて適宜調整してください。

ネットワークエラーやタイムアウトを適切に処理するために、try-exceptブロックを使用して例外処理を行うことをお勧めします。

requestsを使用する際には、リクエストのタイムアウトを設定することを忘れないでください(例:requests.post(url, data=data, headers=headers, timeout=5))。

requestsライブラリの使用法はこれだけではありませんが、IoTデータをAmbientに送信する基本的な方法を説明するには十分です。データを送信する際のさまざまなシナリオで応用が可能です。






2024年2月2日金曜日

Ambient.iotで IoTデータを表示

iMacのUSBポートにAruduino UNO が接続されており、 9600bpsで次のようなメッセージが5秒ごとに送られてくる。 BMP_001:Pres:1011.81 BMP_001:Temp:18.20 SHT_001:Temp:19.74 SHT_001:Humi:68.48 RTC_001:Time:2001/05/16-04:00:00 RTC_001:Temp:17.00 HAM_001:Light:69

このデータを1分おきに ambient.iot へ送るためのPython プログラムを作った。

------ 

ChatGPTに作られせた。

------------------------------

import serial
import time
import requests
import json

# Ambientの設定
AMBIENT_CHANNEL_ID = "YOUR_CHANNEL_ID"
AMBIENT_WRITE_KEY = "YOUR_WRITE_KEY"
AMBIENT_URL = "http://ambidata.io/api/v2/channels/{channel_id}/data".format(channel_id=AMBIENT_CHANNEL_ID)

# シリアルポートの設定 (Mac向けに調整)
SERIAL_PORT = '/dev/cu.usbmodemXXXXX' # Macに接続されているArduinoのポート。XXXXはデバイスによって異なります。

BAUD_RATE = 9600

def send_data_to_ambient(data):
headers = {
"Content-Type": "application/json",
}
response = requests.post(AMBIENT_URL, data=json.dumps(data), headers=headers)
if response.status_code == 200:
print("Data successfully sent to Ambient.")
else:
print("Failed to send data to Ambient.")

def main():
with serial.Serial(SERIAL_PORT, BAUD_RATE) as ser:
# 1分おきにデータ送信
while True:
aggregated_data = {}
start_time = time.time()
while time.time() - start_time < 60: # 60秒間データを収集
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').strip()
# データ解析と整形
if line:
parts = line.split(':', 2) # 最大2回まで分割
if len(parts) == 3:
sensor_id, value_type, value = parts
key = f"{sensor_id}_{value_type}"
aggregated_data[key] = value
else:
print("Received malformed data:", line)
if aggregated_data:
# Ambientに送信するデータの形式に合わせて整形
data = {"writeKey": AMBIENT_WRITE_KEY, "d1": aggregated_data.get('BMP_001_Pres', ''),
"d2": aggregated_data.get('BMP_001_Temp', ''), "d3": aggregated_data.get('SHT_001_Temp', ''),
"d4": aggregated_data.get('SHT_001_Humi', ''), "d5": aggregated_data.get('RTC_001_Time', ''),
"d6": aggregated_data.get('RTC_001_Temp', ''), "d7": aggregated_data.get('HAM_001_Light', '')}
send_data_to_ambient(data)
# 次の送信までの待機時間を計算し、負の値でないことを保証
sleep_time = 60 - (time.time() - start_time)
if sleep_time > 0:
time.sleep(sleep_time)

if __name__ == "__main__":
main()

----------------------------

2/2 00:30から 05:30までの観測結果を表示した結果が下の図のとおり



--------

raspberry piでの プログラムも ほぼ同様で動作するはず。
USBポートの設定を変えれば良い。


--



2023年12月3日日曜日

u-center で画面がちらつくとき

 u-centerの画面がちらつくときがあります。

衛星の信号強度を表示する画面がちらついて見づらいときがあります。
そんな時は、
Messege (CFG MSG)NMEA-GSV とCFG-NMEA-GSAを

それぞれ1秒間に1回に設定すると、
ちらつかなくなりました。




2023年11月27日月曜日

dronebridgeESP32のインストール

ドローンブリッジ ESP32  


  • コンパイル済みのファームウェアバイナリをダウンロードします (https://github.com/DroneBridge/ESP32/releases)

  • ダウンロードしたDroneBridgeESP32のZipファイルをフォルダに展開します。
    例では、ユーザのデスクトップにDroneBridgeというフォルダに展開したとします。

  • ESP32をUSB/シリアルでパソコンに接続します。

  • ESP32が繋がっているシリアルのポート番号を確認して、COM番号をメモします。
    MacやLinuxでは、/dev ディレクトリの中でファイル名で表示されています。

  • cmd.exeを起動します。 MacやLinuxでは、terminalを起動します。


  • pipを使って、 esptoolをインストールします。
    ネットがつながっていて、pythonがインストールされていて、pipが使えるようになっていれば、コマンドラインで pip install esptool    を実行します。
    エラーが出る場合は、ネットの接続を確認して、pythonをインストールしてることやpipが使えることを確認します。

  • esptool のインストールが完了したら、どのディレクトリーにインストールされのかを確認しておきます。 その際 pip uninstall esptool   を実行すると、どのディレクトリにインストールされたかを確認できます。   ディレクトリをメモして、no   を入力します。

  • esptool.pyを利用して、ESP32のフラッシュを消去し、DroneBridge for ESP32 ファームウェアを ESP32 にフラッシュします。

      1. esptool.py -p COM4 erase_flash
      2. esptool.py -p COM4 -b 460800 --before default_reset --after hard_reset --chip esp32  write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 bootloader.bin 0x8000 partition-table.bin 0x10000 db_esp32.bin 0x110000 www.bin


  • ESP32の電源を入れ直します

  • 「DroneBridge for ESP32」WiFi ネットワークに接続し、アプリケーションのファームウェアを構成します。




ESP32 用の DroneBridge の構成

Web インターフェイスを介してデフォルト設定を変更できます。WiFi 経由で ESP32 に接続し、  ブラウザのアドレス バーにdronebridge.local、 http://dronebridge.local または を入力します。192.168.2.1

デフォルト設定

  • SSID: DroneBridge for ESP32   ー>必要に応じて変更

  • パスワード: dronebridge   ー>必要に応じて変更

  • 透明/MAVLink

  • UARTのボーレート 115200   ー>57600  に変更

  • UART TX ピン 17

  • UART RXピン 16

  • ゲートウェイIP: 192.168.2.1


2023年11月25日土曜日

Septentrio mosaic のGNSS受信機は AIM+ を使って周波数スペクトルが確認できます。

Septentrioの受信機でAIM+に対応していると、受信している電波のスペクトラムを画面に表示することができます。

mosaic-CLASも対応しているので、Web画面(192.168.3.1)で GNSS->Spectrum で表示させてみました。

 


こんなに簡単にこの表示ができるとは! 感動する!!  
何十万円もするスペアナを使わなくても電波の様子が見えます。

Mosaic-Hは、3周波数対応なので、L1帯(中心周波数 1575.42 MHz)のほかにもL2帯(1213M~1244MHz)L6帯(1257M~1299MHz)が見えます。


ちなみにL5帯の周波数は(1164M~1189MHz)ですね。

https://www.youtube.com/watch?v=Ib_B_KcfmPs

The spectrum plot is part of Septentrio's AIM+ technology, a set of powerful tools to detect and mitigate interference. In this video, I'll show you how to use the spectrum plot to visualize interference.

Septentrio Mosaic-Hをパソコンに接続して、Web画面で表示する方法

 Septentrio Mosaic-Hをパソコンに接続して、Web画面で表示する方法は、

192.168.3.1にアクセスすれば画面が表示される。




https://customersupport.septentrio.com/s/article/mosaic-Getting-started



Web インターフェイスまたは RxTools で、受信機のボー レートが 115200 に設定されていることを確認してください。デフォルト値でない場合は、[管理] > [エキスパート コントロール] > [コントロール パネル] > [通信] > [COM ポート設定]に移動して設定できます 

Admin > Expert Control > Control Panel > Communication > COM Port Settings.


PixHawkに接続するときは、Baudrateを115200にします。

PixHawkが起動したときに、Mosaicと通信を行って、自動的に必要な設定を行います









2023年11月24日金曜日

PixHawkにOLEDを接続

 手持ちのOLEDをPixHawkに接続した。

ケーブルはI2Cなので、GPSモジュールの磁気センサーのI2Cと共用する必要があります。
I2C拡張ボードをPixHawkに接続して、 I2C拡張ボードのコネクタにM8N GPSモジュールの磁気センサーのコネクタを接続し、 そこにOLEDも接続します。

PixHawkの設定も変更します。 NTF_DISPLAY_TYPE コマンドで指定します。 
デフォルトではDisableになっているので、OLEDのtypeに合わせた設定に変更します。

Mission Plannerの 設定/調整 のメニューから、 フルパラメータリストを選びます。
絞込み検索に Display と入力すると、
コマンドの列にNTF_DISPLAY_TYPEが表示されます。 デフォルトでは値が0になっているのでDisableの状態です。 これを接続したOLEDのtypeに合わせて変更します。
私の手持ちのOLEDは何も記載がありません。 

ネットで形状をググると、SSD1306か SH1106のどちらかです。  
試しにSSD1306だと考えて1と入れてみました。 設定ができませんでした、というようなメッセージが表示されます。

2と入れてみましたが、同じです。 
試しにUSBケーブルを外してリブートをしてみましたが、何も表示されません。

ちょっとがっかりしましたが、気を取り直して、
もう一度1と入れ直して、 電源ケーブルを抜き差しして、リブートしたら、表示されるようになりました。 

私の手持ちのOLEDは SSH1306だったようです。 マジックで書いておこう。


(結論)OLEDはI2Cに接続して、Mission Plannerで設定の NTF_DISPLAY_TYPEを1にすればよかったようです。 できてしまえば簡単でした。