Translate

2015年8月20日木曜日

Subversion + Apache HTTP Server + WebDav で FreeIPA を認証に使用する




最近の若い人たちは UNIX をさわろうとしない。

なのでSubversionをWebDAV経由で使用させるときの
ユーザID、パスワード管理をhtpasswdコマンドでやらせようとしたら、
結構な力で拒否られそう..

そうならないようにユーザID、パスワードを管理する
Web UI を提供してやらなきゃならないのだけど..



で、考えた挙句 FreeIPA のWeb UIを使わせて
パスワード管理させ、
Subversion+WebDAV側はBASIC認証をやめて
FreeIPA側の認証機能を使わせようと考えた。

FreeIPAは認証にKerberos、認可にLDAP(OpenLDAP)を使っているので、
最初にApacheのモジュールとしてmod_ldapを追加する必要がある。

CentOS7なら、yum -y mod_ldapしておく。

/etc/httpd/conf.modules.d/10-subversion.conf (CentOS7でyumをつかってmod_dav_svnを入れた場合) を

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
LoadModule dontdothat_module  modules/mod_dontdothat.so
##
#Alias   /svn                    /var/www/svn
<Location /svn>
        DAV                     svn
        SVNParentPath           /var/www/svn/

        AuthType        Kerberos
        AuthName        "Kerberos Login"
        KrbMethodNegotiate      on
        KrbMethodK5Passwd on
        KrbServiceName HTTP
        KrbAuthRealms HARA2.LOCAL
        Krb5KeyTab /etc/httpd/conf/ipa.keytab
        KrbSaveCredentials on
        AuthLDAPUrl     ldap://tower.hara2.local/dc=hara2,dc=local?krbPrincipalName
        Require valid-user
</Location>



と書き換えてsystem restart httpd.serviceすればOK。

ちなみにKerberos認証ではなくすべてBASIC(LDAP)認証したい場合は、Location要素内を以下のようにすればよい。

2015/09/18追記:<注意>
以下の設定ではFreeIPA側で無効化したアカウントでもSubversionにアクセスできてしまうことがわかりました。Kerberos側(上)の方を使用してください。

<Location /svn>
        DAV                     svn
        SVNParentPath           /var/www/svn
        AuthType        Basic
        AuthName        "WebPot Collaboration Login(LDAP)"
        AuthBasicProvider       ldap
        AuthLDAPURL     ldap://tower3.webpot.local/cn=users,cn=compat,dc=webpot,dc=local?uid?sub?(objectClass=*)
        Require         ldap-filter objectClass=posixAccount

</Location>


もしDNSにtower.hara2.localが入っていないSubversionクライアントPCの場合はWindows\System32\drivers\etc\hoststower.hara2.localのエントリを追加してやればよい。



というわけでめでたくFreeIPAのUIで管理するようになったのだけど、
FreeIPAの画面って結構リッチというか使っていない属性が結構あるから
まようかもなあ..


2015年8月18日火曜日

CentOS7にFreeIPAをインストール中pkispawnコマンドでエラーになる



CentOS7上にFreeIPAをインストールしようとして

[CentOS 7][FreeIPA]IPAサーバーをインストールする。
http://itarc1.blog.fc2.com/blog-entry-15.html

を参考に作業していたところ
ipa-server-install --setup-dns --mkhomedir
を実行して間もないところで、以下のメッセージが表示され先に進めなくなってしまった。


Configuring certificate server (pki-tomcatd): Estimated time 3 minutes 30 seconds
  [1/20]: creating certificate server user
  [2/20]: configuring certificate server instance
ipa         : CRITICAL failed to configure ca instance Command '/usr/sbin/pkispawn -s CA -f /tmp/tmpxxxxxx' returned non-zero exit status 1
Configuration of CA failed


パスワード文字列に%が入ってるとダメとかいう記事もみかけたが、どうしても見つからない..

でさらにイロイロ検索していたところ、

Bug 953488 - CRITICAL failed to configure ca instance Command '/usr/sbin/pkispawn ...
https://bugzilla.redhat.com/show_bug.cgi?id=953488

をみつけた。

このなかに環境変数HTTP_PROXYHTTPS_PROXYを指定していると動かないという記述をみつけ、unset HTTP_PROXYunset HTTPS_PROXYしてやり直してみたら..うまく行った..

あとあと使うからと思って.bashrcに書いていたのが仇となった..


も~見つけるまで3時間かかったよ..

2015年8月11日火曜日

Arduino YUN mini を初期設定してWiFiルータにつなぐ

スイッチサイエンスのページを見ていたら、Arduino YUN miniというボードが販売されていた。

スイッチサイエンス:Arduino YUN mini


https://www.switch-science.com/catalog/2307/

どうもEthernetコネクタがなくなり、ボディも小型になったようだ。



Arduino社純正のボードでは、IoTのゲートウェイとして最有力候補は
これまではArduino YUN だったが、
もしこのminiが簡単に動くようならこっちのほうがいい。

なんたって小さいし..

で早速購入してみたが..
あれ?YUNと同じ値段だ..

コストパフォーマンスはないのね..


しかもこの値段だとIntel Edison単体とどっこいどっこいか..



YUNの場合はEtherコネクタがあったので、最初こっちをルータにつないでWeb UIを開いてWiFi設定ができたが、このYUN miniはmicro USB以外のコネクタがない。

電源もおそらくこのmicroUSBかVin給電になるのだとはおもうが..

で、調べてみたら。


1. Arduino YUN miniとPCをmicroUSBでつなぐ
最新の開発環境を入れていれば、その中に入っている最新ドライバでちゃんと認識する。
2. PCのWiFi設定を開いて Lininoから始まるアクセス先が出てくる

3. WiFiでLinino~とつなぐ

4. ブラウザを起動し「http://192.168.240.1/」を開く
するとLininoのWeb UIが表示される

5. 初期パスワード「doghunter」を入力する

6. CONFIGUREボタンを押す

7. WIRELESS PARAMETERSのDETECTED WIRELESS NETWORKSから接続したいSSIDを選択する

8. PASSWORD欄にSSIDのパスフレーズを入力し、CONFIGURE & RESTART ボタンを押す

9. プログレスバーが100%になったらPCのWiFi設定をYUN miniと同じSSIDで設定し直し、接続する

10. YUN miniのアドレスへssh接続する(rootのパスワードはdoghunterもしくは変更したパスワード文字列)


あとはYUNと同じでWiFiドライバではなくBridgeドライバでSketchをかけばOK。

もしSSIDやパスフレーズを誤って設定した場合は、本体のタイトルロゴのついた銀色の板右下にある2つのリセットスイッチのうち「32U4 RST」とかいてあるほうのリセットボタンを押して再度micro USBケーブルを繋ぎ直せば、Linino~のアクセスポイントが有効になり、再チャレンジできるようになっている、



ピンがむき出しなので、結局ブレッドボードにかませて使うことになると思うが、スイッチサイエンス社の普通のブレッドボードに乗せると、YUNより大きくなってしまう..

使い道、考えてみるか..

2015年7月27日月曜日

PubSubClientライブラリを使ってArduino YUNをMQTTのSubscriberにする




ArduinoでIoTする場合、MQTT Publisherとして動作させる
わけだが、水位が30%を切ったらモータを動かすなどの処理を書く場合は
MQTT Subscriberとして実装し無くてはならない。

PubSubClientライブラリはSubと名前にも入っているとおり
Subscriberとして動作する場合の実装にも利用可能である。

以下のサンプルコードは、IBM IoT Foudationに到着するデータのうち
チケット名が「iot-2/type/arduino/id/ffffffffffff/evt/status/fmt/json」である
もののみ受け取るSubscriberとして実装する例である。

MQTTブローカとのアクセスにはPubSubClientライブラリを、
http://knolleary.net/arduino-client-for-mqtt/
受信JSONデータをparseするためにArduinoJsonライブラリを
https://github.com/bblanchon/ArduinoJson
それぞれダウンロードして使用している。

1点注意。以下のコードはArduino YUN(Bridgeライブラリ)ベースで記述しているので
環境にあわせてWiFiライブラリやEthernet2ライブラリに書きなおして
動作させること。

2015/11/20 追記)
ヘッダファイル名がそっくり消えてしまってました。すみません。


#include <SPI.h>
#include <Bridge.h>
#include
<YunClient.h>
#include <PubSubClient.h>
#include
<ArduinoJson.h>

// MQTTブローカ
char server[] = "hogehoge.messaging.internetofthings.ibmcloud.com";

// Subscriberとして認証
// IoT FoundationでAPIキー生成
char username[] = "a-hogehoge-xxxxxxxxxx";
char password[] = "xxxxxxxxxxxxxxxxx";

//アプリケーションtiger1用クライアントID
//
char clientid[] = "a:hogehoge:subtest";

//購読対象デバイスのトピック名
char topicname[] = "iot-2/type/arduino/id/ffffffffffff/evt/status/fmt/json";

// callback関数プロトタイプ宣言
void callback(char* topic, byte* payload, unsigned int length);

// Arduino YUNにおけるEthernetClient代替オブジェクト
YunClient c;
// PubSubClientライブラリクライアントオブジェクト
PubSubClient client(server, 1883, callback, c);

/*
  初期処理
*/
void setup() {
  // シリアルポート開始
  Serial.begin(9600);
  while(!Serial){
    ;
  }
  Serial.println("setup started");

  // L13点灯
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);

  // ブリッジ開始
  Bridge.begin();
  Serial.println("bridge begun");
  delay(2000);

  // MQTTブローカ接続
  while (!client.connected()) {
    Serial.println("connecting...");
    client.connect(clientid, username, password);
    delay(1000);
  }
  Serial.print("connected ");
  Serial.print(clientid);
  Serial.print(" ");
  Serial.print(username);
  Serial.print(" ");
  Serial.println(password);

  // Subscribe登録
  Serial.println("subscribing...");
  while(!client.subscribe(topicname)){
    Serial.println("subscribe failed");
    delay(1000);
    Serial.println("re-subscribing...");
  }
  Serial.print("subscribed ");
  Serial.println(topicname);


  // L13消灯
  digitalWrite(13, LOW);
  Serial.println("setup finished");
}

/*
 ループ処理
*/
void loop() {
  // PubSubClientループ処理
  if(!client.loop()){
    Serial.println("loop failed");
  }
}

/*
Subscribe対象がpublishされた時呼び出されるCallback関数
*/
void callback(char* topic, byte* payload, unsigned int length) {
  // 処理開始、L13点灯
  Serial.println("callback started");
  digitalWrite(13, HIGH);

  // JSONデータの後ろにゴミデータがある場合の対策
  char* json = (char*)malloc(length+1);
  memcpy(json, payload, length+1);
  json[length] = '\0';

  Serial.println(json);

  // JSONデータparse
  StaticJsonBuffer<100> jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(json);
  if (!root.success()) {
    Serial.println("parseObject() failed");
    free(json);
    digitalWrite(13, LOW);
    return;
  }
  JsonObject& d = (JsonObject&)root["d"];

  // 変数dからデータを取り出し、Outputピンなどを操作
  // する処理を書く


  // メモリ解放
  free(json);

  // 処理終了
  digitalWrite(13, LOW);
}




受信データはおそらくJSON形式となるためArduinoJsonライブラリを使って
可能な限りオブジェクト構造を崩さないように利用できるようにしている。

setup/loop関数は、ほぼ決まった書き方になっている。
setupでsubscribeするトピック名を引数にして渡す。
loopは基本決め打ちの書き方で、callback関数上にデータ受信時の処理を書く。

MQTT Subscriberは常に待ち受けとなるので、
このサンプルコードを逸脱した書き方にはおそらくならないはず。






また、クライアントIDは、IoT Foundationのドキュメントにフォーマットが書かれており、
a:<組織ID>:<アプリID>」となる。
組織IDは、IoT Foundationへ登録した際に決まる組織IDをそのまま使う。
アプリIDは基本自由でほかのデバイスとかぶらないように名前をつける。

2015年6月26日金曜日

【すでに治ってます】IBM IoT Foundation サイトが開かない

昨日からためしているのだけど..

くるくる回ってるだけで、ちっとも開かない..

NodeREDやその先のCloudantを見るとデータは入り続けているので
MQTTブローカ自体の機能がだめになったわけではないようだ。

で、Chromeのデバッガで調べてみたら
ja系のファイルがいくつかサイトにないらしく
開かないようだ。



つーか、日本語化しようとしたけど、デプロイ失敗しわすれたってかんじか..

で、Twitterサイトにも落ちてること連絡したけど..まだなおらない..

たのむよIBM..


にしても、全然日本人が騒がないのはなぜなんだろう..
Bluemix ChallengeとかでIoTやってる奴とかいていいはずなのに..


p.s.
AngularJSつかってるとこは、さすが先進的..
Single Page Frameworkは、いずれやらんとなあ..

そういやGWTはSingle Pageにはいるんだろうか..



p.s.

2015/06/29

朝画面見たら治っていた。
といっても日本語化する気は毛頭なく
ja→enへそのままディスパッチしているだけ..

 期待した私が悪うござんした。

新機能も追加されたわけではないのになんで画面が変わったのかな
とおもっていたら、どうもBluemixのカタログに登録されたかららしい..

といってもサービス化してもibmcloud.comなのはかわらずだけど...


2015年6月19日金曜日

Proxy環境でcfコマンドを使用する



忘備録として。


Bluemix上にボイラプレート(よく使われる複数のビルドパックのセット)からNodeRED Starterを選択せずに、単独のビルドパックNode.jsを使う場合、開発PC上にcfコマンドが必要になる。

cfコマンドは以下のサイトからダウンロードできる。
https://github.com/cloudfoundry/cli/releases


IBM ID harahara@hara2.com(パスワード:fugafuga)で登録したBluemix上(米国南部)にNode.jsをアプリID"dokidoki"で作成した場合、
以下の手順でデプロイする。

・Node.jsビルドパックでアプリID"dokidoki"としてさくせした際に表示されたcfコマンドとスタートアップのダウンロードを済ませておく。

スタートアップの圧縮ファイルは、最初にデプロイするデフォルトディレクトリに使用する。

・DOSプロンプトを起動
cd <スタートアップ展開先> ←アプリIDディレクトリdokidoki直下へ移動する
set http_proxy=http://proxy.harahara.com:8080/ ←proxy環境の場合のみ
set https_proxy=http://proxy.harahara.com:8080/ ←proxy環境の場合のみ
cf login -a -a https://api.ng.bluemix.net -u harahara@hara2.com -p fugafuga ←ヨーロッパの場合はhttps://api.eu-gb.bluemix.net
cf dokidoki -o harahara@hara2.com -s dev ← デプロイ先を指定する
cf push dokidoki ← フォルダ内のリソースがデプロイされる

後はローカルPC上で開発作業→cf push dokidokiの繰り返し。

最後にログアウトする場合は、cf logoutでOK。

現時点でデプロイ先がどこかを確認する場合は、cf api~を使う。

複数のIBM IDを乗り回している場合は、この確認をしないでpushして「あっ」となる可能性あり。要注意。

2015年6月9日火曜日

IBM IoT Foundation Trial版上のPublishデータをJavaScriptで取得してグラフ表示する


IBM IoT Foundation Traial版にようやくArdinoのセンサデータを常時送信できるようになったので、データを使う方を考えないと..

とりあえずいろいろ分析とかするより、まずカッコイイグラフで表示させてやろうか..




で検索の結果、"かっこいいグラフ"は書籍「インタラクティブデータビジュアライゼーション」

でも紹介されている

D3 Data-Driven Documents
http://d3js.org/

と、D3を使って水位表示によさげな

D3 Liquid Fill Gauge
http://bl.ocks.org/brattonc/5e5ce9beee483220e2f6

を使うことにした。


D3サイトから d3.min.js を、Liquid Full Gaugeサイトからは liquidFullGauge.js をダウンロード(もしくはコピペ)してローカルへ配置する。

JSONデータをオブジェクト化する $.parseJSON() を使いたかったので、JQueryもダウンロードしてローカルへ配置した。

Paho
https://eclipse.org/paho/

の Java client and utilities からJavaScriptライブラリをダウンロードしてローカル配置した。

jQuery
https://jquery.com/


以下、作成したindex,html ファイル。ライブラリのパスは、各自の環境に合わせて変更すること。

<注意>
以下のHTMLだとAPI Key とAuth Tokenが全世界にバレバレになるので、インターネット上のHTTPサーバには決して載せないこと。
あくまで、ローカルPCからダイレクトにブラウザで実行して見るか、FW設定で1883を開けてイントラのHTTPサーバ上にのせるとかで対処のこと(inputタグで入力させる方法もある)。

<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8">
    <title>Water Level</title>
    <script src="d3/d3.min.js" language="JavaScript"></script>
    <script src="liquidFillGauge.js" language="JavaScript"></script>
    <script src="paho/mqttws31.js" language="JavaScript"></script>
    <script src="jquery/jquery-1.11.3.min.js" language="JavaScript"></script>
    <style>
        .liquidFillGaugeText { font-family: Helvetica; font-weight: bold; }
    </style>
</head>
<body>

<svg id="fillgauge" width="19%" height="200"></svg>

<script language="JavaScript">



// MQTTブローカ(IBM IoT Foundation Trial)
var hostname = "組織ID.messaging.internetofthings.ibmcloud.com";
var port = 1883;  // ポート
var client_id = "a:組織ID:water"; // a:組織ID:アプリID(自由..らしい)
var user_name = "a-組織ID-xxxxxxxx";  // API Key生成時の"Key"
var pass = "xxxxxxxxxxxxxxxxxx";  // API Key生成時の"Auth Token"
//購読トピック指定
var topic = "iot-2/type/+/id/デバイスID/evt/+/fmt/json";


// MQTTブローカクライアント
client = new Paho.MQTT.Client(hostname, port, client_id);

// コールバック時間数を定義
client.onConnectionLost = onConnectionLost; // 接続喪失時
client.onMessageArrived = onMessageArrived; // subscribe該当データが到着時

// MQTTブローカへ接続(認証あり)
client.connect({onSuccess:onConnect, userName: user_name, password: pass});

// 接続時
function onConnect() {
  console.log("onConnect");

  // 購読対象トピックを渡してSubscribe開始
  client.subscribe(topic);
}

// 接続喪失時
function onConnectionLost(responseObject) {
  if (responseObject.errorCode !== 0) {
    console.log("onConnectionLost:"+responseObject.errorMessage);
  }
}

// subscribe指定したトピック該当データが到着時
function onMessageArrived(message) {
  console.log("onMessageArrived:"+message.payloadString);
  // 水位データをメッセージから抽出
  var waterLevel = Number($.parseJSON(message.payloadString).d.waterLevel);

  // グラフ設定(共通)
  var config = liquidFillGaugeDefaultSettings();
  config.circleThickness = 0.1;
  config.circleFillGap = 0.2;
  config.textVertPosition = 0.8;
  config.waveAnimateTime = 2000;
  config.waveHeight = 0.3;
  config.waveCount = 1;
  config.maxValue = 171;  // 満水時上限を指定する
  config.displayPercent = false;

  // 30以下で赤表示
  if(waterLevel<=30){
    config.displayPercent = false;
    config.circleColor = "#FF7777";
    config.textColor = "#FF4444";
    config.waveTextColor = "#FFAAAA";
    config.waveColor = "#FFDDDD";
  }

  // グラフ表示
  loadLiquidFillGauge("fillgauge", waterLevel, config);
}
</script>
</body>
</html>


組織IDは、IBM IoT FoundationのTrial版を登録した際に決まる文字列。

ドキュメントだと認証ありだと8883か443とか書いてあったので、ずっとそっちを指定していてはまってしまった。1883にしたら動いた

認証は IBM IoT Foundation コンソール上で API Key を生成して API KeyAuth Token (一度しか確認できない) をメモっておく。

関数onMessageArrived()の引数messageは、 Paho.MQTT.Message クラスオブジェクトで、Stringかバイトでしか受け取れない。ので、jQueryを使ってStringになっているJSON文字列を変換させて使用している。


Class Paho.MQTT.Message リファレンス
http://www.eclipse.org/paho/files/jsdoc/symbols/Paho.MQTT.Message.html


変数topic"+"はワイルドカード指定をあらわす。
topicの文字列をうまく書き換えてやれば、ほしいデータをsubscribeすることができる。

実際に表示させると以下のようになる。



ぬふー...このペースじゃ全然終わらんぞ..

2015年6月4日木曜日

Bluemix上のNode-RED画面に「Error: Lost connection to server」と表示される



BluemixでIoTボイラープレートを選択して、Node-REDのフローエディタを開くと、以下のようなメッセージが表示されて、ibmiotノードなどを使ってサーバへ接続しようとしても全然つながらない..







で、よく知っている人に聞いたら、httpsではなくhttpだとこのようなメッセージがでるらしい..

再度先頭のURLをhttpsになおして通信したら、素直につながった..


..このページのリンク誤りなんでないの?




ムカ着火インフェルノ!

..すみません、使ってみただけです..





PubSubClientライブラリを使ってArduinoからIBM IoT Foundationトライアル版へセンサデータを送信する


IoTのデモなどのためにIBM IoT Foundationと接続する場合、一番手っ取り早いのがQuickStartだ。

なので、これまではQuickStartを使っていたのだけど、そろそろSaaS(?)版の本物に近い環境での接続を試しておかないと、いざ仕事になった時にこまる。

ということでMQTTブローカの先をトライアル版の環境に変更することにした。

トライアル版を使用するには、IBM IoT Foundationサイトから「Sign up」を押して、IBM Cloud Marketplaceの「Go to Market」ボタンを押し、
Internet of Things Cloud というサイトからFree Trial 「TRY NOW」ボタンを押してIBM IDを登録(すでに持っていれば既存IDで接続)する。

有料版もあるが、執筆時点でリージョン日本ではオープンになっていなかった。

登録が完了するとメールがおくられてくるのでその中のLunch Serviceリンクを踏む。
https://internetofthings.ibmcloud.com/を開いて、ログインしてもよい。

ログインすると右上のアイコンが人マークになるのでこの人型アイコンをクリックする。
するとYOUR ORGANIZATIONに1つ組織が構築されているのでこの組織名文字列リンクを踏む(この組織名は、接続先URLの先頭の文字列となる)。



Devicesタブを選択する。



Add Deviceリンクを押し、デバイス登録画面を開く。



デバイスタイプの文字列を適当に入力する。私は使用デバイスの名称(arduino)にした。
Device IDにはMACアドレス(小文字コロンなし)を入力し、Continueボタンを押す。



表示された情報を記録し、Doneボタンを押す。



表に追加したデバイスがあらわれ、すでに接続済みであれば先頭のマークが緑色になる。LastEventの+マークを押せば、接続した履歴が表示される。接続されていない場合は赤い■マークがかわりに表示されている。



Arduino側のプログラムはtokenを使った認証が必要となる。先ほとデバイス登録直後メモした情報を使用する。

PubSubClientライブラリを使ったプログラムについては、

Arduino YUN上の温湿度センサデータをIBM IoT Foundation QuickStartへ送信する


に書いた記事を参考のこと。

PubSubClientオブジェクトの生成部分が以下のようになっている場合、

PubSubClient client(serverName, 1883, 0, c);

serverNameを「<組織名>.messaging.internetofthings.ibmcloud.com」に変更する。

次に、PubSubClientオブジェクトのconnect()を実行する箇所は、引数3つの関数に変更する。

client.connect(clientName, userName, password);

clientNameは「d:<組織名>:<デバイスタイプ>:<デバイスID(MACアドレス小文字コロンなし)>」を指定する。

userNameは、「use-token-auth」という固定文字列を指定する。

passwordは、デバイス登録直後にメモしたauth-token値を指定する。

トピック名の指定方法はQuickStartの際の記述方法と同じなので省略する。詳細は以下のサイトを参照のこと。

MQTT client connection
https://docs.internetofthings.ibmcloud.com/messaging/mqtt.html#mqtt-client-connection

2015年5月29日金曜日

Arduino YUN のファームウェアを更新する


2015/12/22追記
現在のArduino YUNのファームウェアは、以下の手順ではアップロードできない。
どうもイメージサイズが大きくなりwgetしても展開できないようになったらしい..
今現在サイトにかかれている手順では、PC上でブラウザ経由でイメージを
ダウンロードして、そのあとmicroSDへ格納、YUNの裏側にあるスロットにセット
してminiUSBケーブルをPCに接続し通電、EtherかWiFiかどっちでもいいので
YUNのIPアドレス先へsshすると、microSDが自動的に/mnt/sd1以下にマウント
されているのでsysupgradeすればよい..らしい。
実は、試してません。手持ちのYUNは全部アップデートしちゃってるので..
だめだったりしたら、ごめんなさい.. 

p.s.
スイッチサイエンス社の通販ならファームをアップデートしたやつが入手できるらしいです..

------


Arduino Ethernet Shield2 を手に入れた時、最新のArduino IDEを入手するために http://arduino.org/ のDownloadサイトへ入った時、YUNのファームウェア更新云々の文言があったのだけど、見て見ぬふりをしていたが、ようやく重い腰を上げて更新した。

簡単な方法を推奨していたので、もちろん簡単な手順の方で更新した。

手順は以下のとおり。
--------
  • Arduino YUNを起動する(WiFiでも、EthernetでもよいがIPアドレスは確認しておく)
  • PCをArduino YUNと同一のセグメントのネットワーク上に配置する
  • PCからターミナル接続ソフトウェアでSSH接続する(rootのデフォルトパスワードはarduino)




以下のようにコマンドを実行する

 root@Arduino:~# cd /tmp
 root@Arduino:/tmp# wget http://download.linino.org/linino_distro/master/latest/openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin
 --2015-05-29 14:19:48--  http://download.linino.org/linino_distro/master/latest/openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin
 Resolving download.linino.org... 88.198.63.58
 Connecting to download.linino.org|88.198.63.58|:80... connected.
 HTTP request sent, awaiting response... 200 OK
 Length: 16073654 (15M) [application/octet-stream]
 Saving to: `openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin'
 
 100%[===================================================================================================================>] 16,073,654   448K/s   in 38s    
 
 2015-05-29 14:20:26 (417 KB/s) - `openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin' saved [16073654/16073654]
 
 root@Arduino:/tmp# sysupgrade -v openwrt-ar71xx-generic-linino-yun-16M-250k-squashfs-sysupgrade.bin
 Saving config files...
 etc/uhttpd.crt
 etc/uhttpd.key
 etc/uhttpd.key
 etc/uhttpd.crt
 etc/sysctl.conf
 etc/shells
 etc/shadow
 etc/rc.local
 etc/profile
 etc/passwd
 etc/inittab
 etc/hosts
 etc/group
 etc/dropbear/dropbear_rsa_host_key
 etc/dropbear/dropbear_dss_host_key
 etc/config/wireless
 etc/config/uhttpd
 etc/config/ucitrack
 etc/config/ubootenv
 etc/config/system
 etc/config/network
 etc/config/luci
 etc/config/fstab
 etc/config/firewall
 etc/config/dropbear
 etc/config/dhcp
 etc/config/arduino
 Sending TERM to remaining processes ... uhttpd dbus-daemon dnsmasq thd ntpd uSD aemon syslogd klogd hotplug2 ubusd netifd
 Sending KILL to remaining processes ... uhttpd
 Switching to ramdisk...
 Performing system upgrade...
 Unlocking firmware ...
 
 Writing from to firmware ...    
 Appending jffs2 data from /tmp/sysupgrade.tgz to firmware...
 Writing from to firmware ...  [w]TRX header not found
 Error fixing up TRX header
    
 Upgrade completed
 Rebooting system...

根気よく待つとSSH接続が切れる。切れたら、再度Arduino YUNへSSH接続し直す。



..あきらかに、更新されたかのようなアスキーアートが表示される。

..Web UIもかっこよくなってる.. ファームのくせに、生意気だ;-p



2015年5月28日木曜日

Intel Edison for Arduino上の光センサデータをIBM IoT Foundation QuickStartへ送信する



前の記事

Arduino YUN上の温湿度センサデータをIBM IoT Foundation QuickStartへ送信する

ではArduino YUNを使ったのだけど、今回はIntel Edison Kit for Arduinoで試してみた。
ただ、DHTライブラリをつかおうとすると、ヘッダファイルに埋め込まれた"#error CPU SPEED NOT SUPPORTED"にひっかかってしまったので、以下の光センサを使った。

スイッチサイエンス:Grove - 光センサ


配線はほぼDHTの場合と同じ。オス・オスのジャンパ線で以下のように結線した。

  • 光センサ側GND(黒)→Edison(Arduino)GND
  • 光センサ側VCC(赤)→Edison(Arduino)5V
  • 光センサ側SIG(黄)→Edison(Arduino)A0




Edisonのほうは、前に書いた記事

Intel Edison をセットアップしてLチカまで持っていく


を済ませて、PuTTYから「configure_edison --setup」を実行して初期設定をすませておいた状態のものを使った。


Edison用のArduino IDE(執筆時1.6.0)を起動して、ボードを「Intel Edison」、ポートを「Intel Edison Virtual COM Port」のCOM番号を選択しておく。ライブラリは前の記事を参考のこと。

Sketchプログラムは、以下のとおり。

#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>

// Intel Edison Kit for Arduino

// MAC アドレス(PuTTYでifconfigすればわかるので書き換える)
byte mac[]    = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
char macstr[] = "xxxxxxxxxxxx";

// WiFi(環境に合わせて書き換える)
char ssid[] = "XXXXX";
char pass[] = "XXXXXXX";

// クライアントオブジェクト
WiFiClient c;

// 光量センサ

// LIGHT sig ピン
#define LIGHTPIN A0

float lightLevel = 0.0;


// MQTTブローカ

// PC (mosquitto)
//byte localserver[] = {192, 168, 1, 13 };
// IBM IoTF quickstart
char servername[]="messaging.quickstart.internetofthings.ibmcloud.com";

String clientName = String("d:quickstart:arduino:") + macstr;
String topicName = String("iot-2/evt/status/fmt/json");

// MQTTクライアントオブジェクト
//PubSubClient client(localserver, 1883, 0, c);
PubSubClient client(servername, 1883, 0, c);

void setup() {
  // シリアル初期化
  Serial.begin(9600);
  while (!Serial) {
    ; // 待機
  }
  Serial.println("Start serial");
 
  // WiFi 初期化
  WiFi.begin(ssid, pass);
  Serial.println("Start wifi");
 
  // 待機
  delay(2000);
}

void loop() {
  char clientStr[34];
  clientName.toCharArray(clientStr,34);
  char topicStr[26];
  topicName.toCharArray(topicStr,26);
  getData();
  if (!client.connected()) {
    Serial.print("Trying to connect to: ");
    Serial.println(clientStr);
    client.connect(clientStr);
  }
  if (client.connected() ) {
    String json = buildJson();
    char jsonStr[200];
    json.toCharArray(jsonStr,200);
    boolean pubresult = client.publish(topicStr,jsonStr);
    Serial.print("attempt to send ");
    Serial.println(jsonStr);
    Serial.print("to ");
    Serial.println(topicStr);
    if (pubresult)
      Serial.println("successfully sent");
    else
      Serial.println("unsuccessfully sent");
  }
  delay(5000);
}

String buildJson() {
  String data = "{";
  data+="\n";
  data+= "\"d\": {";
  data+="\n";
  data+="\"myName\": \"Intel Edison for Arduino Light\",";
  data+="\n";
  data+="\"lightLevel\": ";
  data+=(int)lightLevel;
  data+="\n";
  data+="}";
  data+="\n";
  data+="}";
  return data;
}

void getData() {
  int sensorValue = analogRead(LIGHTPIN);
  lightLevel = (float) (1023-sensorValue)*10/sensorValue;
}

前の記事に書いたとおりIBM IoT FoundationのTry QuickStartからMACをアドレスを指定してしばらく待つと、グラフ表示される。


光センサの補正は、どこかの本で書いたものを使ったが、補正は必要かな。

Arduino IDEのWiFiライブラリがつかえるのがありがたい。これでWiFi接続がとっても簡単。

でも本当はmarrとかをJavaScriptで書かないとダメなことはわかっているんだけど..

しかもEdisonでpsしたら、mosquittoあがってるし..ブローカとしてEdisonを使ってあげるのが正しい?!

Google Colab相当の環境をローカルPC上のDocker Composeで実現する

 Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...