2017年5月21日 星期日

第三章:PHP MySQL + MQTT

用盡了全力,把Socket傳向ESP8266之後,終於可以百分百設定連上家中AP
再也不用擔心北美的客戶因為配不上線而退貨
地球也恢復往日的平靜,同樣的森林、同樣的天空、同樣偶爾飄過的烏雲,還有同樣的地球人
看著這個還不會動的專案,PHP愈看愈想笑,PHP終於忍不住了
哈哈哈! 你們這群阿呆! 少了我和MySQL,你們是想把資料存在哪裡?
AndroidESP8266四眼相望 是啊!沒有資料庫要怎麼送SCI的人類行為探討

! 配角少來這裡搶戲! RD腦回應了

AndroidESP8266PHPMySQL同一時間鞠躬哈腰像個太監似的異口同聲說
RD大人好,我們這就下去洗洗睡了

接下來我們安裝xampp這個懶人包,然後設定環境變數讓Windows命令列可以執行PHP指令,因為使用WIN10,所以會長的如下圖


然後在CMD下輸入php subscribes.php,這樣就把PHP檔在後台開起來了啊!


哦哦哦! 原來是這樣! 搞得我也想做RD! PM腦說

! 你還是多看一點線上課程吧 RD腦插腰背對PM腦說

接下來燈座與PHP + MySQL的交互流程會是這樣
1、先丟初始值上去,也就是名字(上一章我們叫room)
2、再丟BLE掃瞄到的數據

什麼! 這麼簡單! PM腦說

是的,就是這麼簡單 RD腦推了推眼鏡接著說

PHP裡面要有判斷式
1、如果燈座沒註冊過就用Insert,如果註冊過就用Update
2、BLE送上來的資料要存在哪兒

所以PHP寫法如下

<?php
  // subscribe.php
  require("/phpMQTT.php"); //同個資料夾下,要有phpMQTT.php這個檔案

  $host = "127.0.0.1";
  $port = 1883;
  $username = "";
  $password = "";

  $mqtt = new phpMQTT($host, $port, "ClientID".rand());

  if(!$mqtt->connect(true,NULL,$username,$password)){
    exit(1);
  }

  //currently subscribed topics
  $topics_update_BLE['hello/update_BLE_data'] = array("qos"=>0, "function"=>"procmsg");
  $topics_add_data['hello/add_data'] = array("qos"=>0, "function"=>"procmsg1");
  $mqtt->subscribe($topics_update_BLE,0);
  $mqtt->subscribe($topics_add_data,0);

  while($mqtt->proc()){       
  }

  $mqtt->close();
  function procmsg($topic_update_BLE,$msg){
    $NewString = explode('\\', $msg,5);

      //echo "you got it: $msg";
      mysql_connect("localhost","root","") or die("connect error!");
      mysql_select_db('ktwhost_sco-oc') or die("db error");

      mysql_query("insert into Log_PeripheralWithCentral(PeripheralID,CentralID,RSSI,Distance) values ('$NewString[1]','$NewString[2]','$NewString[3]','$NewString[4]')");
      echo 'Update_BLE_data success ';
  }

    function procmsg1($topic_add_data,$msg){ //一開始的註冊
    $date_now = date("Y-m-d H:i:s");
    $NewString = explode('\\', $msg,6);
      //echo "you got it: $msg";
      mysql_connect("localhost","root","") or die("connect error!");
      mysql_select_db('Simple Care') or die("db error");

      $query = mysql_query("SELECT *FROM `Data_Central`WHERE 1 AND `CentralID` = '$NewString[1]'");//找找看這個ID有沒有註冊過
      $nums=mysql_num_rows($query); //判斷去資料庫撈的是否為空值
      if($nums>0)//這裡的時間不對,有BUG,找時間修改

      {//不是空值就UPDATE
      mysql_query("UPDATE data_central SET CentralName ='$NewString[2]',GPS_N ='$NewString[3]',GPS_E ='$NewString[4]',DatetimeEdit ='$date_now' WHERE CentralID = '$NewString[1]'");

      echo "UPDATA DATA success";

    }
    else//是空值就新插入
      {
        mysql_query("insert into data_central(CentralID,CentralName,GPS_N,GPS_E,DatetimeCreate) values ('$NewString[1]','$NewString[2]','$NewString[3]','$NewString[4]','$date_now')");
        echo "INSERT DATA success";
      }

  }
?>

MySQL的地方,我們設計了2張表格
1、Log_PeripheralWithCentral – 這是BLE掃瞄上傳的數據
2、Data_Central – 這是一開始使用者設定的數據

Log_PeripheralWithCentral會有一堆的數據,BLE我們設定每4秒掃瞄一次
假設這個家裡只設定一位長輩,在1分鐘內一個燈座就有15筆資料
使用三角定位法,代表15x3 = 1分鐘內有45筆資料
1小時有2700筆資料,一個人一天就有64800筆資料
所以PM腦才說可以用這個數據來挖礦,順便做做AI,還可以送SCI

所以在Log_PeripheralWithCentral 會長這樣


而在Data_Central會長成這個樣子

(為了呈現給讀者看資料庫長什麼樣子,使用了Sokit軟體測試,故第26列與27列的值,是隨便設定的,不是實際燈座上傳的值)

這樣只要燈座連線家裡的AP,就可以送掃瞄的數據啦! PM腦開心的說

RD腦回:沒錯! 你終於有所成長了 PM!

本體: BLE送上的數據有PeripheralIDCentralIDRSSIDistance,而Distance是用三角定位法算出來的,後面的章節將會說明





1 則留言:

FB設定搶先看的方式

設定搶先看的兩種方式 A1. 先到我家的日常粉絲團按下 …( 紅框處 ) A2. 按下追蹤中 ( 紅框處 ) A3. 按下搶先看 ( 紅框處 ) A4. 完成!!! 另一種方式 ...