前言小程序
這是一個18年初的創業項目的核心功能要求,咱們當時打算作一個共享類的項目,項目的主題是共享圖書,線下的形式租借圖書,咱們當時是考慮作一個借書櫃的形式,而後線下生產投放借書櫃,這些借書櫃自己能存放24本書,大約24個櫃子,且均有單片機控制。安全
用戶經過掃碼借書櫃上的二維碼,能夠直接看到共享小程序裏面的,針對這個借書櫃的當前存在的圖書,若是有用戶喜歡的圖書,那麼用戶能夠直接點擊小程序選擇借書,那麼這是小程序須要向後臺發起API請求,由後臺針對對應的借書櫃的單片機進行通訊,下發指令要求單片機打開對應該書的櫃子。tcp
大體步驟測試
後臺構建.net
我選擇用netty,當時使用的SSM的後臺系統,不過最近一次整理我採用了SpringBoot+Netty來配合,我須要讓單片機與netty可以正常的通訊且是在業務功能正常執行的狀況下。netty
團隊的嵌入式工程師選用了簡易的TCP/IP協議來通信,且本身構建了電路板來控制對應的24把鎖。code
通信協議cdn
幀頭+ID+數據類型+24把鎖狀態+crc校驗+幀尾blog
這裏介紹一下,幀頭與幀尾是後臺與單片機之間通信的協議,咱們使用普通的字符串來通信,而通信的過程當中字符長度是固定的,幀頭與幀尾都是自擬定的2個字符。ip
對於ID可能要介紹一下,這裏是每個單片機的身份證,由於對於每個連接,netty都會生成一個本身的全局隨機ID,這是不易於管理的。因此咱們在生產的時候,後臺就會對每一個借書櫃的單片機的通信Id進行控制,固定的字段與惟一的標識,這有助於後臺的管理,也能立馬保證該借書櫃的狀態。
數據類型是針對業務而言的,咱們的業務是須要控制類型、經緯度傳輸、設備電量、開關異常、報警等等,後臺在獲取到對應的數據類型的時候,就會進行對應的操做。
假如是控制類型的話,那麼後面的24個字符就是對應的24把鎖的狀態,o表示開啓、f表示關閉。
crc校驗是方便雙方作更深一層的校驗與安全防禦,咱們採用了CRC16的方式,校驗值都是4位。
心跳的保持是netty自身自帶的。
netty操做
在netty連接實例的過程當中,我會對連接進來的實例的第一次通信進行如下操做,其實應該說每次都會進行的,通信協議檢測,正如上文說到的,幀頭、幀尾、CRC校驗。
在這一流程校驗正常後,我將獲取到他們的ID,我會立馬將netty原先爲它生成的隨機ID進行替換,轉換成咱們定義的ID,並將其存儲到系統內部的鏈接池中,以鍵值對的形式。
小程序API
在Controller層,我只須要去操做咱們定義好的鏈接池,好比獲取鏈接數、連接ID列表,甚至向連接發送開鎖信息。
GitHub
項目:InChat-tcp-wechat
項目介紹:針對小程序與單片機硬件執行Iot物聯網通信(TCP/IP)的一套完整Demo。
啓動流程
一、啓動項目,tcp監聽成功
二、運行com.myself.nettychat.tcptest.TCPTestClient(記得先改ip或端口,若是你有修改的話)
三、運行PostMan,請求下方的API 進行通訊測試
API列表
http://localhost:8080/susu/back/get_channel_sizeGET
請求Iot中心,獲取當前鏈接存活狀態下的連接實例
{
code: 200,
msg: 成功,
data: 1
}
http://localhost:8080/susu/back/get_channel_id_listGET
請求Iot中心,當前存活狀態下的連接Id列表
{
code: 200,
msg: 成功,
data: [
F5690137563CC8
]
}
http://localhost:8080/susu/back/send_to_channelPOST
參數
channelId //第二個API獲取到的連接Id
lock //將要打開的第幾把鎖 1-24(看單片機接入的鎖的數量)
{
code: 200,
msg: 成功,
data: 【發送成功】
}
效果圖