在上一篇<Laravel如何優雅的使用Swoole>中我已經大概談到了Laravel結合Swoole的用法。php
今天,我參與的智能家居項目基本上已經結束了Web服務器及android端的開發(熬了個通宵突擊把剩下的作了,好累), 趁熱來聊聊基於Laravel+Swoole開發智能家居後端的關鍵技術點。android
硬件我不談,我只須要關心數據解析。如何基於Swoole若是在php中解析16進制的ascii碼,這種文章還比較少呢。但核心的部分仍是能夠整理出來的,關鍵用到的就是chr()、hexdec()、bin2hex()這3個函數,網上還提到了用pack()、unpack(),由於前面3個函數以及很好的解決了問題,因此就沒有繼續深刻。我建議在這裏Php Manual官網先熟悉下這幾個函數。ios
chr()函數從不一樣的 ASCII 值返回字符,hexdec() 函數把十六進制轉換爲十進制。一般結合這兩個函數把16進制字符串轉換爲ASCII字符串,理解起來有點繞。 例如: echo chr(hexdec('fe'));//輸出的就是下位機能認識的16進制的FE,大小寫不敏感 bin2hex()函數把 ASCII 字符的字符串轉換爲十六進制值,用於從Swoole中讀取數據的轉換。 例如:$buffer = str_split(bin2hex($data), 2);//$data是Swoole中OnReceive事件傳遞的值
在解析協議時,上例中的$buffer數組中,存放了協議的每一位。那麼怎麼解析呢?最快最懶的方法就是根據硬件研發的協議一位一位的去讀取數據,例如頭是第一位,那麼就是$buffer[0];若是連着好幾位組合起來是數據,就寫個小函數拼。laravel
是否是太弱雞了點(.NET和JAVA有很豐富的byte[]轉整形和字符串的方法集)?若是你須要,能夠本身寫個轉換工具類出來(我暫時用不上就沒整理)。c++
在下位機通訊中還有一個很重要的技術點就是XOR校驗,我是從stackoverflow找到的源碼,直接貼地址。web
不廢話,直接上代碼:後端
對Laravel使用者,在這部分我強烈建議好好複習一下Laravel提供的快速數組函數輔助方法。數組
基於Swoole接收數據在上一篇中已經詳細介紹再也不累述,這裏主要說說向硬件發送數據的問題。上一篇中,我提到了2種方法,一種是利用fsockopen()函數;一種是內部端口監聽。這裏還和搞硬件的大神鬧了個笑話,臉紅啊..對基於TCP/IP協議的通訊,由於端口一直被接收監聽佔用,因此用fsockopen()或者socket_write()函數是行不通的,必須基於第二種方式曲線實現硬件通訊。android-studio
在Innerhandler中,若接收到須要發送到硬件的命令(就是上一節說的數據),從緩存裏面提取該硬件的鏈接實體,而後發送數據(不知所云請參考Swoole文檔)。緩存
這裏比較曲線的狀況就是在這個緩存,這個緩存是在須要發送數據的時候設定的,那麼怎麼知道硬件的鏈接實體是什麼?固然是保持一個KV結構的數據啦:)
整個曲線的通訊過程就是:當須要向硬件發送數據的時候,首先將數據發送到這個內部監聽端口來,而後再從這裏發送到硬件去。
怎麼向內部監聽端口發送數據呢?用fsockopen()或者socket_write()都是徹底沒問題的,這裏的代碼就請自行搜索,權當練習,不要太懶了。
這個要用過了才知道有多方便,來這裏先好好複習一下。實現過程請自行感覺,我就只說說我哪裏用到了Event:
1.基於JPUSH推送消息 2.向內部監聽發送數據
另外只補充一點,想利用Event經過Swoole發送數據的路是行不通的。
因爲PHP是弱類型,所以理解起來比較費解。接收數據和向硬件發送數據的數據類型是不同的。用bin2hex()獲得的是形如"11 00 00 FE"的字符串,用chr(hexdec())獲得的是16進制的ASCII碼,若是echo輸出的話,會是亂碼。那麼如何測試(看到)本身生成的16進制ASCII碼數據是否正確呢?1種是找一個TCP/IP工具發送過去,這種麻煩了點,我推薦用fiddler監聽。
你能夠快速方便的用一個web頁面輸出你的ASCII碼,在fiddler的HexView中,就能夠看到原汁原味你發送的16進制數據了。另外,因爲Swoole的監聽類是CLI運行,所以我也很是推薦多寫一點echo打印一下狀態,在phpstorm的SSH客戶端裏能夠快速的瞭解目前的狀況,就像android-studio的Loger同樣。
echo Carbon::now() . '/Device Numbers:' . $devNum . PHP_EOL;//老司機勸你多寫點,最好packagist找個輪子或者本身寫個Logger庫
魯棒性探討,能夠搞得很是複雜
算吐個槽吧,前年用.NET作下位機數據處理魯棒性的時候真是如坐鍼氈啊。搞下位機通訊果真仍是c++最合適啊,如下問題在這裏還須要後期逐步完善呢:
1.若是硬件發送的數據不是一個包發完而是分批發怎麼辦? 2.看門狗是必定要寫的,對吧? 3.與硬件通訊的response處理要作吧? 4.TimeOut怎麼辦? ....
啊啊啊啊啊....
預告下,基於學習的目的,最近正在仿鮮城、enjoy、半糖這3個頗有表明性的電商APP首頁UI(是逆向着看smali和提取res在仿喲)。
鮮城的android端已經作的有模有樣了,此次是逼着本身android、ios都給仿出來,沒老司機帶就本身想辦法提升。
先作android的,有興趣的朋友能夠耐心等待代碼和文章。