環境: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