2017-03-01 58 views
1

我試圖編寫一個菜單欄應用程序來通過Mac控制我的燈光。 我使用的是milight (limitless, easybulbs...)的系統。 他們有一個開放的系統,你可以通過UDP發送命令。發送UDP數據包的問題(milight,limitlessled)

我可以通過Python中的python-limitless庫控制燈光,所以我知道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要求你必須發送到獲得第一個請求時,無線橋接器會話。您還需要根據您的請求來計算Milight稱爲「校驗和」的內容。

你也確定你有什麼樣的燈泡,是WW燈泡還是CW燈泡?我被困了好幾天,因爲我發送錯誤的請求..

我做了一個實現,它是在PHP中,但你可以在Objective-C中以相同的方式使用它。

檢查出來:https://github.com/winosaure/MilightAPI

UPDATE:

據limitlessled 「文檔」(http://www.limitlessled.com/dev/),這是一個請求是如何組成:

UDP十六進制發送格式:80 00 00 00 11 {WifiBridgeSessionID1} {WifiBridgeSessionID2} 00 {序列號} 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會議。該文件說:

以獲得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地址 無線網橋V6

這就是爲什麼我這樣做:

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); 
    } 

一旦你發送一個UDP請求用這個命令,你會得到一個結果。 Wifi Bridge session1指向響應的第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} {區號碼}和{}校驗

什麼是「序列號」?

的醫生說:

連續字節只是保持命令以正確的順序, 幫助,它可以幫助忽略已經收到重複的數據包。每個新命令的這個字節增加 。

因此,把你想要的和增加這個值爲1爲每個請求。 (Personnally我總是發送0x01)。

「區號」是指您同步燈的區域。

有效列表爲{ZONE NUMBER} 0×00全0×01 1區2區0×02×03 3區0×04 zone4中

比方說,我們的 「區」 爲0x01。

幾乎完成。我們現在只需要計算「校驗和」。

的醫生說:

取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

我添加的命令的所有字節(打開)+ 0×01爲+ 0×00

所以現在我們所擁有的一切和完整的請求區打開燈:

就是這樣。

注意:不要只是複製和粘貼請求,我根據示例計算值,開啓燈光的請求將根據您將要計算的內容每次更改。

也許你已經注意到我寫了「00 31 00 00 08 04 01 00 00 00」做「打開」命令,這隻適用於CW燈泡。本文件並不指定... 武威燈泡相同的命令是00 31 00 00 07 03 01 00 00 00 所以對於WW燈泡整個命令將是:

80 00 00 00 11 05 00 00 01 00 31 00 00 07 03 01 00 00 00 01 00 54 

之間有什麼區別CW和WW燈泡? 我可以說CW是指「冷白」,而WW是指「暖白」。但由於我不是「led燈泡」方面的專家,我無法解釋更多,我不知道爲什麼我們需要爲兩者寫出不同的要求。

無論如何,我希望我足夠清楚。 讓我知道事情是如何工作的。

+0

永遠不要遲到!仍在研究這個項目!我所有的燈泡都是WW Wheres的區別?在你的代碼中你也使用WW,所以我可以正確使用它們嗎?你能解釋更多嗎?我如何獲得Bridgesession以及爲什麼需要校驗和,即所有接收字節的總和!? – kuemme01

+0

我更新了我的評論,以更詳細地解釋我做了什麼。 – wilfleaji

+0

男人你這樣一個好人!這很完美!我還沒有解決它,因爲我必須弄清楚如何使用我正在使用的UDP庫接收數據,我認爲它不可能,所以我必須搜索另一個。我會盡快更新你的!非常感謝!它不能被更好地解釋! – kuemme01