XBee WiFi はじめましたっが!
AP接続完了からUDPデータを拾い出すまで7日ほどハマりました

ほとんどの仕様はXBee Proと同じと考えていいようだ (詳細はマニュアルを見れば書いてある)

XBee wifi は新版の”S6B”にしました”S6”は何かと癖が有りそうなので  Wi-Fiアクセスポイントへの接続は簡単ですので省く
 
   (SSIDと認証キーを正しくセットすれば自然と接続されます)
 
目的はXBee wifi 単体でアナログとデジタルデーターを取得してPCへ送信
して、PCからリモートコマンドでデジタルポートを制御する。
 今から分かった事を追記していく。  
    ⇒       ⇒   XBee wifi のIPアドレスが変わるとまずいのでルーターからいつも同じIPに
なるようにルーター設定する、ついでにWAN側からのアクセス用にNATも設定する
これで常時同じIPアドレスになり、インターネットからも理論的にはアクセス可能だ。
 
     
XBee wifi と接続してみる、プログラミング言語ソフトは持っていないので
相変わらず無料のHSPにこだわってつかっているが、解りやすく良い言語
だと思う、もっと普及しても良いと思うのは私だけ?
  ”sockopen”でXBee wifi のアドレスとポート(デフォの9750番)に接続して
   ”HELLO”を送ってみた................届きますね(あたりまえか)X-CTUの画像↓
 
右の画像のHex部を見ると”7E”から始まるAPIフレームで表示されているが
ここでハマってしまった”APIでリモートコマンド”を受け付けると、思い込
んだ、そして、なぜかリモートコマンドで送信先アドレスを指定すれば応答が返る、とまで思い込んでしまった(これで1週間ドツボに)
 
それから1週間近くマニュアルの翻訳見直しに朝4時半に起床して寝る
まで悪戦苦闘の日々.......。何回手を変えても 0xB0 フレームしか現れない
挫折しそうかも........。
 
   
マニュアルの何処かにプロトコルはTCP、UDPの設定問わずにUDPで
送信と書いてあった......。のを思い出しLAN内に流れているパケットをい
キャプチャしてみる事にした、良いソフトがフリーで転がっていた、”Wireshark”だ、キャプチャすると、なんとXBee wifi はUDPで既に
垂れ流し送信している  ⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
(Wiresharkは本家からどうぞ)
 
UDP送信のDATA 16バイトに注目してみたら、これはマニュアルの45P
に表で記載されているが、気が付くユーザーはまれでしょう、

マニュアルの総バイト数が16バイトであることから気が付いた!
まず右図「Data」の先頭4バイトは毎回変わるUDPの番号みたいで
関係なし、次の2バイト”00 00”はマニュアルでもリザーブで”0”とある
後はこの画像で理解してくれ この画像の各ビットが右の図の Data に
対応する。

 
この事が分かったおかげで進展できそうになった、まだ先は長そう。 因みに、右端から2バイトはD0のADCの値で何も測定していないので 1023/0x03FF*2.5V=2.5Vでフルスケール
になっているデジタルI/Oは0x0006 で 0000110 なので D1、D2がHレベルだと送信されている。
 
今後これを閲覧している方と相互に勉強していきたいと思っています
ご提案や質問などをXXXX
にて投稿して下さい、質問は私の
解る範囲でお答えします、ぜひヒントになるような投稿をお待ちして
います。

 
  現在ネット内のPCで、XBee wifi からのUDPデーターを複数同時受信する事に成功しています  
 この次の更新でUDP接続に関して分かった事を書き込みます    
     
ソースポート”CO”と相手先ポート”DE” ソースポートはTCP接続用に使用し、相手先ポートは一般的にはデーターを送る相手のポートと
理解できるのだが、まだ用途が不明
 
 
ブロードキャスト と ユニキャスト デフォルトでは”DL-Destination IP Address”は ”255.255.255.255”のブロードキャストになっている
複数のPCから接続するのならこのままが良いが、特定の機器にだけ送りたい場合は
相手のIPアドレスを設定する
 
UDPパケットを受信してみる(無知のためハマった部分) XBee wifi のソースポートとしてデフォルトの”0x2616”は10進で9750番このポートでパケットを待ち受ける
スクリプトを書いて待ち受けるが、いくら待っても音沙汰なし、このソースポートが曲者でした、このポートは
上行で書いたようにTCPコネクション用のみに使用するようだ、ではUDPパケットは何番のポートに向けてるの?
 
マニュアルに書いていなかった”amt - cnf - port 解らない......。そこで”Wireshark”の出番、LAN内に流れているパケットをキャプチャしたところXBeeのアドレス
から”255.255.255.255”に向けて”amt - cnf - port”なるポートに送っているのを発見ポート番号は3054番
判明、3054で待ち受けるといきなりデーターが飛び込んできた
(こんなのマニュアルに書いてないぞ〜)
すみませんマニュアル41Pの”XBee Application Service”項目に記載がありました、16進で 0xBEE は洒落?
 

UDPでXBee wifi のI/Oポートデーター受信の問題は解決!


結局”255.255.255.255”に向けて流れているデーターはどの機器からでも捕まえられるという事か
ブロードキャストですから当たり前と言えばあたりまえなんですけど。
 
 

← アナログポートの個数を増やすとデータが2バイトずつ増加する
【実際に変更させた時に現れたUDPパケットデーター】
a5:64:e7:26:00:00:04:00: 01:00:06:01:00:06:03:ff
                                                              ↑D0をアナログに
ad:86:ef:c4:00:00:04:00:  01:00:04:03:00:04:03:ff:03:ff
                                                           D0↑    ↑D1を追加
使用するデジタルポートの数は増やしても値が変化するだけで総バイト数は変化なし。
上のサンプルデーターでは上行 0x0006 ⇒2進で 110 なので D2とD1ポートがHレベル
下の行ででは 0x0004 ⇒2進で 100 なのでD2ポートだけがHレベル、使用中のポートはデジタルマスクで分かる
 
しかしAPIリモートコマンドは一向に受け付けてくれない。
 本当にTCPでリモートコマンドを送信できるのか?疑問だ。
 
 

今日は起き抜けにデジタルI/OポートにSWを付けてOn OffしてUDPの
パケットデーターの反応を診た、操作してから値が変わるまでに数秒掛かる
  今はAPI2モードだけど今から TRANSPARENT MODE にしてみる、やはりUDPパケットは
  送信されなくなりました。UDPパケットが来ないと意味ないのでAPI2にもどした。
 
X-CTUで値を変更するときはターミナルからATコマンドで変更する
     ほうが モデムコンフィグレーションから行うより安全です。
   
 (モデムコンフィグレーションから変更して書込みしたら失敗して動かなくなる事がある)
APモード編でも記載したが、もう一度読み取りADC値から実値を計算する式
   温度計測 IC LM61CIZ(-30℃〜100℃)を接続しているADCポートの場合を例にする
   (ADC読取値(10進数にする)×Referennce電圧÷1023-0.6)×100 これで実測温度になる(要 校正)
   XBeeのADCを使用する時に、よく思うのだが14ピンにリファレンス電圧を掛けたほうが良いと言うが
   いまだ掛けたことが無いけど正常に作動する
 
     
UDPパケットの取り出し、どの言語も同じようなものだと思うが
     ブロードキャストを前提にすると手順は、3054ポートでUDPソケットを
     開き Sockget で待ち受けるだけ、バイナリデーターなので工夫がいる

          ←今はこの表示でテスト中
 ・ 私の定番言語HSPの場合(”pcbnet2”というプラグインが必要)

#include "hspsock.as" ;TCPコネクション用
#include "pcbnet2.as" ;UDPプラグイン
        udpsock soc,3054 ;UDPソケットを3054番で開く
               エラー処理
        udpget 変数,32,soc   ; パケット取得、この場合 32バイトまで格納される
        peek(変数,オフセット) ; 変数からバイナリを取り出す、とりあえずこれで1バイト取れるので必要分処理する
    この後計算と表示処理する、


 大まかにはこんな感じで(私もまだ確認だけで完成していない)
 


  出来るだけコンパクトにしたいので右図のようにリチウム電池1本で
  何時間使えるのかUDPパケットを送信させながら放置している、
  三端子レギュレーターは”TA48033F”という100円のものこのICは
  入力と出力の電圧差が0.5Vあれば良いのでリチウムBTTの限界
  まで使用可能、10時間はもってくれると思うが?
                           
 
AP-API Enable を 0-TRANSPARENT(透過モード)に設定しても
     DL-Destination を相手先指定してユニキャストすれば、同時に
     UDPでI/Oポート情報が送出されていた。

 結果:残念ながら5時間程度しか持たなかった。

 

リモートコマンドがTCPでもUDPででも送信するが、届いているのに
     相変わらず知らんぷり、TCPでの受け付けは”0xB0”の
     RX (Receive) Packet: IPv4 を吐き出しているのだが........。

     DLがブロードキャストの場合は受付しないというのは分かるが、ユニキ
     ャストにしてでもダメっていうのは?

 
”D2”を Degital Out High から Degital Out Low にしたいのでマニュアルの例の値を少しだけ変更
・7E 00 0E 07 01 00 00 00 00 C0 A8 01 64 02 44 31 03 B0
・                                         C0 A8 01 05 02 44 32 04 0D ← チェックサムも変更
                  これで良いと思うのだが?
 

!!リモートコマンド送信成功!!

↑これが間違っていたwifiでないXBeeのリモートコマンドに囚われすぎていた

 
 

詳細は後日整理してから掲載しよう(マニュアル 42、43ページに掲載されていた)

 

◆◆ まとめ:UDPでリモートATコマンドを ◆◆
 

   
 XBee wifi S6B 独自の設定(以外はXBee Proとほぼ同じ)
       ( ファームウエアは XB2B-WF ver2004 Functin Set は XBWW WI-FI )

1・X-CTU の「PCSetting」 Flow Control は HARDWARE にすれば安定
    して接続できるようだ(wifiはデフォルトで”FT”を使う設定に)
    ま、NONEでも動きますけど、なんか不安定

2・NetWork の AH-Network type はLANのアクセスポイントに接続したい
   ので 2の”INFRASTRUCTURE”にする(これで MAC/PHY欄は
   PL-PowerLevel しか触れなくなる(無線出力を適当に設定)

3・ID-SSID に接続するアクセスポイントのSSIDを入力する
    IP-IP Protocol はUDPでもTCPでも良いみたい
    MA-IP Addressing Mode はDHCPにしてLANのルーターから振って
       もらう方が後々都合が良い
(固定アドレスにしたければ、ルーターのほうの
          設定でMACアドレスから固定にすればよい)

4・つぎに、Security欄に飛び、EE-Encription Enable を無線LANのセキ
    ュリティー方式に合わせる

5・PK-Passphrase に接続する無線LANのキーを正確に入力する

※ とりあえずは Addressing欄の設定はデフォルトのままで、後で設定
     すれば良い、まずは無線LANに接続を先に。

6・書き込む前に Save ボタンでセーブしておくと良い(書き込みに失敗
    して読めなくなった時に助かる)

7・「Write」ボタンで書き込む、書き込みに成功したら数秒おいて Read し
   てみる、読み込み結果

Addressing欄の”GW”にルーターのIPアドレス、”MK”に”255.255.255.0”
”MY”に取得IPアドレスが入っていれば接続成功。
 
 
左の設定でアクセスポイントに接続された時点で”UDP”3054ポートからI/Oポートの状態をブロードキャスト送信している、これは透過モードでもAPIモードでも関係なしに垂れ流し状態である。

直ぐに XBee wifi を テレーメーター + 簡易お知らせ器として使える、送出されるパケットは先の図の通り。

UDPパケットで”リモートATコマンド”を送信してポートの設定を変更するにはAPIモードであっても無くても
下図の通りのパケットを XBee wifi の”3054”ポートに送れば良い”CO”で設定したポートはダメです。


 



 緑の部分を変更して各種ポートの設定が可能、
 赤の部分は変更なし因みに例の先頭2バイトを
 0x4242
にしているのは2,3バイト目を0x0000
 するため(0x4242 xor 0x4242 = 0x0000)


 XBee Pro のリモートコマンドのようにチェックサムなどの制約がないので手軽に使える。





上図のバイナリデーターをUDP送信プログラムで送信すれば一瞬で変更される、XBee wifi からのレスポンス
は1〜2秒遅れて帰ってきます
レスポンスの内容は  42:42:00:00:00:00:82:00:01:44:32:00 ←ここがゼロで成功

ルーターでXBee wifiへ ルーティングすればインターネット側から リモートATコマンド送信も成功しました。

今後は複数台の XBee wifi  の場合どうなるのか?疑問が発生しました、次の課題になりそうです

▲ UDPヘッダの情報で振り分ければ理論的には同一ネットワーク内に複数のXBee wifi を設置可能みたい

 

● UDPパケットのおさらい、
  
※ HSP (プラグイン”pcbnet2”) の「udpinfo info , soc」を実行すると 変数”info”に 送信元アドレス と ポート番号を取得できる。
 
     
     
★ 芳香剤のケースを ”温湿テレメーター” にしてみました、充電器を内蔵して充電しながらでもバッテリーだけでも使えるようにしてみた(バッテリーだけで 2日半持つ)
 
     
 

上の芳香剤ケース温湿テレメタは太陽電池で日没後充電、日昇時に充電完了にしている 

 
     
     

工作室に戻る