【NET API + Python3】 add postion

Upload to NET terminal positons

Run.
> python3 this_script.py

 

# -*- coding: utf-8 -*-
import urllib.request

apk_key = 'your api key'
tid = 'terminal name'
datas = [
{"lat": 35.5xxxxxx , "lng": 139.3xxxxx, "date:": "xxxx-xx-xx xx:xx:xx" },
{"lat": 35.5xxxxxx , "lng": 139.3xxxxx, "date:": "xxxx-xx-xx xx:xx:xx" },
{"lat": 35.5xxxxxx , "lng": 139.3xxxxx, "date:": "xxxx-xx-xx xx:xx:xx" },
{"lat": 35.5xxxxxx , "lng": 139.3xxxxx, "date:": "xxxx-xx-xx xx:xx:xx" },
]

for dt in datas:

add_position = "http://api.sensor-network.jp:8181/api/position/add/"
post_data = {
'api_key': apk_key,
'tid': tid,
'lat': dt["lat"],
'lng': dt["lng"]
'date': dt["date"]
}
post_data = urllib.parse.urlencode(post_data).encode(encoding='utf-8')

request = urllib.request.Request(add_position)
request.add_header("Content-Type","application/x-www-form-urlencoded;charset=utf-8")
response = urllib.request.urlopen(request, post_data)
result = response.read()
print(result)

 

REACH RTK

RTK(リアルタイムキネマティック)はDGPS(Diifferential GPS)の一種で、位置の分かっている基準局(ベース)が発信する補正データを利用してGPS計測結果の誤差を修正して精度を高める技術です。

下記参考:http://www.emlid.com/navio-rtklib/

 

EMLIDのREACH RTKを二つ用意します。

春ぐらいに注文して、最近やっと届いたやつです。

いつも、届くのにすごく時間がかかるからすごく不安になりますが今回もちゃんと届きました。

reach

 

 

一つは、ベース用(固定局)でもう一つはローバー用(移動局)です。

【設定編】

1. REACHにUSB電源接続
2. アンテナをReadchのMCXソケットに接続
3. Reachは、最初 WiFi-hotspotモードになっている。
PCなどからWifiのreadh:66:acのようなアクセスポイントに接続する。
パスワードは、「 emlidreach 」

4. ブラウザから下記にアクセスして、Reachのデバイスネームと、
接続するWifi Networkを設定する。

http://reach.local:5000
または、
http://192.168.42.1:5000

5. どこかWifiに接続するようにした時にデバイスのIPがわからなくなるので、
FingなどのIP検索アプリケーションで端末を探せるにしておくとよい。

今回、ベースを 「 mk_station1」ローバーを「 mk_rover1」にしたので、

ブラウザから下記を入力するとReachView App(ブラウザアプリ)が見れます。

http://mk_station1.local/

http://mk_rover1.local/

このときPCもReachと同じWiFiネットワークに繋がっている必要があります。

 

【使い方編】

ReachView App(ブラウザアプリ)を使い設定を行います。
ReachViewには、3つのタブがあります。
Status / Config / Logs
Configタブには、RTKのパラメータ(位置検出モード等)を設定する。
Logsタブには、ログのrawデータのlinkがある。

※最初にLogタブからUpdateして、最新版にします。

 

【Configタブ】

Reachにはベースステーション、ローバーの動作モードがあります。
デフォルトでは、Reachはローバーとして設定されています。
ベースステーションは固定局で補正データを送るものです。固定して動かしません。

こちらにはあらかじめ設置場所の緯度経度高度情報をいれておきます。
また補正データのメッセージフォーマットや、送信インターフェース(TCP/シリアルなど)を設定します。

デフォルトでは、
outstr-path tcpsvr
ポートは9000
formatは、RTCM3
になってます。

 

スクリーンショット 2015-12-13 午後11.44.05

ベースの位置情報をあらかじめ入れていないときの動作は下記に詳しく書かれています。

http://docs.emlid.com/reach/reachview-app/#setting-up-base-station

・ローバーとして設定

http://mk_rover1.local/
にアクセスし、
Config で「Rover」を選択

reach_kinematic_default.confを選択。

positioning mode: kinematic
input source for base correction:

tcpcli (TCP clientの意味)
192.168.xxx.xxx        BaseのIPアドレスを設定。
rtcm3    メッセージフォーマット

ポートは、9000
にします。

位置情報を保持しておきたい場合、Solution out put pathにfile設定して、llhを設定すると、sol_xxxxxx.logで保存されます。

スクリーンショット 2015-12-13 午後10.35.42

【Statusタブ】

Status:-
ソフトが実行する情報がない。アンテナが付いてないとか、十分に時間が経ってない。

Status:single
ローバーが、GPSレシーバーからデータ取得できているが、まだベースと接続できていない。

Status:float
ベースに関連付けられていて、位置情報が補正されているが、整数の曖昧さが解決できてない。

Status:fixed
位置情報はベースに関連付けられていて整数の曖昧さも解決できている。
高い位置情報精度が得られている状態。

float,fixedであれば、RTKが正確にセットアップできている。

衛星のレベルと、アンテナの設置状況がRTKのパフォーマンスに影響を及ぼす。
精度よく位置情報を取るためには、少なくとも45以上のSNRレベルで5つの衛星が必要。

スクリーンショット 2015-12-12 午後5.13.32

棒グラフのグレーの部分が、補正データを受信しているというマークになるようです。

fix_status

こんなふうになれば良い状態みたいです。

一旦ここまで。

田んぼセンサ回収

9/30 田んぼセンサ回収

 

田んぼから水無くなり、収穫が近いのでセンサを回収しました。

サーバーシステム/スマフォアプリ含め、課題発見&修正を繰り返しましたが、結果意義のある実験でした。

やっぱりスマフォがUXにあってると新ためて思いましたが、

PCブラウザビューワーも進めます。

次は、WiFiバージョンですね。

IMG_20150929_120753

IMG_20150929_121815

IMG_20150929_121821

ESP-WROOM-02 HTTP/POSTする

IMG_20150922_120127

 

昨日作ったボードで一旦 POSTしてみます。

電源はお馴染みのftdi(3.3v)ケーブルでいれます。

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>


void postData(String ip_addr, int port,String sid, float value );

//=== WiFi ===
const char* ssid = "wifi ssid";
const char* password = "wifi password";

//=== SENSOR ===
const String API_KEY = "uuid";
const String SID = "this sensor id";
const char* server= "server ip addr";
const int port = 8000;

void setup() {

  pinMode(16, OUTPUT);

  Serial.begin(115200);
  delay(100);
  
  Serial.println("");
  Serial.println("Start");
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  delay(3000);
}

int cnt=0;

void loop() {

  if (WiFi.status() != WL_CONNECTED) {
  
    delay(3000);
    Serial.print(".");
 
  }else{
    
    Serial.println("");
    Serial.println("WiFi connected");
    
    postData(server, port, SID, cnt);
    cnt++;
    delay(60000);
  }
}

void postData(String ip_addr, int port,String sid, float value ) {

  WiFiClient client;
  
  if (client.connect(ip_addr.c_str(), port) ) {
  
    Serial.println("connected.");
    
    String param = "sid=" + sid + "&value=" + value + "&api_key=" + API_KEY;

    String data = "POST /api/data/add/ HTTP/1.1\r\n";
    data += "Host: " + ip_addr + "\r\n";
    data += "User-Agent: ESP-WROOM-002\r\n";
    data += "Connection: close\r\n";
    data += "Content-Type: application/x-www-form-urlencoded;\r\n";
    data += "Content-Length: " + String(param.length()) + "\r\n";
    data += "\r\n";
    data += param;

    Serial.println(data);

    client.print(data.c_str());
  
  } else {
    Serial.println("Connection failed");
    client.stop();
  }
}