python+树莓派实现IoT(物联网)数据上传到服务器

Posted 墨文

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于python+树莓派实现IoT(物联网)数据上传到服务器的主要内容,如果未能解决你的问题,请参考以下文章

阿里云物联网平台体验(树莓派+Python篇)

阿里云物联网平台体验(树莓派+Python篇)

云上树莓派:将传感器数据上传到 AWS IoT 并利用Kibana进行展示

分享丨云中树莓派:将传感器数据上传到 AWS IoT 并利用Kibana进行展示

腾云驾物—使用Azure IoT Hub接收树莓派传感数据展现到Power BI

软件工程师树莓派获取室内温湿度的坎坷之旅