一個關於小程序與單片機的通訊實例(TCP/IP)

  前言小程序

  這是一個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: 【發送成功】

  }

  效果圖

  


  

相關文章
相關標籤/搜索