上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
お久しぶりです!
もしかしたら、花粉症デビューしちゃったかもしれないゆってぃです!><

最近、暖かくなったり寒くなったりで、体調を崩しがちになっております。。。
はやく本格的な春にならないかな・・・

さて、だいぶ前に本ブログでXBeeの記事を書いてから、XBeeの使い方についてお問い合わせを受けることが何度かございました。
この極めて読みにくく、自己満足かつ自己完結型のブログをお読み頂き、さらにコメントやご連絡まで下さる方がいらっしゃることを、とても嬉しく思います^^

そこで今回は、まだブログで取り上げていなかった、XBee WifiXBee Application Service機能についてご説明いたします。
というのも、お問い合わせいただく内容を見ると、XBee Wifiをいわゆる透過モード(シリアル通信の無線化)であれば簡単に使えるのに、PCやスマホといったクライアント機器(以下、クライアント)から遠隔でXBeeモジュールのポート制御などを行うとなると、なかなかうまく行かない方が多いということに気づいたからです。

でも、そのお気持ちはすごくわかります。
従来のXBeeには、2つのモードがありました。

・ATモード・・・シリアル通信を単純に無線化するモード。
・APIモード・・・APIフレームにそってデータを送信する。動的に通信相手を変えたり、ATコマンドを送ることで、相手の設定(出力ポートの状態など)を制御することも可能。

ですので、例えばクライアントから、通信先のXBeeのポートを制御したいのであれば、APIモードを使えばいいんだなと思われることでしょう。
特に、XBeeZBなど過去のデバイスを使ったことがある人ほど、そう思われたのではないでしょうか?

このように困っている人をみて、Digiの中の人は言うでしょう。
「一体いつから、PCやスマホからでも、APIフレームでコマンドを投げればポート制御ができると錯覚していた?」
(ということに気づかず、ゆってぃが思いっきりはまっていた事は秘密です)


クライアントから、XBeeのコンフィグレーション(ポートの状態などの設定)を変更するには、ATモードとかAPIモードなどではなく、XBee Application Serviceという機能を使います。
この機能については、マニュアル(90002180_G)のP41以降に詳しく書いてありますので、ご参照ください。

もっとも、英語ですし全部読むと大変なので、以下に要点のみ記載します。

<ポートに関して>
XBee Application Serviceで使用するポートは、0xBEE(3054)固定になります。
ハードコーディングされているので、ポートの変更は出来ません。
なお、C0コマンドやDEコマンドでセットしたポートは、シリアル通信機能(ATモードとかAPIモード)でのポートになります。
よって、X-CTUで設定するポートは、XBee Application Serviceでは使用しません。


<トランスポート層のプロトコルについて>
XBee Application Serviceでは、UDP固定になるのでご注意ください。
JAVAなどを用いてクライアントからアクセスするときは、UDPでソケットを開けば問題ありません。
X-CTUでセットできるプロトコル(TCPあるいはUDP)というのも、ポートと同様、シリアル通信機能での設定になります。


<フレームについて>
APIモードで送信する場合は、APIフレームに沿ってデータを送信する必要がありました。
XBee Application Serviceでも同様に、XBee Application Serviceのフレームが用意されています。
マニュアルのP42に、そのフレームが記載されています。

XBee_NTCframe.jpg


このフレームに沿って、ATコマンドを渡すことで、XBeeの制御を行うことが出来ます。

以上をまとめると、例えば、192.168.1.30が割り当てられたXBeeのD1ポートを出力HIに変更したいときは、以下の設定でフレームを送信します。

IPアドレス:192.168.1.30
ポート:3054
プロトコル:UDP
送信データ:{0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 'D', '1', 5}

<例(JAVA)>


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class XBeeCtrlTest {

public static void main(String[] args) throws Exception{

InetSocketAddress xbeeAddress = new InetSocketAddress("192.168.1.30", 3054);

byte[] msg = {0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 'D', '1', 5};

DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, xbeeAddress);

new DatagramSocket().send(sendPacket);

System.out.println("OK");

}

}


その他の例として、マニュアルのP43にIDコマンドを投げるときの手順が記載されていますので、ご確認ください。

どうです?
意外と簡単でしょ!^^
是非、トライしてみてくださいね!

最後までお読みいただいて、ありがとうございました!

関連記事
スポンサーサイト
コメント
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。