python+樹莓派實現IoT(物聯網)數據上傳到服務器


環境:raspbian-stretch(2018-06-27)

樹莓派:3代B型

1、樹莓派設備,需要在野外也能擁有獨立聯網能力,那必不可少的需要使用物聯網模塊。

這里使用的是微雪的SIM868通訊模塊,如下圖:

 

 2、將SIM868如下插入在空展板中,SIM868中使用的是聯通4Gsim卡,其實SIM868采用PIN#8(TX)、PIN#10(RX)引腳與樹莓派進行串口通訊,供電則是通過PIN#4(5V)、PIN#6(GOUND)支持。SIM868模塊采用http傳輸協議與服務器連接。

3、服務器配置

安裝Apache服務,使用xampp軟件安裝該服務,xampp鏈接:https://pan.baidu.com/s/15dt5s3DbZVd8YPckv2GkzA 密碼:78fg

運行XAMPP Control Panel,

啟動Apache服務,如果啟動失敗,應該是端口被占用,更改Apache的服務端口,就OK!

4、程序代碼

1)、python代碼

import time
import serial 

def send_data(param):
    W_http_6='AT+HTTPPARA="URL","http://xxx.xxx.xxx.xxx/iot.php?status='+str(param)+'"\r\n'
    ser.write(W_http_6)
    time.sleep(2)
    W_http_7='AT+HTTPACTION=0\r\n'
    ser.write(W_http_7)
    time.sleep(1)

if __name__ == '__main__':
    ser = serial.Serial("/dev/ttyS0",115200)
    print ser

    W_http_1='AT+HTTPTERM\r\n'
    ser.write(W_http_1)
    print "http_1"
    time.sleep(2)

    W_http_2='AT+SAPBR=3,1,"CONTYPE","GPRS"\r\n'
    ser.write(W_http_2)
    print "http_2"
    time.sleep(2)

    W_http_3='AT+SAPBR=3,1,"APN","CMNET"\r\n'
    ser.write(W_http_3)
    print "http_3"
    time.sleep(2)

    W_http_4='AT+SAPBR=1,1\r\n'
    ser.write(W_http_4)
    print "http_4"
    time.sleep(2)

    W_http_5='AT+HTTPINIT\r\n'
    ser.write(W_http_5)
    print "http_5"
    time.sleep(2)
    
    status=1
    while True:
    send_data(status)
    print status

    status = status+1
        time.sleep(3)

 

 2)、php程序代碼:

<?php
header("Content-type: text/html; charset=utf-8");
$file  = 'log.txt';//要寫入文件的文件名(可以是任意文件名),如果文件不存在,將會創建一個

$status = $_GET['status'];
echo $status ;    

if($status != "")
{
    $content = "status=".$status.",time=".date("Y/m/d H:i:sa")."\n";
  
    if($f  = file_put_contents($file, $content,FILE_APPEND)){// 這個函數支持版本(PHP 5) 
        echo "寫入成功。<br />";
    }
}

if($data = file_get_contents($file)){; // 這個函數支持版本(PHP 4 >= 4.3.0, PHP 5) 
    echo "寫入文件的內容是:$data";
}
                      
?>

 

 5、代碼解析

這里使用的Python版本號為2.7.13

import time
import serial 

引用了python的2個類庫time以及串口調試庫serial,為實現程序的調試可編寫,在使用serial串口調試庫前,要實現樹莓派的串口配置和Linux系統下的串口調試工具minicom的安裝。具體方法可參考之前的文章《樹莓派串口配置及minicom的安裝》

def send_data(param): W_http_6='AT+HTTPPARA="URL","http://xxx.xxx.xx.xx/iot.php?status='+str(param)+'"\r\n' ser.write(W_http_6) time.sleep(2) W_http_7='AT+HTTPACTION=0\r\n' ser.write(W_http_7) time.sleep(1)
這里將主函數循環的狀態status變量的值當做參數傳送給你個send_data()函數,在添加到HTTP請求的URL中,在服務器端寫了個PHP程序iot.php(程序源碼解析如下)用以接收SIM868通訊模塊發送過來的HTTP請求,並使用GET的方式獲得到HTTP請求URL中傳入的status值,並插入到日志txt中。 if __name__ == '__main__': ser = serial.Serial("/dev/ttyS0",115200) print ser W_http_1='AT+HTTPTERM\r\n' ser.write(W_http_1) print "http_1" time.sleep(2) W_http_2='AT+SAPBR=3,1,"CONTYPE","GPRS"\r\n' ser.write(W_http_2) print "http_2" time.sleep(2) W_http_3='AT+SAPBR=3,1,"APN","CMNET"\r\n' ser.write(W_http_3) print "http_3" time.sleep(2) W_http_4='AT+SAPBR=1,1\r\n' ser.write(W_http_4) print "http_4" time.sleep(2) W_http_5='AT+HTTPINIT\r\n' ser.write(W_http_5) print "http_5" time.sleep(2) status=1 while True: send_data(status) print status status = status+1 time.sleep(3)

以上代碼是在通過調用serial庫,設置樹莓派串口通信的波特率為115200,並使用 ser.write()函數向串口寫入可操作SIM868模塊進行通訊的AT指令,這里的AT指令是對SIM868進行HTTP通訊前的配置,具體AT指令的含義在這里不再贅述,可自行百度查找。這是使用time.sleep()函數控制程序執行的等待時間,確保串口寫入數據成功。

 

<?php
header("Content-type: text/html; charset=utf-8"); $file = 'log.txt';//要寫入文件的文件名(可以是任意文件名),如果文件不存在,將會創建一個  $status = $_GET['status'];//從url中獲取status參數的值 echo $status ; //輸出status參數的值 if($status != "")//如果status參數有值,則將該值插入到日志中 { $content = "status=".$status.",time=".date("Y/m/d H:i:sa")." \n";//定義插入到日志的數據格式 if($f = file_put_contents($file, $content,FILE_APPEND)){// 這個函數支持版本(PHP 5) echo "寫入成功。<br />"; } } //讀出日志中的所有數據,並輸出到html中 if($data = file_get_contents($file)){; // 這個函數支持版本(PHP 4 >= 4.3.0, PHP 5) echo "寫入文件的內容是:$data"; } ?>

 6、測試結果

樹莓派terminal端運行

python sim868.py

 

瀏覽器查看日志情況,可以看到樹莓派通過SIM868模塊確實將數據發送給了服務器!!!

 

 參考資料:http://www.eefocus.com/communication/397109

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM