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()
W_http_7='AT+HTTPACTION=0\r\n'
ser.write(W_http_7)
time.sleep() if __name__ == '__main__':
ser = serial.Serial("/dev/ttyS0",)
print ser W_http_1='AT+HTTPTERM\r\n'
ser.write(W_http_1)
print "http_1"
time.sleep() W_http_2='AT+SAPBR=3,1,"CONTYPE","GPRS"\r\n'
ser.write(W_http_2)
print "http_2"
time.sleep() W_http_3='AT+SAPBR=3,1,"APN","CMNET"\r\n'
ser.write(W_http_3)
print "http_3"
time.sleep() W_http_4='AT+SAPBR=1,1\r\n'
ser.write(W_http_4)
print "http_4"
time.sleep() W_http_5='AT+HTTPINIT\r\n'
ser.write(W_http_5)
print "http_5"
time.sleep() status=
while True:
send_data(status)
print status status = status+
time.sleep()
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 - django 使用ajax将图片上传到服务器并渲染到前端
一.前端代码 <!doctype html> <html lang="en"> <head> <meta charset="UT ...
- Raspberry Pi B+ 定时向物联网yeelink上传CPU GPU温度
Raspberry Pi B+ 定时向物联网yeelink上传CPU GPU温度 硬件平台: Raspberry Pi B+ 软件平台: Raspberry 系统与前期安装请参见:树莓派(Ros ...
- HTML5 文件域+FileReader 分段读取文件并上传到服务器(六)
说明:使用Ajax方式上传,文件不能过大,最好小于三四百兆,因为过多的连续Ajax请求会使后台崩溃,获取InputStream中数据会为空,尤其在Google浏览器测试过程中. 1.简单分段读取文件为 ...
- HTML5 Canvas前台压缩图片并上传到服务器
1.前台代码: <input id="fileOne" type="file" /> <input id="btnOne" ...
- 云中树莓派(2):将传感器数据上传到 AWS IoT 并利用Kibana进行展示
云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 1. 传感器安装及配置 1.1 DHT22 安装 DHT22 是一款温度与湿度传感器,它有3 ...
- C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
目 录 工业物联网和集成系统解决方案的技术路线... 1 前言... 1 第一章 系统架构... 3 1.1 硬件构架图... 3 1.2 ...
- 【AllJoyn专题】基于AllJoyn和Yeelink的传感器数据上传与指令下行的研究
接触高通物联网框架AllJoyn不太久,但确是被深深地吸引了.在我看来,促进我深入学习的原因有三点:一.AllJoyn开源,对开源的软硬件总会有种莫名的喜爱,虽然或许不会都深入下去:二.顺应潮流,物联 ...
- Arduino UNO +ESP8266采集数据上传到贝壳网
集成电路设计大赛赛程将至,我现在还是毫无头绪,然后又报了一个互联网+,比赛报了,东西就必须出来,时间很紧的情况下,所以选择了开源的arduino的进行完成.从开始接触Arduino到完成工程,前前后后 ...
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...
随机推荐
- DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战
大家好,先自我介绍一下,我是王睿.之前在Facebook/Instagram担任AI技术负责人,现在DataPipeline任Head of AI,负责研发企业级业务异常检测产品,旨在帮助企业一站式解 ...
- CQYZOJ P1392 拔河问题
题目\(1\) Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,且两个组内的所有人体重加起来尽可能地接近. Input 第\(1\)行是一个\( ...
- oracle 数据库手动备份和恢复
一.备份命令: 1.cmd : exp 2.cmd :用户名/密码@ip地址/数据库名 如: yyj/yyj@172.12.5.5/orcl 要导出的数据库 3.回车:输入要输出的 ...
- STM32------SYSCLK
重要的时钟:PLLCLK, SYSCLK, HCKL, PCLK1, PCLK2 之间的关系要弄清楚; 1.HSI:高速内部时钟信号 stm32单片机内带的时钟(8M频率)精度较差2.H ...
- JAVA 注解教程(二)元注解
简介 元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面 元注解有 @Retention.@Documented.@Target.@Inherited.@Rep ...
- tomcat8.5和redis实现session共享
1. 问题 由于之前看其他资料配置的session共享没注意自己tomcat的版本所以出现了诸多问题,tomcat8.5和之前版本的配置是不一样的. 2. 配置 ①将如图所示三个jar包放入t ...
- OpenGL 3D拾取文章(转)
参考文章 深入探索3D拾取技术 OpenGL 3D拾取 射线和三角形的相交检测(ray triangle intersection test) 3D拾取的方法有两种 1.基于几何计算的射线-三角形相交 ...
- bbs论坛注册功能(1)
分析项目需求创建表: STATICFILE_DIR = [ os.path.join(BASE_DIR,'static') #设置目录,bootstrip添加到目录中去,直接本地调用 ] # auth ...
- Quartus ii 初学遇到的问题以及解决
第一次下载和运行Quartus后,发现几个问题: 下载时安装易出现问题. 解决:在官网下载后,在开始破解: 运行程序出现警告:RTL波形时出现问题? 解决:testbench程序出错. 问题3:在视频 ...
- AcWing 830. 单调栈
https://www.acwing.com/problem/content/832/ #include <iostream> using namespace std; ; int stk ...