1. 程式人生 > >共享單車智慧鎖設計

共享單車智慧鎖設計

--------------------------------------------------------------------------------

2018-05-15  畢設答辯結束20天后:

畢業設計已經完成,且答辯結束。回過頭來認真梳理下開發的流程和使用到的技術,寫一寫遇到的重點問題,然後貼上來所有的原始碼以及對專案使用到的開發環境和開發工具進行必要的說明。一是為了做個了結,二是為了更好的幫助到你們。

--------------------------------------------------------------------------------

2018-04-15 畢業設計進入關鍵時刻:

再此整理下,畢設涉及到的相關技術,在畢設基本成型的時候,認真整理一下各部分的知識。

一馬當先的Socket,萬物互聯的Socket。使用Socket通訊建立起IP地址之間的通訊,將SIM連線到網路上。

安全傳輸的TCP,牢靠的TCP。對於TCP or UDP,其實憑我個人感覺,以後網速越來越穩定之後,更偏愛UDP。

多執行緒,多執行緒和多程序。在此專案中,最後做功能實現時,有點急躁,多執行緒並沒有成功,多程序可以用之後,就不再想嘗試多執行緒了。那時候感覺整個專案的東西有點多,亂,輕易不敢下手了。而且截止時間也不多了。

微信公眾號開發,最火的小程式開發。對於客戶端選擇了微信,一是因為老師說專案的重點是客戶端,二是當時用微信構想了下需要的功能,覺得勉強能夠用,所以就沒有嘗試開發app。

最好的作業系統,Linux基本操作。專案沒有涉及到太多Linux的東西。如果說有,那就是雲伺服器是CnetOS的,Ngrok+MySQL+PHP搭建在伺服器上,因為忘記了資料庫密碼致使把整個環境重搭了一下,後來因為出現未知的錯誤,以及安裝多程序、多執行緒外掛時,需要修改一些東西,被迫重搭系統,總的來說,整個環境至少重做了4次。在這4次重做過程中,我對Linux的命令操作有點基本的認識。

--------------------------------------------------------------------------------

2018-03-16  畢設初起步:

我的畢設開始於2018/3/5,畢設已經做了有兩週了,一直沒有整理自己的進度,現在來補充下,以便以後能回過頭來回顧下。

先上任務書:

再上開題報告,算了,開題報告還是先不上了,等答辯結束再上,免得出事端。

 

整體的設計思路跟共享單車的實現原理相似(此處不敢用一致,畢竟不清楚其具體原理)。

技術選型:STM32F103+SIM900(GPRS模組)+騰訊雲的雲伺服器(學生優惠)+微信公眾號(測試號開發)

開發語言:微控制器使用了C語言,伺服器使用的Centos7,伺服器開發語言是PHP,通訊方式暫定為Socket。

整個系統的架構圖:

第一週完成的工作主要有:配置好伺服器,搭建一個可以滿足自己使用的微信公眾號,完成基本的功能。

①、後來發現微信公眾號沒有自定義選單功能,遂採用了微信公眾號平臺的測試賬號,剛開始對自己的雲服務不太瞭解,使用了 百度的EBA應用引擎,一天0.4元,很實惠,千萬注意是 基礎版並不是專業版,專業版9.9,當初自己買錯了,還好沒有操作,直接就申請退款了。

關於微信測試賬號的設定,請參考,這個部落格,在此謝過,真的幫到了我很多。在此謝過博主大佬。

zc的救贖

②、伺服器的配置,因為要使用 SIM與伺服器通訊,之前學習過Socket通訊,覺得Socket通訊可以實現此功能,就直接確定了使用Socket通訊,我之前是學習Java的,對PHP沒有好感,也沒有興趣,md,這個一點的不嚴謹的語言,真的是不想學,但因為我的雲伺服器當初是用來搭建部落格的,使用的是PHP的開發環境和WDCP的面板,所以就想用PHP來搞一下Socket,反正Socket也不太難搞。這裡主要涉及到 埠的開放和監聽,讓我搞了兩天,真的有點頭大,百度查詢了很多材料,都是眾說紛紜吧。其間,給自己的伺服器安裝了iptables、telnet等等,當時安裝的時候,真的不知道這是幹什麼用的,後來敲了兩天的Linux命令,才開始慢慢的有了點頭緒,並質疑過是騰訊後臺管理關閉了我要使用的1337埠,連續兩次提交工單到騰訊雲,真的是非常的抱歉。

關於埠的開放和監聽,我自己的理解是:伺服器預設開放了所有的埠,而我使用了埠掃描(百度就能找到有個網站提供這個服務,指定IP和埠檢測埠是否可用),去掃描我的伺服器的1337埠,檢測的結果是埠是關閉狀態,是因為伺服器端沒有程序在監聽1337埠,後來寫了個Socket服務監聽1337埠在伺服器上執行,就能掃描到1377埠已開啟,此時也可以看到通過putty遠端連線伺服器檢視1377埠已在監聽狀態。(特別注意要修改iptables防火牆,要同意開放指定的埠,此處針對CentOS7:關閉預設的防火牆firewall,使用iptbles,firewall是7版本才具有的防火牆,網上相關的操作沒有iptables的多,技術人員偏愛舊東西,可靠)。

所以開放埠只需要修改防火牆檔案並重啟伺服器(此處好像是隻需要重啟apache就行),然後寫個socket監聽某埠。

現在的進度為:

一方面:已經可以完成微信的掃碼,傳送單車id到伺服器端,伺服器獲取id查詢資料庫找到對應的ip地址,

另一方面:完成啟動socket監聽,獲取客戶端的ip和埠,

下一步的進度:連線起兩個功能區,實現基本的功能。

需要特別攻關的方面是 socket監聽如何實現多執行緒監聽,因為對PHP不太熟悉,不敢搞太多的東西,因為除錯什麼的都很複雜,自己有點怵。

暫時先寫這些吧,昨天看了php的基本語法,學習了些全域性變數,資料型別等東西,今天還是再看一些吧,然後把自己鬆散的頁面結構用類和方法封裝起來,然後寫一寫後臺的管理頁面,再完成基本的功能,那就很開心了。

關於多執行緒,和GPS位置,呼叫地圖元件,等完成這些之後,再擴充套件吧,

持續更新,私以為這就是NB-loT的縮影,可以應付一般的智慧裝置,主要是採用了SIM的GPRS通訊,完成了獨立硬體硬體的聯網功能,也就是物聯網的概念吧。

2018/03/20 23:41 剛剛玩完吃雞遊戲,臨時更兩句吧,

   今天開始除錯 伺服器和 硬體的通訊(STM32+SIM900),實現的目的是 伺服器開啟Socket服務,監聽1337埠,客戶端(STM32+SIM800)建立一個Socket客戶端連線伺服器(IP+Port)。服務端等待客戶端連線,當客戶端連線上之後,檢測客戶端的IP,將解鎖指令寫入Socket連線(類似於管道或者緩衝區的東西)中,客戶端從連線中讀取資料,檢測指令進行判斷,通過STM32的IO傳送指令給電控鎖(其實是繼電器),繼電器控制電控鎖開啟,從而完成開鎖功能。

  目前,要解決的問題是:客戶端持續向伺服器傳送資料,以保證ip地址不會改變,這也是socket的主要問題,要完成長連線,通過心跳包。

 測試結果:伺服器端Socket要持續監聽埠,保持客戶端能持續的聯網,ip地址不變,重點測試是不是客戶端啟動中,ip就不會變,與伺服器無關。經過測試,GPRS一旦與網路建立連線,IP地址就不會改變。

學習下,繼電器和電機鎖的原理,接觸下。

首要任務,先調通整個系統,然後再完整以上功能。加油。

-------------------------------------------------------------------------------

2018/03/21  09:23  打卡上班了,先刷一些嘻哈、吾愛、知乎,再搞。

繼電器的東西,搞清楚了些。老師沒給我電機鎖,我使用的STM32整合板看了好久原理圖,沒找到5V的輸出,只有3.3V的輸出,而繼電器使用的是5V的輸入,當使用3.3V的輸出接入繼電器時,繼電器的訊號燈會亮,繼電器內部並不會產生磁性而開啟或斷開(也就說只是有個訊號燈,效果會折半,但是還是可以用的)。

整個系統 還是沒有調通,因為整體的進度還可以,就去幫同學看了些她的畢設,基於arduino的紅外避障小車實現,因為電子競賽的時候也做個小車的題目,沒有使用過arduino,所以有些興趣。可惜她買的是全套的資料,包括了車架、arduino板子、紅外模組、電機控制以及一部分程式碼,都包含了。只需要安裝好,燒錄下隨單附贈的程式就行了,燒完程式,小車的紅外模組正常,小車的車輪不轉,後來給馬達單獨接上電池,發現馬達是好的,後來換了6節南孚電池,小車才開始跑起來。果然南孚就是吊。小車目前已經可以完成紅外避障了,就是紅外模組的感應不太敏感,總是碰到東西之後才會轉彎,反應有點慢,初步方向是:調節PWM調節轉速使小車的速度降下來,這樣轉彎就會流暢一些吧。不過,不管她了。

發現對於整個系統還是有些不清楚的地方,所以還是梳理一下吧。

整體:要實現的功能從 微信端掃碼開始,經過伺服器,伺服器傳送指令到GPRS模組,GPRS模組通過串列埠傳送到STM32F103處理器,STM32F103通過IO口置位控制繼電器,繼電器達到條件可觸發車鎖開關。

第一部分:目前微信端可以通過掃碼傳送單車id到伺服器,伺服器可以提取到id編號,此處通過Utils的方法獲取單車id,然後通過資料庫查詢檢索該id的條目,獲取其對應的IP地址。

第二部分:然後呼叫Server.php的find($ip)方法,使用資料庫查詢的ip做引數,find方法中啟動Socket伺服器監聽,通過socket_accept方法接受客戶端的連線,等客戶端連線上之後,獲取客戶端的ip地址,用引數ip和客戶端的ip做比較。

if _:如果一致,就向socket通道里寫入標識號(目前是“1”),然後sleep一小會,以使得客戶端能夠讀取資料,然後SIM800模組通過串列埠3傳送資料到STM32處理器,處理器判斷資料滿足條件,然後將某個IO口置位(目前是將一個控制led燈的口置位為1),

此處插入一下,繼電器和STM32的連線:STM32的5V 連線 繼電器的 VCC,STM32的GND 連線 繼電器的GND,使用一個IO口連線繼電器的IN1,IN1用來控制繼電器的觸發條件。目前的連線方式是 ON(常開端)接STM32的 5V,COM(公開端)接STM32的GND,這樣連線的話,不需要接其他的的東西,繼電器就有反應,會聽到“滴”的一聲。明天會問老師要電機鎖,然後將ON和COM接入電機鎖,測試下是不是能成功。

else_:如果ip匹配不一致,說明掃得單車id和目前連線到Socket伺服器的客戶端不是同一輛車,此時就斷開Socket連線,等到下一個客戶端連線,再檢測ip是否一致,一致就執行if的操作。

還是心理有畏懼,不敢接觸多執行緒,如果啟動Socket伺服器監聽埠,並接受每個客戶端的連線,同時接受多個客戶端的資料傳輸,就會產生多個程序,客戶端定時傳送心跳包到伺服器端,伺服器端實時檢測客戶端的ip地址,再匹配資料庫的ip地址,傳送指令的話,如果有100個客戶單(即單車)就會產生100個程序,幾乎是實時通訊,伺服器可能會宕機,參考共享單車的實現,如果一個伺服器同時連線幾百或者上千個客戶端連線的話,會不會宕機,我的實現思路是不是正確,值得考慮。

晚安了。

---------------------------------------------------------------------------

2018/3/22 20:09

 下班了。把昨天碼過的字,認真看了下,今天還是沒有成功,想哭,旁邊選了微控制器畢設題目的小哥哥小姐姐們,某寶成品100搞定,而我竟然折騰了Centos7雲伺服器,接觸了花生殼,學習了用自有伺服器開發微信公眾號,PHP的基本語法,Socket通訊。儘管現在還是有點亂,但是我相信多學點東西總是有好處的。

 目前的情況是,雲伺服器有兩套獨立的微系統,支援微信公眾號的功能 以及 支援Socket服務。

微信系統:使用者通過公眾號掃碼,傳送id到伺服器,伺服器獲取id號,查詢資料庫找到id對應的IP地址(車鎖的SIM動態IP地址),傳送給Socket伺服器。

Socket伺服器:接受到經微信系統查詢資料庫找到的IP地址,啟動Socket監聽,獲取連線的客戶端IP地址,與資料庫IP地址匹配,成功則將解鎖指令寫到Socket通道中。

單車的智慧車鎖:車鎖的SIM模組會接收到資料,傳送到STM32的處理器,STM32控制繼電器,從而完成開鎖。

我在嘗試著實現的時候,發現了非常恐怖的事情,雲伺服器的兩個系統(我自己寫的系統)是相對獨立的,特別是微信端的系統,用來支撐微信公眾號的功能,我嘗試著在php中include一個檔案,從而呼叫啟動Socket的方法,直接完成一系列的功能執行,但是一旦添加了socket_bind的方法時,公眾號總會異常。下面貼一下程式碼,很難講清楚。

Utils.php :主要是logger起作用,用來查詢資料庫。

<?php
include 'Server.php';

class Utils{
    /**
     * 列印日誌到log.xml
     * @param $log_content:日誌內容
     * @param string $type:日誌來源,預設‘使用者’
     */
    public static function logger($log_content, $type = '使用者')
    {
        $xml_log_content = simplexml_load_string($log_content);
        $id = $xml_log_content->Content;
        echo $id."\n\r";
        $con = mysql_connect("localhost","root","Mysql2966031005");

        mysql_select_db("my_db", $con);

        $rs = mysql_query("SELECT * from bike where id = '$id'");

        $row = mysql_fetch_array($rs);

        $mysql_id = $row['id'];
        $ip = $row['ip'];

     Server::find($ip);

        mysql_close($con);

        $max_size = 3000;
        $log_filename = "./log.xml";
        if (file_exists($log_filename) and (abs(filesize($log_filename)) >
                $max_size)) {
            unlink($log_filename);
        }

        file_put_contents($log_filename, $log_content."\n\r".$id.$ip."\n\r", FILE_APPEND);
    }
    /**
     * 獲取access_token
     * @return mixed
     */
    public static function get_access_token()
    {
        $appid = "wxfd8fd157a47bc539"; //需替換成你的appID
        $appsecret = "9efe8ba722e7506f1c1aed11740e64b3"; //需替換成你的appsecret
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&".
            "appid=$appid&secret=$appsecret";
        $output = Utils::https_request($url);
        $jsoninfo = json_decode($output, true);
        return $jsoninfo["access_token"];
    }
    /**
     * 傳送請求
     * @param $url:地址
     * @param null $data:post的資料
     * @return mixed:請求返回的結果
     */
    public static function https_request($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
}

Server.php: 主要是 find方法,

<?php
class  Server{
    /*  主要有 find($ip)方法,接收通過Utils傳遞過來的IP地址,
     *     啟動 socket監聽,等待客戶端連線,獲取連線的客戶端IP地址
     *     與 Utils頁面傳遞過來的地址比較,若 一致,
     *       而向 IP地址傳送 開鎖 指令,通過TCPc傳輸傳送GPRS資料到 SIM卡
     * */
    public static  function  find($ip){
        $ip_local = "123.23.13.250";
        set_time_limit(0);
        //設定IP和埠號、
        echo "start....\r\n";
        printf("start...\r\n");
        $address = "10.141.75.98";   //要連線的伺服器地址
        $port = 1337;               //除錯的時候,可以多換埠來測試程式

        echo "set_IP and set_port...\r\n";
        /**
         * 建立一個SOCKET
         * AF_INET=是ipv4 如果用ipv6,則引數為 AF_INET6
         * SOCK_STREAM為socket的tcp型別,如果是UDP則使用SOCK_DGRAM
         */
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");
        //繫結到socket埠
        $result = socket_bind($sock, $address, $port) or die("socket_bind() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");
        echo "start_listening....../n/r";
        //開始監聽
        $result = socket_listen($sock, 4) or die("socket_listen() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/r/n");
        echo "OK\nBinding the socket on $address:$port ... ....\r\n";
        // 等待 客戶端 連線

        $time = 0;
        do {
            $msgsock = socket_accept($sock);
            //  獲取客戶端 資料 (IP地址 和 埠號)
            socket_getpeername($msgsock, $addr, $por);

            echo "<br/>" . $addr ."==". $ip . "<br/>"; // 223.104.13.203
            //  拿 客戶端的 IP 地址 和 Utils 傳遞過來的 IP地址 比較,一致而 傳送指令到 該 IP地址
            break;
            // 如果 資料的ip與獲取的客戶端ip一致,就傳送結果指令到 客戶端
            // 否則,就返回accept 繼續執行等待客戶端
            if ($addr == $ip) {
                $length = socket_write($msgsock, "2");  // 將開鎖指令傳送發到 客戶端
                echo "success!";
                echo $length;
                sleep(3);
            }else{
                socket_close($msgsock);
                continue;
            }
            sleep(3);
            echo "after_sleep";

            socket_close($msgsock);
            $time++;
            echo "$time == ".$time;
        }while($time<2);
        socket_close($sock);
    }
}


?>

本來的想法是,在Utils.php中呼叫一下Server.php中的find($ip)方法,將資料庫的ip做引數傳遞過去,然後find($ip)方法中啟動Socket監聽,等待客戶端的連線,獲取客戶端ip與引數ip做比較,一致則寫識別符號到Socket通道中,否則退出迴圈,再等待客戶端連線。

每次在Utils.php的logger方法中寫 $server->find($ip)或者Server::find($ip)方法,公眾號總是會出現異常,儘管我寫了include或require,甚至_once都試過了,後來測試,將實現功能的程式碼直接加入Utils.php的方法中,發現在socket_bind(...)方法時,公眾號會出現異常,遂放棄了。

現在的思路比較難受,屬於繞了個彎。因為兩個系統獨立,不能傳遞引數,當時想過換個app去實現,但時間比較少了,不想再除錯其他的東西,怕時間不夠用。所以想到了資料庫,我可以將Utils.php的引數儲存到資料庫,然後在Server.php頁面將資料取出來,這樣豈不是可以實現功能,簡直爽歪歪。

從而開始引入了MySQL。遂寫成了這樣,哈哈哈哈。

Utils.php

<?php

class Utils{
    /**
     * 列印日誌到log.xml
     * @param $log_content:日誌內容
     * @param string $type:日誌來源,預設‘使用者’
     */
    public static function logger($log_content, $type = '使用者')
    {
        $xml_log_content = simplexml_load_string($log_content); // 獲取xml字串
        $Content = $xml_log_content->Content;        // 獲取其中的 Content內容
        $id_weixin = $Content;
        $con = mysql_connect("localhost","root","Mysql2966031005");// 連線資料庫
        mysql_select_db("my_db", $con); // 選擇資料庫
        $rs = mysql_query("SELECT * from bike where id = '$id_weixin'");//  執行查詢操作
        $row = mysql_fetch_array($rs); // 獲取查詢的 結果,(以陣列形式儲存)
        $id = $row['id'];  //獲取 資料庫對應條目的 ID
        $ip = $row['ip'];  // 獲取 資料庫對應條目 的 IP

        mysql_query("update bike set status = '1'  where id = '$id_weixin'");//  將對應的id條目的status設定為1
        // 呼叫Server的方法啟動,Socket監聽

        mysql_close($con); //關閉資料庫連線

        $max_size = 3000;
        $log_filename = "./log.xml";
        if (file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)) {
            unlink($log_filename);
        }
        file_put_contents($log_filename, $log_content."\n\r".$ip."hh\n\r", FILE_APPEND);

        set_time_limit(0);
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");
        $result = socket_bind($sock, "10.141.75.98", 1337) or die("socket_bind() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");
        $result = socket_listen($sock, 4);
    }
    /**
     * 獲取access_token
     * @return mixed
     */
    public static function get_access_token()
    {
        $appid = "wxfd8fd157a47bc539"; //需替換成你的appID
        $appsecret = "9efe8ba722e7506f1c1aed11740e64b3"; //需替換成你的appsecret

        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&".
            "appid=$appid&secret=$appsecret";
        $output = Utils::https_request($url);
        $jsoninfo = json_decode($output, true);
        return $jsoninfo["access_token"];
    }
    /**
     * 傳送請求
     * @param $url:地址
     * @param null $data:post的資料
     * @return mixed:請求返回的結果
     */
    public static function https_request($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
}

Server.php:

<?php

Server::find();
class  Server{
    public static function  find(){
        set_time_limit(0);
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");
        $result = socket_bind($sock, "10.141.75.98", 1337) or die("socket_bind() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");
        $result = socket_listen($sock, 4);

        $time = 0;
        do {
            $msgsock = socket_accept($sock);
            socket_getpeername($msgsock, $addr, $por);

            echo "<br/>" . $addr . "<br/>"; // 223.104.13.203
            //  拿 客戶端的 IP 地址 和 Utils 傳遞過來的 IP地址 比較,一致而 傳送指令到 該 IP地址
            $ip_status_1 = Server::find_status_1();
            // 如果 資料的ip與獲取的客戶端ip一致,就傳送結果指令到 客戶端
            // 否則,就返回accept 繼續執行等待客戶端
            if ($addr == $ip_status_1) {
                $length = socket_write($msgsock, "1");  // 將開鎖指令傳送發到 客戶端
                echo "success!";
                echo $length;
                sleep(3);
            }else{
                socket_close($msgsock);
                $time++;
                continue;
            }
            sleep(3);
            echo "after_sleep";
            socket_close($msgsock);
            $time++;
        }while($time<20);
        socket_close($sock);
    }

    public static function find_status_1(){  // 獲取status為1的條目,並獲取其 ip
        $con = mysql_connect("localhost", "root", "Mysql2966031005");// 連線資料庫
        mysql_select_db("my_db", $con); // 選擇資料庫
        while (true) {
            $rs = mysql_query("SELECT * from bike where status = '1'");//  執行查詢操作
            if (!($rs == null)) {    // 如果status = 1 的條目存在,執行 if
                $row = mysql_fetch_array($rs); // 獲取查詢的 結果,(以陣列形式儲存)
                //$id = $row['id'];  //獲取 資料庫對應條目的 ID
                $ip = $row['ip'];  // 獲取 資料庫對應條目 的 IP
                echo "IF_Module";
                return $ip;   // 返回 IP地址 到 find  方法
            } else {
                echo "else_Module";
                return "else";
            }
        }
    }
}
?>

這樣,我覺得我可以 先啟動Socket伺服器,實時監聽客戶端的連線,然後查詢資料庫,是否有哪條記錄的status被置位為1,說明該IP地址匹配的二維碼被掃碼了,發現之後,就獲取ip,與連線的客戶端匹配,匹配成功,完成開鎖。

沒有測試還是沒譜,希望能有個好的結果吧。對於伺服器端總是會出現不定時間的Listen狀態,有點搞不明白。感覺自己寫的sleep並沒有影響。

就這樣吧,晚安吧。

-----------------------------------------------------------------------------------------

2018/3/23 11:50 

 經過除錯,目前可以使用,但是還存在一些小的問題,還需要完善,不管怎麼說,還是蠻開心的,儘管在意料之中,可依然興奮。

給畢設指導老師看過了,測試還是正常的,開心。估計大體就這樣了,從開始折騰,到模組測試,再到整合測試,覺得也花了些時間,畢竟防火牆的埠開放,就搞了兩天。後來的系統整合,也是存在各種問題,現在折騰到基本功能實現,已經有點筋疲力盡了,不準備朝著這方面就業,那就做成這樣,就了結吧。 

爭取這周完成畢設論文終稿,然後整理出畢設的指導文件,就當是給老師留給念想吧,也給學弟學妹提供個肩膀。我覺得我的畢設應該叫 網際網路+,因為昨天看到周鴻禕前輩講 +網際網路 和 網際網路+,共享單車的產品思路 是為了顛覆傳統的設計,所以,我是網際網路+,

 結束之後,我要拾起我的Java,I'm ready。

 給老師看了下我的 論文,講了下我的畢設,老師說 讓我把多執行緒做一下,要不有點太簡單了。

  然後就查了 PHP對多執行緒的支援,看到說 pcntl 的php元件,然後就想搞這個吧,我覺得也挺簡單的。我的伺服器是用的WDCP平臺完成的 lanmp 整合安裝,然後就是找wdcp如何安裝 pcntl 確實有些說法,也這折騰了,發現 伺服器上有 多個php.ini,不知道是哪個起作用,後來就有點煩躁,畢竟對Linux還有不太熟悉,而且平臺是 通過WDCP來管理的,總覺得它們有個託管什麼的,不知道整個系統是怎麼配置的,到底是在wdcp還是在linux設定的許可權大。

  折騰了好久,通過重新搭建環境,在MySQL的安裝上做一些操作,最終還是安裝好外掛了。

  不管了,開始搞我的多執行緒, 搞定之後,就可以答辯了,答辯結束 就可以自由了。飛起來了。

等我答辯結束,把這些東西整理一下,再認真梳理下,物聯網的原理。

好了,才搞完pcntl 發現不是我想要的東西,pcntl是用來分解程序的,可以分解出一個子程序,然後按順序執行。而我想要的是多執行緒的,需要new一個執行緒 用來同步執行。又是一下午,發現搞不定,所以把我的wdcp系統廢掉,重做了一下。

所以呢,就又開始擴充套件多執行緒的元件,pthreads,這麼一搞,又是一天,md,然後還寫了測試程式,最後回想起,多執行緒是 cpu 輪詢執行,並不是並行操作,感覺這次 要涼。

沒錯,已經涼涼了。

 所以呢

 今天 又瞭解了一下 程序和執行緒的 區別,後來使用程序測試了下,好像可以了,現在不搞了,緩一緩。

---------------------------------------------------------------------------

2018-04-18 論文寫了很多

好久沒有更新了。目前的情況,可以搞定了多程序方式搞定。然後就開始寫論文了,寫了7、8稿了。老師都不太滿意,一直再改,等搞穩了,再來更新吧。最後把所有的實現流程都整理一下。

2018-04-25 現在終於定稿了,剩下的就是細節了。發現了一個很重要的問題,在畢設的初步階段(有了比較詳細的實現流程以及能講清楚想做什麼),你一定要跟老師溝通過,看看他想要你做的東西,和你想做的東西是不是一致的。以為僅僅憑藉一個任務書,一個開題報告,並不能確定性的將問題定位好,還是需要進一步的溝通,免得最後出問題。

 每一次小的論文修改(不涉及到整體的方向和框架的時候,都是1.x,當老師說你寫的不是我要求的東西時,就會出現2.0)。小版本改動和大版本改動。此處想說,老師比較忙,一般不會很認真的看你的需求,(此處單指我們老師)所以就出現了最終的論文我只寫了硬體部分,想哭。

關於論文,我覺得現在貼上來有點太早了。還是再等幾天再說。如果有什麼需要幫助的,可以留言,記得留下聯絡方式哈。

最後貼一張查重報告吧,一次過,開心、畢竟是自己寫的。

後期也幫同學做過人工降重,發現也沒有多難。一個39%直接降到16%。一個43%直接降到19%。還有一個55%直接到10%。 而且我對硬體和軟體的開發都比較瞭解,所以降重也不會語義不同,而是換一些更專業的詞彙,畢竟做了類似課題的都是大學生,多數人寫的文章真是是菜,用到專業詞彙的比較少。

最後的實現細節跟之前的描述有些區別。

首先,車鎖部分即硬體部分,使用了STM32F103作為處理器,搭載一個GPRS模組(自備SIM卡),通過IO口連線電控鎖。車鎖上貼一個二維碼,二維碼的資訊是STM32F103的序列號。

伺服器上有微信端,微信端開發掃碼功能,通過二維碼生成網站生成一個帶特定資訊的二維碼(此處的特定資訊是STM32F103的序列號,這樣就能唯一的確定車鎖)。當用戶使用公眾號掃描車鎖上的二維碼時,將STM32F103的序列號傳送到伺服器。

伺服器獲取序列號,查詢資料庫中的記錄,若存在該序列號記錄,就將記錄中的一個欄位Status置位1,標識該車鎖應該開啟。

Socket服務始終開啟著,車鎖開啟之後,就會主動連線Socket Server,每一個車鎖與SocketServer建立連線,都開啟一個新程序對連線進行操作。在程序中,車鎖端將車鎖的STM32F103序列號傳送到SocketServer,SocketServer獲取到序列號,查詢資料庫是否存在該記錄,該記錄的Status值是否為1,若為1,則向該車鎖傳送解鎖指令。否則,sleep一秒,再次查詢。

車鎖的GPRS模組接收到伺服器傳送的解鎖指令,通過串列埠傳送到STM32F103處理器,處理器通過IO置位控制連線的電控鎖開啟。

就這些啦!感覺做的並不是很好,但是有點力不從心,真正做的時候,還是沒有說的這麼簡單。

         :https://download.csdn.net/download/ca1m0921/10414487

希望小夥伴有什麼 類似的想法和專案的 也可以跟我交流,對我物聯網這塊 我還是很感興趣的。

相關推薦

共享單車智慧設計

-------------------------------------------------------------------------------- 2018-05-15  畢設答辯結束20天后: 畢業設計已經完成,且答辯結束。回過頭來認真梳理下開發的流程

藍芽模組在智慧城市、地鐵、共享單車等領域的物聯網應用正改變世界

  智慧城市的概念仍然是一個流動的概念,還有許多未回答的問題,沒有一致的定義。雖然很難說城市化的挑戰正在迅速變化,但世界一半以上的人口現在生活在城市環境中,產生更多的廢物,造成更多的擁擠,併產生更多的溫室氣體。   城市環境中的問題解決現在需要創造性思維。技術對城市居民的生活質量的貢獻是什麼?如何將技術融入

共享單車】—— React後臺管理系統開發手記:主頁面架構設計

前言:以下內容基於React全家桶+AntD實戰課程的學習實踐過程記錄。最終成果github地址:https://github.com/66Web/react-antd-manager,歡迎star。  一、頁面結構定義 左側導航欄,右側頁面結構 右側顯示內容分別分為上Header

智慧寫上區塊鏈,他們要從萬億共享經濟市場裡把千億中介費反哺消費者

本堂茜 渡鴉區塊鏈專欄記者 許多區塊鏈創業者認為區塊鏈最容易切入的角度是金融領域,而區塊鏈與實體經濟結合的想象力究竟如何?多靈智慧為我們提供了一個不同的視角。

React共享單車後臺管理系統開發(記錄筆記2)——主頁面架構設計

本文基於React共享單車後臺管理系統的開發進行學習記錄,內含React生態系統的整體介紹及相關內容,最終成果物程式碼請參見最後一章。 一.基礎外掛安裝,Less檔案載入配置 安裝React-Router:yarn add react-router

架構設計 | 高併發流量削峰,共享資源加機制

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent) # 一、高併發簡介 在網際網路的業

爬蟲獲取mobike共享單車信息

gzip 找不到 mac os x msg clu strftime number rms break 背景:端午節假期的時候參加了學校的數學建模比賽,題目是關於共享單車的供需匹配問題,需要獲得共享單車的數量和時空分布情況。 在苦苦找尋數據無果的情況下決定自己用爬蟲對天

共享單車“殘廢”之後,怎麽處理才是上上策?

航空母艦 占地面積 廢金屬 杭州 人人 自共享單車誕生之後,關於它的爭議、詆毀、贊揚、痛批等或褒或貶的聲音從未停止。但不管怎樣,似乎都無法讓共享單車高歌猛進的態勢停下來。如今,共享單車的火爆是其他共享經濟細分項目所無法比擬的。而在湊齊了“赤橙黃綠青藍紫”,甚至土豪金、純黑等多種顏色之後,這

永安行站在共享單車風口,卻差點被吹閃了腰

fcm wbs ioc lan gsl aop awd roi spl 滿大街的共享單車,已經競爭到了“顏色不夠用”的地步,共享單車這個風口仍沒有退去之意。國內最大公共自行車運營商永安行也站上了風口,推出了無樁共享單車。沒料想卻遭遇專利訴訟,並暫緩上市發行。沒能風口起飛,還

出售周邊+品牌合作!共享單車還能玩出什麽新花樣

共享單車  共享單車目前的火爆,可謂有目共睹。不過,暫且不管各大共享單車企業是如何展開“撕X”大戰,單單是商業模式就值得商榷。當下共享單車企業還都是在瘋狂融資,極力擴地盤。但就目前來看,共享單車企業還沒有明確的盈利模式,主要是靠租車押金、騎行花費等作為主要的營收來源,目前尚未有一家企業表示已經盈利。  要想在

共享單車也玩山寨!還能做哪些突破底線的事兒?

共享單車在大眾的印象中,山寨雖然早已成為常態,但其模仿的對象往往是成熟的產品或者服務。將後者照搬過來改頭換面,借助後者的影響力,去蹭一波熱點,以最快的速度撈錢,是山寨的最大特點。但沒想到的是,就在方興未艾的共享單車領域,竟然也出現了山寨事件!這一山寨事件,是某創業企業對ofo小黃車進行copy,讓人傻傻難辨真

聊一聊共享單車

高峰 地鐵站 中學生 電商 吐槽 活動 存在 http ... 1.共享單車的模式用戶交押金,然後騎車,按照騎車時間進行計費。其實,嚴格意義上來講,這還並不屬於共享經濟,更像分時租賃。 2、共享單車的用戶人群 & 特征用戶人群:80後、90後的低頻打車人群,

50天!3家!共享單車終於開始了“大逃亡”

共享單車還記得當年的“千團大戰”麽?慘烈至極、血流成河。但最終,僅剩下美團和大眾點評——二者還合二為一了。與其相似的,還有共享打車行業、社交行業、信息分類行業等。國內特殊的互聯網形勢決定了,在一條賽道上只能容下數名大佬參賽者比拼,其余的在半路上就會被提前淘汰出局。而在目前火爆的共享單車行業,似乎也要“擰幹水分

從利民出行到擾亂城市交通,共享單車怎麽了?

共享垃圾8月18日,上海市交委發布通知,率先對共享單車按下“STOP”鍵,禁止共享單車在上海新增投放車輛。這標誌著上海政府正式插手對共享單車的管理,共享單車的發展進入一個新階段。除了上海以外,8月22日,廣州市交委也明確要求,禁止共享單車新車投放。南京、合肥等地也有相關政策。政府插手共享單車市場早有先例其實,

這個冬天,將是共享單車最艱難的時刻

共享單車自從共享單車出現以來,幾乎每一天都有新的話題,無論是正面的還是負面的,圍繞著這個新事物討論的我們,最關註的還是這個行業到底能夠走多遠?6月份的時候,很多人因為京滬杭街頭出現土豪金配色的共享單車而被刷屏,其背後的酷騎公司甚至稱要在年底之前在全國範圍內投入1000萬輛單車。然而,時隔兩個月,這款高調的共享

多城市叫停共享單車新車投放 比拼進入“下半場”u

tld 共享單車 c89 scm res uos fur tro 湖南省 多城市叫停共享單車新車投放 比拼進入“下半場”   “任務型”問責中第一種是未按要求完成交辦問題整改的,發現2個、4個、6個問題的,將分別問責副縣(區)長、縣(區)長、縣(區)委書記;第二種是通過強化

殺向全球的共享單車,最後真能有所作為嗎?

共享單車縱觀國內互聯網企業的發展之路,在牛X到一定規模後,“出海”幾乎成為必然的“套路”。比如阿裏、騰訊等巨頭在海外玩得天翻地覆,小米、一加等在海外艱難前行也要咬牙堅持……之所以對“出海”辣麽青睞,自然有諸多好處——為在全球立足做好準備、贏得更大發展空間反哺國內市場……而現在流行的,是在國內立足未穩就急不可耐

爬取ofo共享單車信息

tco tty -s 返回 es2017 ram mac os x common market   前段時間看到很多微信公眾號在轉發一篇爬取mobike單車的信息,也不知道什麽原因,在網上搜索了下很少有人在爬取ofo共享單車的數據,所以決定看看可以爬取ofo共享單車的那些數

共享單車哈羅王炸連出,OFO小心淪為炮灰

哈羅單車在共享單車行業寒冬之際,哈羅單車卻是好消息不斷,先是12月4日宣布獲得3.5億美元的D1輪融資,昨天又再次宣布完成10億元的D2輪融資,在這大家都勒緊褲腰帶過日子的寒冬裏,哈羅單車可謂是王炸連出,來了一輪大逆襲。哈羅單車何以王炸不斷?投資者背後的邏輯又是什麽?我們不妨來做個探究。一、螞蟻金服:為了更加

共享單車物聯網技術簡析

輸入 智能鎖 creat 通過 充電 左右 智能車 服務器端 .com   共享單車自誕生之日起,便以如火如荼之勢席卷全球,成為時下智慧生活最熱點的名詞之一,墻邊街角,五顏六色的共享單車隨處可見,每個人的手機裏都或多或少的安裝了幾款共享單車的APP。要說其中的佼佼者,莫過於