很早就想尝试一下用自己服务器试一下物联网,但一直比较忙没有付诸实践,现在正好寒假有空,又买了树莓派,就拿树莓派来试下吧
环境:pc+阿里云学生主机+树莓派4,均安装python3.7.1,vscode+sftp插件远程部署代码(这个吹爆,特别配合Flask库的debug模式,本地ctrl+s后就直接上传云端并重新运行)
首先,先在树莓派上找个有意义的数据,这里就定为cpu温度了,由于linux一切均是文件,获取其值就是打开一个文件读取的过程,代码如下
file = open("/sys/class/thermal/thermal_zone0/temp") tmp = float(file.read()) / 1000 file.close()
对比c可以说是相当简单了……
然后发送数据,有两种http数据传递方式:GET和POST,我这里使用了POST,用json数组来传递
data = { 'tmp': tmp } url = 'http://duya12345.top:39123/senddata' web_data = requests.post(url=url, data=json.dumps(data)).text print(web_data)
这两部分组合起来,再加个循环延时,树莓派部分就结束了,接下来写服务器端
服务器端我们要用到一个轻量级http库:Flask,接收之前树莓派传过来的数据部分代码如下:
app = Flask(__name__) @app.route('/senddata', methods=['POST']) def test_recv(): if not request.data: # 检测是否有数据 return 'no data' tmp_json = request.data # json.loads(tmp_str) print(tmp_json) return 'yes, i\'ve recived'
测试一下,服务器确实收到了数据,客户端也不停收到服务器的回应
然后新开一个api地址,对get请求这个地址的其他客户端返还此数据
@app.route('/resenddata', methods=['GET']) def test_send(): return tmp_json
测试发现tmp_json是空的,需要在app外定义变量,并在上一个route(接收程序)内定义为globle tmp_json,再用浏览器访问此api即可看到数据
最后是获取数据客户端,这就很简单了,get一下地址,获取到json数据,转换为字典后提取tmp值即可