2016年12月29日

[mbedtls]mpiのビット

mbedTLSを使おうとしている。
まずはBash on Windowsで動作確認だ。

サンプルを見ていると、mbedtls_mpiで大きい数字を取り扱うようだ。
元に戻すときはuint8_tなどで取得できるのだが、エンディアンはどうなっているのだろうか?

    mbedtls_mpi m;

    mbedtls_mpi_init(&m);
    mbedtls_mpi_read_string(&m, 10, "4660");        //0x1234
    for (int lp = 0; lp < 16; lp++) {
        if (mbedtls_mpi_get_bit(&m, lp) == 0) {
            printf("0");
        } else {
            printf("1");
        }
    }
    printf("\n");
    uint8_t u16[2];
    mbedtls_mpi_write_binary(&m, u16, 2);
    printf("%02x %02x\n\n", u16[0], u16[1]);

    mbedtls_mpi_free(&m);

結果

0010110001001000
12 34

 

ほう、そう来るか。
ビット0は、一番下のビットになるんだ。

[py]PythonのソースをAndroidで動かせないものか→今回はあきらめた

pythonでいくつかソースを書いて、テストしている。
ネットから情報を取得して加工するとか、コマンドラインからの入力を加工してネットに上げるとか、その手のソースだ。

今のところ、pythonはWindowsやLinuxでしか動かしていない。
が、Androidくらいなら動かせないだろうか?と思うではないか。
Androidで動くなら、もうちょっとやれることが増えるかもしれない、ということで、環境を調べてみた。

思ったよりも、色よい返事(検索結果)がない。。。
まあ、私もネイティブの言語で動かすのが筋だとは思っているのだが、とりあえず動けばよい、というレベルの場合、多少不具合があったとしても最初に書いたコードがそのまま使えるのがありがたいのだ。

 

出てきたのは、python for androidとQPython。
なんとなく、python for androidを試してみることにした。


python for android

開始記事を見ながらやるものの、なかなか難しい。
難しいというか、これを書いている時点ではまだうまくいっていない。
Getting Started — python-for-android 0.1 documentation

 

まず、Ubuntu on Windowsを起動。
Installing Dependenciesを見て、apt-get installなどを実行。
Arch Linuxの方はやっていないが、これはMac用なのかな?
続けて、pipを使ってcython、virtualenvをインストール。
python-for-androidはgitの方を使った(pipのだとrecipesでエラーが出たので)。

Android SDKとNDKがいるようなので、インストールする。
が、Bash on WindowsはGUIが使えないので、コマンドラインツールだけをダウンロードし、unzipする。
その後は、tools/androidコマンドを使ってSDKをインストールする。
コマンドライン (CUI) から Android SDK をインストールする | blog.tyye.net
APIは19にした。
21以上だと、ビルド時にチェックされて使えないようなのだ。

環境変数も書いてあるように設定して、p4aを実行。
オプションの指定は、こちらをまねした。
kivy/python-for-android: Turn your Python application into an Android APK

$ p4a apk --requirements=python2 –private $HOME/android/app/helloworld --package=com.blogpost.hiro99ma.helloworld --name="helloworld" --version=0.1 --bootstrap=sdl2

よくわからんが、テンプレートでも作ってくれるんじゃないのか?
"planewavessdl2"という名前のサンプルがあるのかと思ったけど、リポジトリを検索しても出てこないし。

これが、長い。。
いろいろとダウンロードしてビルドしてくれている。

 

そして、エラーが出た。
main.pyが無い、と。
Hello world — python-for-android 0.1 documentation
ドキュメント内を検索したら出てきたので、そのファイルを置いた。
が、ここって古いp4aのドキュメントだから、あやしいかも。

dxコマンドを実行しようとして、Javaのバージョンがあわないとかなんとか。
build-toolsは少し古いものを入れたのだが、どうもbuild-toolsフォルダに新しいのが入っているとそちらが使われるようだ。
linux - Remove Android SDK packages from command line - Stack Overflow
アンインストールは、単なる削除でよいらしい。

ビルドし直すと、またエラーが。
今度は、aaptが「Syntax error: "(" unexpected」といってくる。
バージョンの違いで文法が変わったのか?と思ってbuild-toolsをさらに古くしたが、変わらない。

場所は、~/.local/share/python-for-android/dists/unnamed_dist_1あたりで作業しているようなのだけど、フォルダ構成がeclipseでやっていたときの構成に似ている。
cdで移動して、"ant debug"とすると、やはりaaptのエラーで終わった。
tools/ant/build.xmlを見ると、"aapt –> R.java"というコメントがあるので、その関係だとは思うのだが、ちょっと動かしてみたいというだけでここまで苦労するのは作業的に厳しい気がする。
やはり、githubじゃなくてpipのpython-for-androidを使うべきなのだろうか。。。
Bash on Windowsを使っているというのも不安なところだ。

 

2016年現在の「Python を android で使う」 | site-hhs
こちらを読むと、今わたしが見ていたpython-for-androidはkivyというプラットフォーム関係のようだ。
たしかにビルド方法の説明でも「Kivyアプリ」「Webアプリ」「SDL2ベースアプリ」の3種類に分かれていた。
そこら辺がわからんとダメなんかなぁ。

というわけで、今回はあきらめた。
Cにでも移植しよう。

2016年12月27日

[hw]FFC/FPCのコネクタ

薄い、ぺなぺなしたケーブルを挟む部品がある。

 

たとえば、RC-S730やRC-S620/Sだ。
これは、ケーブルを差し込むだけのコネクタ。

image

 

SB1602や、RC-S620/Sの反対側として購入したコネクタ。
これは、ケーブルを挿して、部品で押さえ込むようになっている。

image

 

これは、なんという名前なのだろう?

ケーブルの方は、フレキと呼んでいた。
フレキシブルケーブルの略だと思うのだが、一般的にはFPC/FFCなどと呼ばれるようだ。
FPC・FFCとは何ですか? | よくあるご質問(FAQ) | 制御機器 | 電子デバイス・産業用機器 | Panasonic

おそらく、RC-S620/Sなどに挿すタイプのケーブルは、FFCだ。
そして、SB1602の裏にある橙色のケーブルは、FPCだ。

 

では、そのコネクタはどういうものがあるのだろうか?
先ほどのページに関連する質問があった。
FPCコネクタにはどのような種類がありますか? | よくあるご質問(FAQ) | 制御機器 | 電子デバイス・産業用機器 | Panasonic

図で、図で教えてほしいのだけど。。。
他の人に聞いたら、こちらを教えてもらった。

コネクタの構造について | コネクタメーカー イリソ電子工業株式会社

タイプが列挙されているのだが、まずはケーブルとではなく、方向で分類されている。

  • ストレート
  • ライトアングル

次に、基板にどう取り付けるのか。

  • SMT
  • DIP

そして、ケーブルの挿し方。

  • ZIF
    • スライダーロック
    • フリップロック
  • NON-ZIF

上記で写真に載せたものは基板と平行になっていたので、ライトアングル。
基板の上にハンダ付けしているので、SMT。
部品で押さえ込む方がスライダーロックで、RC-S620/Sのように挿すだけなのがNON-ZIFか。

 

ここまでわかれば、部品検索も簡単かと思ったが、それが全然ダメだ。。。

まず、ケーブルのピン数(ポジション数)と、ピンの間隔(ピッチ)。
RC-S620/Sは6ピンで、間隔は0.5mmくらいだ。6ピンだと端と端の間が5つで2.5mmくらいだからだ。

ストレートでSMTの場合、基板に垂直に取り付けることになるからか、ピンの生え方が1列タイプと2列タイプがあるようだった。

そして、FFCの厚さやコネクタ自体の厚み、定格電圧、動作温度、材料、材質・・・・・・・・・

 

きーーー!

同じものを探してみようとしたが、形状が微妙に違ったり、色が違ったり。
詳細を見ると、写真ではなくカタログPDFを参照してください、などとあり、逆引きするのは難しいと思った。

2016年12月25日

[esp8266][rtos]lwIPのSNTPを使う

ネットを使うと、何かと時間が取得したくなる。

時間といえば、NTP。
NTPから時間を取ってくるシンプルな手順が、SNTP。
SNMPとごちゃまぜに覚えてしまっていたのだが、Simple NTPと覚えよう。

 

ESP8266のRTOS SDKでも時間が取得したくなったので、RFC2030を見たり、他の人のまねをしながら実装したものの、どうやらlwIPのSNTPがあるようだった。
しまった。。。

非同期で時間を取ってくるため、取得できるまではsntp_get_current_timestamp()に0が返ってくるようだった。
これは、while()などで待たせればよいだろう。
lwIPにtime()も持っているのだが、これを使うとlibcの方と競合してしまうので、やめておいた。

#include "lwip/apps/sntp.h"

...
    sntp_setservername(0, "ntp.nict.jp");
    sntp_set_timezone(9);  //JST
    sntp_init();
    u32_t t;
    while ((t = sntp_get_current_timestamp()) == 0) {
        printf(".");
        vTaskDelay(1000 / portTICK_RATE_MS);
    }
    printf("\ntime=%d\n", (int)t);
...

NTPサーバにsendto()するのはsntp_init()を呼んだ場合のようだから、定期的に実行するならsntp_close()せずにsntp_init()を呼ぶだけでもよさそうだし、毎回sntp_close()してもよいのではなかろうか。
このモジュール自体は、再送などはしてくれるようだが、定期実行はしないように見える。

 

せっかくSNTPをsocketでやる部分も作ったので、GISTに置いておこう。
sntp client(socket)

Bash on Windowsでビルドして動いたので、Linux系だったら動くんじゃなかろうか(bind()のために実行時はsudoせんといかんが)。
ちょっと変更すれば、RTOS SDKでも動く。

[nrf51][mbed]BLE NanoのLED制御

久々にBLE Nanoを動かしたのだが、mbedのオンラインコンパイラでビルドできるようだった。
以前できなかった、というわけではなく、単に私がやったことがないだけだ。

実装が少なくてサービスを組み込めることは分かったのだが、もうちょっとmain()と切り離したかったので、サンプルを見ながら置き換えてみた。

BleNanoLed - a mercurial repository | mbed

 

ベースは、BLENano_SimpleControlsだ。
API仕様などは見ず、サンプルソースの配置を換えただけだ。

あとは、ここからテンプレートを作ればBluetooth Developer Studioのプラグインにできるんじゃないかなぁ、などと想像しているのだが、いかんせん最近はBLEをお仕事でやることがなくなってきたので、このまま放置になるかもしれん。

2016年12月24日

[esp8266][rtos]socketでのTCP client

ようやく、ESP8266 + RTOS SDKでsocketを使ったTCP client試作ができた。

hirokuma/esp8266_rtos_tcp_client: TCP client for ESP8266_RTOS_SDK

何に時間がかかったかって、IPアドレスの文字列が間違っているということに気付かなくて1時間以上悩んでいたのだ。
間違っているとconnect()に失敗するのだけど、即座にエラーが返るんじゃなくて、時間がかかって返ってくるのだ。
だから、なんか通信がうまくいっていないんだろうかとか、いろいろな要因を探し回ってしまった。

 

とりあえず動かしてみたいのであれば、include/con_ap.hを自分のAPに変更し、include/tcp_client.hのIPアドレスとポート番号をTCPサーバのものに変更すればよいだろう。
今回も、TCPサーバとしてはWindowsのHerculesを使った。
接続できたらメッセージを飛ばすので、後はサーバからsendすると、そのままエコーバックするだけだ。

 

本体は、ここ。
esp8266_rtos_tcp_client/tcp_client.c at master · hirokuma/esp8266_rtos_tcp_client
受信をrecv()で同期待ちさせることができるのがありがたい。
これで、受信待ちタスクと送信タスクを別々にして、受信したら送信タスクに要求を投げる、という、よくあるsocketプログラミングができそうだ。

[nrf51][win][bds]Bluetooth Developer Studioを使う(2016/12/23)

ノートPCを買い替え、まだNordicの開発環境を作っていないので、作りながら記録を残しておく。

BLE peripheral側は、nRF51822が載っているBLE Nanoを使うことにしよう。
古いのと新しいのでRAMのサイズが違うようだが、まあ気にしないでおこう。
この子であれば、J-Linkなどがなくても、USB経由で焼けるんじゃなかろうか。
RedBearLab BLE Nano - スイッチサイエンス

先に言っておくことになるが、mbed環境は使わない。。
まだBluetooth Developer Studioのコード生成がmbedに対応していないというか、mbed用がないのだ(たぶん)。
コード生成はプラグインで、プラグインはJavaScriptで書けばよいから、そのうち誰かが作ってくれるのかもしれないが、まだ時代が追いついていないのだ。。

 

BLE central側は、AndroidのNexus5(Android 6.0.1)を使う。
たぶん、Android 5.1以上あれば動くんじゃなかろうか。

Android側は、Bluetooth Developer Studioが自動生成するくらいで、あまり説明しません。
説明するものが無いというか、他を読んだ方がよいというか。。

 

中身は、Bluetooth Developer Studioで作っていく。
大したものを作る気がないので、BLE Nanoに載っているLEDを制御する、ということにしておこう。
たぶん、Bluetooth Developer Studioでやるのが、一番簡単だと思う。
残念なのは、Windowsでしか動かないというところだろうか。


まず、Bluetooth Developer Studioをダウンロードする。
名前、会社名、メールアドレスの入力が必須なのはうっとうしいが、仕方ない。
https://www.bluetooth.com/download-developer-studio

今日2016/12/23は、DeveloperStudio_1_1_3135_0.exeがダウンロードされた。


起動する。
SIGN INなどあるし、Bluetooth SIGは無料で入会できるようにはなっているのだが、会社として登録することになる。
だから、無視だ。

image

 

「NEW」をクリック。
UUIDは勝手に決めてくれているので、変更したくなければそのままでよい。
今回は「NanoLed」という名前にしておこう。
なお、ここのNAMESPACE欄は、Androidアプリを作るときにも使われるので注意しておこう。

image

 

OKするとダイアログが閉じて、「New Profile」とだけ書かれた画面が出てくる。
そこをクリック。

image

ここは特に使わないので、New Profileのところを「NanoLed」に変更して、SAVE。
変更したけど、しなくてよいのかもしれん。

次は、右側にある「CUSTOM SERVICE」をクリック。
ここからが本番だ。


image

サービス名が「NanoLed new service」と長いので、newを削除することにした。
これは、後でソースを自動生成するときのファイル名になる。

 

左側にある「+」ボタンをクリック。
これはServiceにCharacteristicを追加するボタンだ。

今回は、1サービス、1キャラクタリスティック(書込みのみ)を作ってみよう。
書込みすると、それに応じてLEDが点いたり消えたりする、という目論見だ。
黄色で囲んだところを変更させる。

image

↓↓↓

image

適当に名前を付けて、WRITEをMANDATORYにする。
WRITEとWRITE WITHOUT RESPONSEの違いは、結果が返ってくるか来ないかだけの違いなので、今回はどうでもよい。

後から読み返して分かるようにしておきたければ、この下にあるINFORMATION TEXTなどにメモを残しておけばよいだろう。
他の画面にも、同じような欄があるから、丁寧にやるときは入力しておくと、人に渡すときに親切だったり、数ヶ月後の自分に親切だったりするかもしれない。

これで名前は付いたものの、このCharacteristicが何バイトなのかとか、どういう設定ができるのかが決まってない。
これはFIELDを入力していくことになる。
画面下左にある「ADD FIELDS」をクリックだ。

image

NAMEと、FORMATくらいは入力することになるだろう。
ONとOFFの設定ができればよいので、8bitあればよいだろう。
名前はonoffにした。
入力したら「DONE」をクリック。


image

戻るので、「SAVE」をクリック。

これで、サービスの入力が終わった。
お疲れ様でした。

他の項目もきれいに入力しておくと、レポート出力機能でそれっぽいものをHTMLで出すことができる。
まあ、気が向いたらやってみるのもよいだろう。


ここまでできたら、nRF51822とAndroidのソースの自動生成をさせたいのだが、プラグインがまだ入っていない。
プラグインは、Bluetooth SIGからダウンロードしたり、Nordicのサイトからダウンロードしたりする。

Bluetooth Developer Plugins | Bluetooth Technology Website

下の方にプラグインの一覧がある。
今回は、Android Plugin v1.0と、bds_plugin_1.2.2_nRF5_SDK_11.0.0.zipを使う。
nRF5 SDKはv12を使う予定だが、まあ使えるんじゃなかろうか。

Androidのプラグインは、解凍するとファイルがべたっと入っているので、Android_Client1.0とでも名前を付けたフォルダを作って移動させる。
そして、フォルダごとプラグインフォルダに移動させる。
Windows10 64bitのデフォルトだと、C:\Program Files (x86)\Bluetooth SIG\Bluetooth Developer Studio\Plugins、の中に移動させる。
Nordicのプラグインは、解凍するとpluginsフォルダがあるので、その中に入っているNordic Semiconductor v1.2.2を移動させる。
Program Filesの中におくので管理者権限がいるのだが、まあよかろう。

 

もしBluetooth Developer Studioを立ち上げたままだったのであれば、プロジェクトを保存して立ち上げ直そう。
立ち上げ直してプロジェクトを開き、メニュー「TOOLS > GENERATE CODE」を選ぶとダイアログが開く。

一番上の「GENERATE CODE FOR」で、Server側かClient側かを選ぶ。
今回は、PeripheralがServerで、CentralがClientになる。
BLE NanoがServerで、AndroidがClientだ。
データを持っている方がServerになるので、PeripheralがServerになることが多いだろう。

下の「SAVE TO」に書いているフォルダに出力するので、ServerとClientは出力先を変えた方がよい。

image

image

 

nRF5用の生成ソース

image

 

Android用の生成ソース

image


では、BLE Nano側のビルドを行う。
オンラインmbedコンパイラで楽々、と行きたかったのだが、無理そうなのでKeiliでビルドする。
https://www.keil.com/demo/eval/arm.htm

ここが一番面倒かも。
まあ、ほどほどに入力すればよいだろう。
今だと、MDK522.exeがダウンロードされた。

Keilは面倒、ということであれば、gccでもよいだろう。
私は普段gccを使っているのだが、今回はなるべく手動を減らすことを目的にしているので、Keilにしたのだ。
まあ、gccを使える人であれば、ここから先は雰囲気さえ分かれば対応できると思う。

Keilをインストールし終わると、Packageのデータをダウンロードするので、待つ(下にプログレスバーが出る)。
終わったら、終了させよう。

次に、nRF5 SDKをダウンロードする。
v13はまだalpha版なので、v12.2.0をダウンロードし、適当な場所に解凍した。
あ、「適当な場所」というのは、フォルダ名に日本語とかスペースとか入っていないような、あまり深すぎない場所、という意味だ。
私は「C:\Prog\nrf5\nRF5_SDK_12.2.0_f012efa」という場所に置いた。
developer.nordicsemi.com:/nRF5_SDK/nRF5_SDK_v12.x.x/

解凍したフォルダの中に「examples\ble_peripheral」があり、そこに「experimental_bluetoothds_template」がある。
これをフォルダごとコピーして、同じ場所に別名でペーストしよう。
今回は「experimental_bluetoothds_nanoled」という名前にした。

そして「examples\ble_peripheral\experimental_bluetoothds_nanoled\pca10028\s130\arm5_no_packs」という場所に「bluetoothds_template_pca10028_s130.uvprojx」というファイルがある。
たぶん、緑色のアイコンになっていると思うので、それをダブルクリックするとKeilが立ち上がってくれる。
そうすると、おそらく足りないものをダウンロードするよう要求してくるので、YesYesいっておく。

ここまでやって「examples\ble_peripheral\experimental_bluetoothds_nanoled」を見ると、こうなっていると思う。

image

この中に、先ほど生成されたソースをコピーする。
上書きも気にせずやってしまう。

image

service_if.c,hは上書きになるが、ble_nanoled_service.c,hは新規なので、プロジェクトに追加が必要だ。
Keilの左側にあるツリーのApplicationで右クリックし「Add Existing Files to Group 'Application'...」をクリックし、追加しよう。

image

 

そして、ビルド!
・・・service_if.cでエラー発生。
これは、ログ周りが変更になったためと思われる。
どうせログは今回見ないので、こんな感じで無効にしておこう。

#include "app_trace.h"
  ↓
//#include "app_trace.h"
#define app_trace_log(...)

これでビルドすると、".\_build\nrf51422_xxac.axf"というファイルができたらしい。
axf、というのは、ARMのELF形式みたいなものだろう。
ARM社のコンパイラでビルドすると、axfファイルができるのだ。


まずは、ここまででBLEのCharacteristicが見えるかどうかを確認しておこう。

 

mbedは、USB接続するとファイルシステムとして見えて、そこにファイルを置くと焼いてくれる、というしくみになっている。

「components\softdevice\s130\hex」においてある「s130_nrf51_2.0.1_softdevice.hex」をD&D。
そうすると、親基板のLEDが高速点滅して、勝手にアンマウントして再接続された。
続けて、「examples\ble_peripheral\experimental_bluetoothds_nanoled\pca10028\s130\arm5_no_packs\_build」にある「nrf51422_xxac.hex」をD&D。
これも同じく。
焼き終わったら、一度はずして、付け直した方がよいのかな?

 

BLEのperipheralが動いているかどうかは、スマホアプリを使って確認するのが簡単だ。
私はnRF connectというNordicのアプリを使っている。
nRF Connect for Mobile - Google Play の Android アプリ

が、iOSだったらLightBlueに軍配が上がるかも。
LightBlue Explorer - Bluetooth Low Energyを App Store で

まあ、いろいろ使ってみるとよいだろう。
Android版の場合、動いていると「Nordic_BDS」という機器がAdvertisingしているので、CONNECTするとCharacteristicが見える。

image

矢印が上向きは、WRITEの意味。
UUIDは作ったときのものなので、ここまで同じ手順で作っていても別の番号になっていることだろう。

 

あっさり書いているが、実は焼くのに手間がかかっていた。
というのも、うちのBLE Nanoはいろいろやっていたためか、ファームウェアがmbedで使うものになっていなかったのだ。

RedBearLab BLE Nano | mbed
ここの回路図の下にある「Interface Firmware」の手順に従ってファームウェアを書き換えると、SoftDeviceのHEX→ビルドしたHEXの順に焼いて動くようになった。

HEXファイルをマージすると安心ではあるのだが、SoftDeviceを書き換えることはめったにないので、一度このようにして動くのが確認できれば、あとはビルドしたHEXだけをD&Dで焼けばよいはずである。
まとめるのは、mergehexというツールがあるようだが、上記手順までではインストールされなかったので、nRF Toolsに入っているのかもしれん。

動かなかったとしても、フォローできないので先に進もう。


ここまでで、BLE NanoのCharacteristicが見えていたなら、残っているのはCentralからの書込に応じてLEDの点灯状態を変更する、というところだけが残っていることになる。

Centralから書込まれると、service_if.cのon_nanoled_service_evt()が呼ばれ、case文のBLE_NANOLED_SERVICE_LED_EVT_WRITEに分岐することになる。
BLE Nanoに載っているLEDを変更したかったら、このcase文に書けばよいだ。

書込まれた値は、Bluetooth Developer StudioのFIELDで「onoff」という名前を付けたので、それでgrepしよう。
ble_nanoled_service_led_tというstructのtypedefに入っている。
そしてble_nanoled_service_led_tはble_nanoled_service_evt_t.paramsの中に入っている。
さっきのcase文が入っている関数はble_nanoled_service_evt_tが引数で渡されるので、そこからonoffを探せばよいだろう。

 

試したところ、BLE NanoのLEDは、GPIOの19番になっていた。
そして、アクティブLOになっていて、0で点灯、1で消灯のようだ。

service_if.cを以下のように変更すると、AndroidのnRF connectアプリでCharacteristic書込みを行うとLED制御できた。

  • bluetooth_init()
    • nrf_gpio_cfg_output(19);
  • on_nanoled_service_evt()
    • BLE_NANOLED_SERVICE_LED_EVT_WRITEの中
      • p_evt->params.led.onoffが0なら19番に1、0以外なら0書込み

 

static void on_nanoled_service_evt(ble_nanoled_service_t * p_nanoled_service, ble_nanoled_service_evt_t * p_evt)
{
    int onoff;
    switch (p_evt->evt_type)
    { 
        case BLE_NANOLED_SERVICE_LED_EVT_WRITE:
            app_trace_log("[Bluetooth_IF]: NANOLED_SERVICE_LED evt WRITE. \r\n");
            if (p_evt->params.led.onoff == 0) {
                onoff = 1;
            } else {
                onoff = 0;
            }
            nrf_gpio_pin_write(19, onoff);
            break; 
        default:
            // No implementation needed.
            break;
    }
}

 

uint32_t bluetooth_init(void) { ... nrf_gpio_cfg_output(19); nrf_gpio_pin_write(19, 1);

  ... }

修正したらKeilでビルドして、できたHEXファイルをBLE Nanoに書込む。
SoftDeviceは、消さない限りは前のが残っているようだ。

焼いた後は立ち上げ直して、スマホアプリからCONNECTし、Characteristicに0x00かそれ以外を書込めば、LEDが消えたり点いたりするはずだ。

BLE Nanoはここまで。


Androidアプリは・・・力尽きたので省略だ。

自動生成した中にbatファイルがあるので、Android Studioで新規生成したプロジェクトのフォルダを引数に指定して実行すると、ファイルがコピーされるようになっている。

以前のここを参照しておくれ。
http://hiro99ma.blogspot.com/2016/02/bleandroidbluetooth-developer.html

2016年12月23日

[esp8266][rtos]RTOS版サンプル(TCP Client)はsocketを使ってない

TCPで通信するRTOS版のサンプルを動かしてみようとインストール先を見たが、なかった。
rtos_sdk_programming_guideを見るとsocket()が使えるようで、lwipらしいのだが、RTOS版のAPIドキュメントにはそこら辺は載っていないようだ。
socketが使えるのはRTOS版のよい点だと思うので、そこから見ていきたい。

 

名前からすると、githubのここでよいのだろうか?
espressif/esp8266-rtos-sample-code

これの、04Protocal/TCP_Client_Demoを動かそう。
たぶんProtocolの誤記だとは思うけど、キーボードで打ち込むときは間違えそうだ。

  • tcp_client/tcp_client.h
    • tcp_server_ipをサーバのIPに変更
    • ポート番号も、気に入らなければ変更
  • tcp_client/conn_ap.c
    • DEMO_AP_SSIDとDEMO_AP_PASSWORDを自分のAPに変更

このくらいで動く。
UARTログをデフォルト速度以外で見たいなら、uartのドライバを入れてuser_main()などで変更しよう。
デフォルトが中途半端な速度なのをなんとかしてくれんだろうか。。。

 

ビルドはできたものの、TCP clientとして動くので、サーバ側を用意しなければならん。
今回はStackoverflowで紹介されていたツールを使ってみよう。

RS232 terminal, serial port terminal, udp terminal, tcp/ip client server – Hercules

image

最初、APの設定を「隔離モード」にしていたので、PC側につながらずにRECONNECTを繰り返していた。

接続できると「Hello!This is a tcp client test」を受け取っている。
あとは、こちらが送信した文字列をエコーバックするだけのようだ。


本体は、ほとんどtcp_client.cに入っている。
しかしtcp_client.cの中には、UDPやらTCP serverやらも混ざっている。。。
tcp clientとしては、一番上からTcpLocalClient()までを使っていて、そこから下は不要のようだ。

じゃあ、ここからsocket()を見ていこうかと思ったら、無い!
PDFの書いてあるTCP clientの説明と違うじゃないか。。。

gitからcloneしたソースをgrepすると、openssl_demoとかmulticast_demoなどでsocket()を使っているようだったが、単純なサンプルには使っていなさそうだ。
だまされたのか。。。

 

よくわからんが、PDFにはコードも載っているし、書き換えてみるか。。

[win]c:\Windows\System32\bash.exeは特殊

やりたかったのは、ランチャアプリからBash on Ubuntu on Windowsのコンソールを起動したい、というだけのことだった。
それがここまではまることになろうとは。。。
そして、結果として動かすことができなかった。

 

WindowsのスタートメニューにBash on Ubuntu on Windowsのショートカットがあるのだが、

C:\Windows\System32\bash.exe ~

と単純なものだ。
しかし、これをランチャーに登録しても動かないというか、bash.exeが見えない。
cmd.exeの引数にしても、やはり見えない。
PowerShellでもダメだ。
でも、バッチファイルに書いてExplorerからダブルクリックすれば起動する。

Explorerでc:\Windows\System32を見るとbash.exeは見えるのだが、ランチャアプリの登録exeを探すOpenDialogみたいなダイアログからは見ることができなかった。
どうも、bash.exeは特殊な扱いのようだ。

 

このbash.exeはショートカットというよりも、Bashランチャーというものらしく、COMでうんたらかんたらと説明されていた。
なんかわからんが、exec系のAPIからは呼べないようになっているとか、そういうことじゃないかね。

テキストエディタから起動させて、今編集しているファイルと同じ場所に移動したbashコンソールを開きたいだけなのだ。。。
コンテキストメニューから起動させるというやり方のページはあったのだが、そこまではしなくてもよいのだ。

libusbも動かないし、やはりcygwinしかないのか。

 

ただ、c:\Windows\WinSxSの深いところにbash.exeがある。
これは単体で起動できるし、ランチャからも見える。
ちょっと困ったことに、今の私の環境ではbash.exeが2つある。。。
フォルダにバージョンらしき数字があるので、大きい方を使っているが、そもそもこれを使ってよいものかどうかもわからん。
アップデートされたら別フォルダになるだろうし、おすすめはできんな。

2016年12月21日

[py]コンソールログを出力させたい

多少pythonにも慣れてきて、ことあるごとに出力させていたprintが邪魔になってきた。
が、全部消してしまうと困るかもしれないし、大幅に変更させるときにはまた復活させたくなるかもしれない。

そうなると、デバッグレベルに応じて出力させたりさせなかったりを制御したい。


「python ログ」で検索すると、こちらが出てきた(私はまだpython2.7を使っているのだ)。

Logging HOWTO — Python 2.7.x ドキュメント

「ロギングレベルをコマンドラインオプションから~」とあるので、pythonにそういうオプションがあるのかと思ったが、単に引数を解析してからやるだけのようだった。
もしかしたら、getoptみたいな関数があるのかもしれんが、調べる気力が無いので、第1引数をそのままロギングレベルと見なすように書いてみた。

import logging
import sys

loglevel = sys.argv[1]
# print 'getattr=', getattr(logging, loglevel.upper(), None)
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
    raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level)

logging.debug('debug')
logging.info('info')
logging.warning('warning')

INFO、とするとinfoが出るし、DEBUGとすればdebugも出てきた。
コンソール出力を「> log.txt」にしても空っぽで、「2>&1」を追加すると入ったところからすると、標準エラー出力がデフォルトのようである。
まあ、ファイルに保存する設定もあるから、そこまでリダイレクトしたいことはないのかもしれんがね。


これくらいは用は足りそうなのだが、loggingページのまだ最初の方だ。
もっと便利な何かがあるのだろうか?

変数の表示が%で指定するタイプだ、とか、時刻を入れるフォーマットにできるよ、とか、そういうのがちょっと書いてあって、あとは上級編になるようだ。

ちょっとだけ眺めてみたが、loggingは、logger, handler, filter, formatter、の4つから構成されているようだ。
こんなに複雑だったのか・・・。
自分でいろいろ指示することによって、カスタマイズできるようになっているようで、クックブックのページも用意されていた。

Logging クックブック — Python 2.7.x ドキュメント

 

まあ、そこまで踏み込まなくていいな。

  • 地の文:print
  • 普段はいらない、細かいデバッグ出力:logging.debug()
  • 問題ないかもしれないけど念のため忠告の出力:logging.info()
  • ちょっとないかもねー、バグってんじゃないの?の出力:logging.warning()
  • これはダメだー、の出力:logging.error()

私の場合は、debugとerrorがあればまだ足りるかな。
errorも、その後はquit()で終わらせるしかないなら、もうprintでもよい気がする。
ログ出力できるほど優雅じゃ無い環境が多いので、自由に出してよいといわれると困るのよねぇ。