2017-03-01 17 views
1

Macで自分のライトを制御するためのメニューバーアプリケーションを作成しようとしています。 私はmilight (limitless, easybulbs...)のシステムを使用しています。 UDPを介してコマンドを送信できるのはオープンシステムです。UDPパケットの送信に関する問題(無制限、無制限)

私はライトをpython-limitlessライブラリ経由でPythonで制御することができるので、IPやポートなどのネットワーキングのことが分かります。

だから私は私がうまくいきませんでしたこのUDPのものに何か悪いことをすると思います。 私はSwiftSocketライブラリを使用してコマンドを送信しようとしていますが、何も起こりません。私は2日以来それを試しています。

let host = "192.168.2.102" 
let port = 5987 

var client: UDPClient! 

@IBAction func lightOn(_ sender: NSButton) { 

    let bridgeon: [UInt8] = [0x31, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x01] 
    let rgbwon: [UInt8] = [0x31, 0x00, 0x00, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0] 

    print("Licht an") 
    print(client.send(data: bridgeon)) 
    sleep(1) 
    print(client.send(data: rgbwon)) 
    sleep(1) 

} 

@IBAction func lightOff(_ sender: NSButton) { 
    print("Licht aus") 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    client = UDPClient(address: host, port: Int32(port)) 
} 

を私は、私は重要な何かを忘れてしまったと確信しているpythonlibraryの複雑さとこれを比較すると:私は何をしようとしているイストここ

。私はまだネットワークで働いていないので、私と寛大でなければなりません。

ありがとうございました。

答えて

3

私は少し遅れだけど、私はそれはあなたを助けることを願って:

あなたが取得するための最初の要求を送信する必要があなたのlighton要求、無線LANブリッジセッションを送信する前に。また、あなたの要求に基づいて、「チェックサム」と呼ばれるものを計算する必要があります。

あなたはまた、あなたが持っている電球の種類については、それはWW電球かCWですか?

私は実装をしましたが、これはPHPで書かれていますが、Objective-Cでも同じように使用できます。

はそれをチェックアウト:https://github.com/winosaure/MilightAPI

をUPDATE:

がlimitlessled "ドキュメント"(http://www.limitlessled.com/dev/)によれば、これは、要求がどのように構成されるかである:80:

UDP Hexはフォーマットを送ります00 00 00 11 {WifiBridgeSessionID1} {WifiBridgeSessionID2} 00 {SequenceNumber} 00 {コマンド番号} {地域番号} 00 {チェックサム}

このため、まずwifibridgeセッションを取得してから、チェックサムを計算する必要があります。

私はライトを点灯させる方法の一例を挙げてみましょう。

31 00 00 08 04 01 00 00 00 ON

31 00 00 08 04 01 00 00 00 =光は、上記{COMMAND}を参照してください。

ドキュメントは、と言います

これまでのところ完全な要求がなければなりません:

80 00 00 00 11 {WifiBridgeSessionID1} {WifiBridgeSessionID2} 00 {SequenceNumber} 00 31 00 00 08 04 01 00 00 00 {ZONE NUMBER} 00 {Checksum} 

今度はWifibridgeセッションを取得してみましょう。 documentionは言う:

WifiBridgeSessionID1とWifiBridgeSessionID2この コマンドUDPを送信取得します。

SEND六角バイト:20 00 00 00 16 02 62 3A D5 ED A3 01 AE 08 2D 46 61 41 A7 F6 DC AF(D3 E6)00 00 1E < - のIP アドレスにこれを送ります私はこれをやっている理由のWiFiブリッジV6

:このコマンドでUDP要求を送信すると

private function getWifiBridgeSession() 
    { 
     $command = array (
      0x20,0x00, 0x00, 
      0x00, 0x16, 0x02, 
      0x62, 0x3A, 0xD5, 
      0xED, 0xA3, 0x01, 
      0xAE, 0x08, 0x2D, 
      0x46, 0x61, 0x41, 
      0xA7, 0xF6, 0xDC, 
      0xAF, 0xD3, 0xE6, 
      0x00, 0x00, 0x1E); 

     return $this->sendCommand($command); 
    } 

は、あなたが結果を取得します。 Wifi Bridgeのセッション1は応答の20番目のバイトを参照し、WifiBridge Session2は21番目のバイトの応答を参照します(0からカウントすることを忘れないでください。したがって、応答[19]レスポンス[20]」)。

この要求を送信した後、私はこの応答を取得する、のは、言ってみましょう:

28 00 00 00 11 00 02 AC CF 23 F5 7A D4 69 F0 3C 23 00 01 05 00 

だから私の「WifiBridgesession1」は0x05であり、「Wifibridgesession2は」だから今、私たちの要求は、「オンに」するためには0x00

ですライトは次のとおりです。

80 00 00 00 11 0x05 0x00 00 {SequenceNumber} 00 31 00 00 08 04 01 00 00 00 {ZONE NUMBER} 00 {Checksum} 

だから今我々は{SequenceNumberは}が{ゾーン番号}と{}チェックサム

を見つける必要があり

「シーケンス番号」とは何ですか?

DOCは言う:

シーケンシャルバイトだけで、正しい順序でコマンドを維持するのに役立ちます し、それが既に受信重複パケットを無視するのに役立ちます。 新しいコマンドごとにこのバイトを1ずつ増やしてください。

したがって、各要求ごとにこの値を1に増やしてください。 (個人的に私はいつも0x01を送る)。

「ゾーン番号」は、あなたのライトを同期させたゾーンを示します。

有効なリストのために、{ZONE NUMBER}は0x00 0x01のすべてのゾーン1が0x02 0x03のZone2の ZONE3 0x04のゾーン4は

さんが言ってみましょう、私たちの "ゾーン" は0x01です。

ほぼ完了です。 「チェックサム」を計算するだけです。

DOCは言う:

コマンドの9バイト、およびゾーンの1つのバイトを取り、そして0 =チェックサム=(サム& 0xFF)を追加し、例えばSUM((31 00 00 08 04 01 00 00 00)(コマンド)01(ゾーン)00)= 3F(CHKSUM)

だから、私たちのコマンドのチェックサムは次のとおりです。 31 + 00 + 00 + 08 + 04 + 01 + 00 + 00 + 00 + 01 + 00 =が0x54

私は0x00を

はだから今、私たちはすべて、完全な要求を持っている+ゾーンの+は0x01(オン)コマンドのすべてのバイトを追加光をオンにするには:

それだけです。

注:リクエストをコピー&ペーストするだけではなく、値に基づいて計算されます。ライトをオンにする要求は、計算する内容に基づいて毎回変わります。

"オン"コマンドを実行するために "00 31 00 00 08 04 01 00 00 00"と書かれていることに気づいたことがあります。これはCW電球の場合のみ有効です。

の違いは何ですか
80 00 00 00 11 05 00 00 01 00 31 00 00 07 03 01 00 00 00 01 00 54 

:DOCはWW電球のために同じコマンドだからWW電球のための完全なコマンドは次のようになります00 31 00 00 07 03 01 00 00 00 ある ...ことを指定しませんCWとWW電球? 私は、CWは "冷たい白"を指し、WWは "暖かい白"を指すことができます。しかし、私は "電球"の専門家ではないので、私はそれ以上説明することはできません、なぜ私たちは両方のために別の要求を書く必要があるかわかりません。

とにかく私は十分に明確であったと思います。 どのように動作しているか教えてください。

+0

まだこのプロジェクトに取り組んでいます!私の球根のすべては、WWの違いは何ですか?あなたのコードではWWを使うので、私はそれらを正しく使うことができますか?もっと説明できますか? Bridgesessionを取得するにはどうしたらいいですか?また、受信したすべてのバイトの合計であるチェックサムが必要なのはなぜですか? – kuemme01

+0

私が行ったことをより詳しく説明するためにコメントを更新しました。 – wilfleaji

+0

そんないい男!これは完璧だった!私はUDPライブラリを使ってデータを受信する方法を理解しなければならないので、まだ解決していません。それは不可能だと思いますので、他のものを検索しなければなりません。私はすぐにあなたを更新します!今までありがとう!それは説明できなかったでしょう! – kuemme01

関連する問題