基于Laravel+Swoole開發智能家居后端

在上一篇Laravel如何優雅的使用Swoole中我已經大概談到了Laravel結合Swoole的用法。今天,我參與的智能家居項目基本上已經結束了Web服務器及android端的開發(熬了個通宵突擊把剩下的做了,好累), 趁熱來聊聊基于Laravel+Swoole開發智能家居后端的關鍵技術點。

16進制ASCII碼協議的解析##

硬件結構圖

硬件我不談,我只需要關心數據解析。如何基于Swoole如果在php中解析16進制的ascii碼,這種文章還比較少呢。但核心的部分還是可以整理出來的,關鍵用到的就是chr()hexdec()bin2hex()這3個函數,網上還提到了用pack()unpack(),因為前面3個函數以及很好的解決了問題,所以就沒有繼續深入。我建議在這里Php Manual官網先熟悉下這幾個函數。

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];如果連著好幾位組合起來是數據,就寫個小函數拼。


我從第0到12位拼起來,就是我需要的數據了

是不是太弱雞了點(.NET和JAVA有很豐富的byte[]轉整形和字符串的方法集)?如果你需要,可以自己寫個轉換工具類出來(我暫時用不上就沒整理)。

在下位機通信中還有一個很重要的技術點就是XOR校驗,我是從stackoverflow找到的源碼,直接貼地址

16進制ASCII碼協議的創建##

不廢話,直接上代碼:


按協議生成向硬件發送數據

對Laravel使用者,在這部分我強烈建議好好復習一下Laravel提供的快速數組函數輔助方法

與硬件的曲線通信##

基于Swoole接收數據在上一篇中已經詳細介紹不再累述,這里主要說說向硬件發送數據的問題。上一篇中,我提到了2種方法,一種是利用fsockopen()函數;一種是內部端口監聽。這里還和搞硬件的大神鬧了個笑話,臉紅啊..對基于TCP/IP協議的通信,因為端口一直被接收監聽占用,所以用fsockopen()或者socket_write()函數是行不通的,必須基于第二種方式曲線實現硬件通信。

在Swoole打開內部監聽端口

首先在Command中添加內部端口的監聽,注意onReceive事件被自定義的InnerHandler接收(不知所云者請復習上一篇以及Swoole的文檔)。一定記得在iptables中把你的內部監聽端口打開!!

接收函數,向硬件發送數據

在Innerhandler中,若接收到需要發送到硬件的命令(就是上一節說的數據),從緩存里面提取該硬件的連接實體,然后發送數據(不知所云請參考Swoole文檔)。這里比較曲線的情況就是在這個緩存,這個緩存是在需要發送數據的時候設定的,那么怎么知道硬件的連接實體是什么?當然是保持一個KV結構的數據啦:)

整個曲線的通信過程就是:當需要向硬件發送數據的時候,首先將數據發送到這個內部監聽端口來,然后再從這里發送到硬件去。怎么向內部監聽端口發送數據呢?用fsockopen()或者socket_write()都是完全沒問題的,這里的代碼就請自行搜索,權當練習,不要太懶了。

Event大有裨益##

這個要用過了才知道有多方便,來這里先好好復習一下。實現過程請自行感受,我就只說說我哪里用到了Event:

1.基于JPUSH推送消息
2.向內部監聽發送數據

另外只補充一點,想利用Event通過Swoole發送數據的路是行不通的。

優雅的快速測試##

由于PHP是弱類型,因此理解起來比較費解。接收數據和向硬件發送數據的數據類型是不一樣的。用bin2hex()得到的是形如"11 00 00 FE"字符串,用chr(hexdec())得到的是16進制的ASCII碼,如果echo輸出的話,會是亂碼。那么如何測試(看到)自己生成的16進制ASCII碼數據是否正確呢?1種是找一個TCP/IP工具發送過去,這種麻煩了點,我推薦用fiddler監聽。

HexView中的黑色部分就是你發送的

你可以快速方便的用一個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怎么辦?
....

啊啊啊啊啊....

喜歡Android的有福了##

仿典型電商UI的一個練習

預告下,基于學習的目的,最近正在仿鮮城、enjoy、半糖這3個很有代表性的電商APP首頁UI(是逆向著看smali和提取res在仿喲)。鮮城的android端已經做的有模有樣了,這次是逼著自己android、ios都給仿出來,沒老司機帶就自己想辦法提高。先做android的,有興趣的朋友可以耐心等待代碼和文章。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容