サポート
TCP/IP関数でのバイナリデータの取り扱いについて[2015.2.4] 
3GIMおよび3Gシールド(Ver2)では、TCP/IP関数でバイナリデータを取り扱うことができるようになりました。詳しくは、それぞれの取扱説明書またはライブラリ仕様書を参照ください。
オープンソースハードウェアについてよく聞かれる質問
オープンソースハードウェアの権利について聞かれることが多いです。
ほとんどのオープンソースハードウェアは、CC BY SA(Creative Commons)によるライセンス表示が多いようです。
その規定する内容については、下記のページを参照ください。
■ TCP/IP関数に関する補足
3Gシールドライブラリa3gs/a3gs2で提供しているTCP/IP機能の関数read()およびwrite()では、テキストデータの送受信を想定しています。そのため、バイナリデータの送受信はサポートしておりません。
特に、テキストデータの中では特殊な扱いとなる下記の文字データの送受信はできませんので、ご注意ください。
- CR(16進コードで0x0d)
- LF(16進コードで0x0a)
- NULL(16進コードで0x0)
- ダブルクォート(16進コードで0x22)
ライブラリ資料書には上記の制約は明記されておらず、ご迷惑をお掛けしました方におかれましては大変申し訳ございませんでした。
■ SSL通信に関する注意事項
3Gシールド Ver1.1以降では、https(SSL通信)をサポートしています。
ここでは、このhttpsの利用する際の注意事項について説明します。
【3Gシールドがサポートしている公開キー証明書についての注意事項】
HTTP通信を暗号化する方式として、SSL技術を使ったHTTPSプロトコルがよく使われています。
HTTPSを使うためには、Webサーバが使っているサーバ証明書(SSL証明書)に対応した公開キー証明書が3Gシールド側に必要となります。
一般に、サーバ証明書は有効期限があり、期限が切れる前に新しい証明書に更新するのが一般的です。
また、一言でSSLと言っても、様々な暗号化方式(RSAやSHA1等)や暗号強度(512ビットや1024ビット等)があり、発行元の組織も様々です。
このため、例えばPCのブラウザでは数多くの公開キー証明書を保持しており
Windowsアップデート等でも時々最新の証明書が配布されています。
3Gシールドを使ってhttps通信を行う場合に懸念される点は、通信相手のサーバ証明書によっては通信できない場合が発生するということです。
3Gシールドが対応していないSSLを使ったサイト(https://...というURLを持ったサイト)へ3Gシールドでアクセスすると、通信エラー(SSLに関する問題発生)となり通信が一切できません。
勿論、SSLを使わない通常のHTTPでは通信可能です。
こちらでいくつか確認した例は下記の通りです:
https://xively.com/ → OK
https://onamae.com/ → OK
国内では、例えばSECOM様が発行しているサーバ証明書には対応していません。3Gシールド・SSLを使用している事例としては、GMO様にて発行したサーバ証明書ではうまく通信ができています。
3Gシールドをクライアント側として、M2Mシステムを構築する場合、サーバにインストールするサーバ証明書については事前に動作確認を実施することをお勧めします。
■トラブルシューティング 
■1.サンプルプログラムのInitializingでFailedが発生
▼ 主な原因
・ArduinoやIEMモジュールの接触不良
・立ち上げタイミングの問題
・電源供給(電流が小さい)問題
・IEMモジュールの通信速度設定ミスの問題
▼ 対応策
・Arduino上の3Gシールドや3Gシールド上のIEMモジュール・SIMカードの接触不良を確認のこと
・再起動、再実行を実施
・適正なSIMカード挿入のこと
・外部電源(9V1.3A以上推奨)を別途使用のこと
・IEMモジュールに設定している通信速度と「a3gs.h」内の「a3gsBAUDRATE」変数の設定値を合わせる。
▼ 補足
・IEMモジュールのコネクタ位置は、取扱説明書確認のこと
・外部電源を利用する場合には、ジャンパ・ピンJP2を切り替えのこと
・IEMモジュールの設定変更(set_baudrate.inoを使ってボーレート変更)した場合には、あらかじめメモしておく必要がある。もしIEMモジュールの通信ボーレートの設定速度を忘れたときには、「a3gs.h」の中の「a3gsBAUDRATE」のボーレートを一つひとつ変更して通信できるかどうかを確認していき探し当てる必要がある。
■2.通信接続ができない
▼ 主な原因
・電波の感度が良くない
・周りにノイズの発生源がある
・SIMカードが適正でない → (http_GET.inoは異常状態になる)
▼ 対応策
・3Gアンテナの近くに,できるだけ金属製の部品を設置しないこと
・ノイズ・電波を発生する家電製品等から離れた場所で利用すること
・適正なSIMカードの挿入のこと
▼ 補足・参考
・getRSSI()を使って定量的に電波強度を測ることができる
・現在、適正なSIMカードは、IIJ法人契約などのFOMA(音声通信含む)やIIJmio個人契約、Sonet NURO、DTIなどのFOMA(データ通信のみ)カード(順次対応予定)
・サンプルスケッチで多くのスケッチは稼働するが、http_getに問題がある場合には、明らかにSIMカードの設定間違い。正しいSIMカードの設定が必要。
■3.SIMカードの認識ができない
▼ 主な原因
・3Gシールドで利用できるSIMカードは限定されており、利用できないSIMカードがある。
▼ 確認方法
a3gs.cpp の中の最初に設定されているデバッグモードの変数
#define DEBUG 0 //\ Define if you want to debug
のところの「0」を「1」に切り替えてサンプルスケッチ「http_get.ino」を実行してみる。
デバッグのメッセージの最後の方に以下のような内容がシリアルモニター画面に出たら、SIMカードのが一致していないことなる。
「** >httpGET():REQ
** <getResult:$WG=NG -534
** >httpGET():$WG=NG -534
Can't get HTTP response from www.arduino.cc」
▼ 対応策
使えるSIMカードは、バージョンによって異なる。
提供しているSIMカード(APN情報)については、SIMカード情報を参照してください。(古いバージョンの場合には、タブレインにお問い合わせください: info@tabrain.jp)
■4.a3gsを使ったスケッチの動作が安定しない
▼ 主な原因
・a3gsライブラリは多くのSRAM(約400バイト)を使用。これに加えて,http通信を行う場合はスケッチ側にレスポンス用のバッファが必要となる。そのため、スタック領域が少なるなるため、関数の呼び出しやローカリ変数を多く確保すると、動作が不安定となる。
▼ 対応策
・RAMサイズが不足していないかどうかを確認してみる。
・接触不良が考えられるところを確認・再設定。
・周りにノイズ発生などが無いかを確認・除去。
▼ 補足
・文字列をFlash-ROMに持っていくことも,有効な対応策となる。
・どうしてもRAMサイズが不足する場合には、Arduino Mega/ADKやDue等を使用することを推奨する。
■5.GPS位置取得ができない
▼ 主な原因
・屋内やビルの谷間等で、GPSからの電波をうまく補足できない
・ノイズ発生源が近くにある
・ケーブルが長くて取得した電波の減衰がある
▼ 対応策
・getLocation()関数の引数として、a3gsMPBASEDを指定することを推奨。
・GPSの位置取得機能は、常に位置を取得できるとは限らない。よって、見晴し良い屋外で利用すること。
・ノイズ発生する家電製品等から離れた場所で利用こと。
・外部電源を利用してみること。
・GPSアンテナのケーブルはなるべく短いものを採用すること。
▼ 補足・参考
・PC上のUSBで電源供給のみで利用する場合は、PCから十分離して利用すること
■6.Arduino IDEでポートが見つからない等のエラーが発生する
▼ 主な原因
・一度USBケーブルなどを切り離し、元に戻した場合など
・USBケーブルの接触不良
・Arduinoのポート番号違い
・他ソフト・ハードとの競合など
▼ 対応策
・再度、デバイスマネージャーにて、Arduinoのポートの無効→有効を実施
・未表示の場合には、デバイスドライバの再インストールなどが必要
・正しいArduinoの接続ポートを確認・再設定
・PCの再起動や他の起動ソフトを終了
▼ 補足・参考
・基本的には、ArduinoをPCのUSBに接続した段階で、自動認識でポートを割り当てる。デバイスマネージャーでのポート番号の確認方法を覚えること。
■7.IEMのシリアル番号が分からない
▼ 対応策
・a3gsライブラリのサンプルスケッチget_imeiを動かし、確認のこと。
■8.3GシールドとArduinoとの間の通信速度を速くしたい
▼ 対応策
・a3gsライブラリは、デフォルトでは、SoftwareSerialライブラリを使って3Gシールドと通信する。これをハードウェアシリアル(SerialやSerial1等)に変更することで、通信速度を最大115,200bpsまで高めることができる(Leonardoで動作確認済み)。
・ハードウェアシリアルを使うためには、ジャンパ線による配線とa3gsライブラリの一部改造が必要となる。詳しくは、使い方の「UNO/Pro以外のArduinoで3Gシールドを使う方法について 方法(2)」を参照のこと。
■9.未対応SIMカードの場合
▼ 現象
・サンプルスケッチのう、http_get/sample_TCPIP/cosm_sample 等が正常に動作しない。
▼ 原因
・お使いのSIMカードが3Gシールドで対応しているSIMカードではない場合
・3Gシールドが古いバージョンの場合
▼ 対応策
・3Gシールドを最新バージョンに対応するよう依頼する(有料対応:info@tabrain.jpへ問合せ)
・固有のSIMカード(FOMA対応のみ)の設定追加を依頼する(有料対応:info@tabrain.jpへ問合せ)
■10.IEMモジュールからの時間取得が合わない場合
▼ 現象
・IEM版3Gシールドの時間取得が、常にズレが生じている。
▼ 原因
・IEMモジュールの電源供給しはじめは、時間取得が正しく行われない場合がある。十分な内部充電ができない段階では、正確な時間調整は行われない。また、電源供給が不足しているか、SIMカードまたは3Gアンテナが接続されていないと、初期状態の時刻(1980年1月6日の時刻)を示すか、米国西海岸時間を示すことになる。
▼ 対応策
・IEMモジュールへの十分な電源供給行うと(少し時間経過を待つこと。場合によっては外部電源が必要)、かつ3Gアンテナを付け、正しいSIMカードを挿し込んでいることで、正しい時間を取得するようになる。
(もし、長時間行っても正しく時間取得できない場合には、info@tabrain.jp に問合せください)
■11.TCP/IP関数で改行コード等の制御文字を送信したい
▼ 対応策
・httpPOST()関数と同様に、$エスケープを使用します。
例えば、改行文字は $n 、タブ文字は $t で表記します。詳しくはライブラリ仕様書のhttpPOSTの項を参照ください。
■12.TCP/IP関数でバイナリデータを取り扱いたい
▼ 対応策
・httpPOST()関数と同様に、$エスケープを使用します。
例えば、改行文字は $n 、タブ文字は $t で表記します。詳しくはライブラリ仕様書のhttpPOSTの項を参照ください。
▼ 現象
・read()やwrite()関数では、$エスケープを利用した場合でも、ヌル文字('\0'、値0の文字コード)だけは正しく取り扱うことができません。これは、現在のバージョンの制約です。
→ 3GIMおよび3Gシールド(Ver2以降)では、すべてのバイナリデータを取り扱うことができるようになりました [2015.2.4]
■13.TCP/IP関数でサーバサイドの機能を利用したい
▼ 回答
・現在の3Gシールド(Ver1)では、bind()やlisten()等のサーバサイドの機能は利用できません。
今後、要望が多い場合は対応を検討いたします。(現在利用できるSIMカードの多くはローカルIPが割り当てられるため、サーバ機能を実装できても利用できるシーンは限られているものと考えます)
■14.UDP/IPを取り扱いたい
▼ 回答
・現在の3Gシールド(Ver1)では、UDP/IPは取り扱うことができません。今後、要望が多い場合は対応を検討いたします。
■ 開発・販売元
- 株式会社タブレイン:
- お問い合わせ先:
a3gsa@tabrain.jp
- 最終更新:2015-06-29 08:32:26