树莓派部署网站(内网穿透)点亮LED灯保姆级教程(五)

离目标越来越近了,这次使用flask在树莓派部署一个网站服务器,用户通过访问网页的形式,点击按钮向服务器发送点灯或者关灯的请求。

局域网模式

后端程序:

from flask import Flask, render_template, request, url_for, flash, redirect,abort
import json
import RPi.GPIO as GPIO

app = Flask(__name__)


def led(a):
    if a=='Light The LED':
        GPIO.output(40,GPIO.HIGH)
    
    elif a=='Turn off The LED':
        GPIO.output(40,GPIO.LOW)
    return a

@app.route('/')
def index():
    return render_template('index.html')

@app.route("/dataFromAjax",methods=['POST'])
def recv():
    data = request.get_data()
    json_data = json.loads(data)
    print(json_data)
    username = json_data.get("username")
    print(led(username))
    return render_template("index.html")



if __name__ == '__main__':
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(40,GPIO.OUT)
    app.run(host='127.0.0.1',port=5000,debug=True)

前端部分关键程序:

<button id="showBtn" class="theme-btn dark" href="#" title="">Control The Raspberry</button>
                            
                        <div id="popup">
                            <form action="/dataFromAjax" method="post"></form>
                                <button id="light_led"  href="#" title="" value="light">Light The LED</button>
                            </form>
                        </div>
                        
                        <script type="text/javascript">
                            function SendAjax(){
                                var username = led_Btn.textContent;
                                
                                $.ajax({
                                    url:"./dataFromAjax",
                                    type: "POST",
                                    contentType: "application/json;charset=utf-8",
                                    data: JSON.stringify({"username":username}),
                                    success:function(result){
                                        alert(username);
                                    },
                                    error:function(){
                                         alert("执行失败了...");
                                    }
                                });
                            }
                        </script>


                        <style>
                            #popup {
                              width: 230px;
                              height: 230px;
                              text-align: center;
                              background-color: #f5d3d3;
                              /* 其他样式属性 */
                              display: none;
                              
                            }
                            #light_led{
                             top: 50%!; 
                             transform: translateY(50%);
                             background-color: grey;
                             
                            }
                        </style>
                        <script>
                            function showPopup() {
                              var popup = document.getElementById('popup');
                              popup.style.display = 'block';
                              
                            }
                            
                            function hidePopup() {
                              var popup = document.getElementById('popup');
                              popup.style.display = 'none';
                              
                            }
                            function showorhide(){
                                var popup = document.getElementById('popup');
                                if(getComputedStyle(popup,null)['display']=='none'){
                                    popup.style.display = "block";
                                    socket_onopen();
                                }
                                else if(getComputedStyle(popup,null)['display']=='block'){
                                    popup.style.display = "none";
                                }
                            }
                            
                            function led(){
                                var led_stats=1;
                                var light_led = document.getElementById('light_led');
                                console.log(light_led.textContent)
                                
                                if(light_led.textContent=='Light The LED'){
                                    light_led.textContent = "Turn off The LED";
                                    light_led.style.backgroundColor = 'yellow';
                                    light_led.value='off'
                                }
                                else if(light_led.textContent=='Turn off The LED'){
                                    light_led.textContent= "Light The LED";
                                    light_led.style.backgroundColor = 'grey';
                                    light_led.value='light'
                                }
                                
                            }
                        </script>
                        <script>
                            var showBtn = document.getElementById('showBtn');
                            showBtn.addEventListener('click', showorhide);
                            var led_Btn = document.getElementById('light_led');
                            led_Btn.addEventListener('click',SendAjax);
                            led_Btn.addEventListener('click',led);
                            
                        </script>

应用post和AJAX方法,按钮按下以后使用json给后端传送数据,如果发送失败,会有弹窗反馈执行失败。由于前端相关知识浩如烟海,后面将单独讲解,本教程不再赘述。后端程序中,点灯操作与return至主界面,都为flask的常规操作,程序中的usrname与前端程序中的usrname(按钮的键值)对应,按钮按下后前端会使用post方法将键值传递给后端,后端通过判断,决定是点灯还是关灯。

内网穿透模式

终于到了最后一步,这一步我们需要提前准备一个云端服务器,我使用的是cpolar(极点云)。按照极点云提供的Linux部署教程一步步安装,安装完毕后,使用vnc viewer,打开树莓派的浏览器,输入127.0.01:9200,打开cpolar的WEB UI管理界面。

输入自己注册时候的账号密码

点击左侧仪表盘的隧道管理——创建隧道:

  • 隧道名称:可自定义,注意不要重复
  • 协议:http
  • 本地地址:
  • 端口类型:随机域名
  • 地区:China vip

注意,这里的端口,还记得前面后端部分的端口吗?

这里的端口必须与flask的启动端口一致!比如我用的是5000端口,那么这边也必须填写5000。多说一句,内网穿透环节,flask的启动IP必须设置为‘127.0.0.1’。填写完毕后点击创建,隧道创建成功后,点击左侧的状态——在线隧道列表,可以看到刚刚创建的隧道已经有生成了相应的公网地址,将其复制下来,接下来测试访问一下。

将这个地址复制下来发给远方的朋友,他就可以控制你桌面上的LED灯了。本教程到此结束,纰漏之处还请大佬指导。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
树莓派的FRP是一种用于实现内网穿透的工具。通过FRP,您可以将位于NAT或防火墙后面的本地服务器暴露到互联网上。树莓派使用FRP来实现内网穿透的操作步骤如下: 1. 准备材料:您需要一台虚拟专用服务器(VPS),您可以选择使用virmach提供的虚拟专用服务器。 2. 配置服务器端:在虚拟专用服务器上安装并配置FRP。具体的配置步骤可以参考中的教程。 3. 配置客户端-树莓派:在树莓派上进行配置,使其能够与服务器端进行通信。具体的配置步骤可以参考中的教程。 4. 验证内网穿透:完成上述配置后,您可以尝试在树莓派部署一个Web服务器,例如Apache、Nginx或Tomcat,并发布自己的项目。然后通过云服务器的IP地址和端口来访问树莓派部署的项目,以验证内网穿透是否成功。具体的验证步骤可以参考中的说明。 如果您想重新安装FRP,可以按照中提供的方法进行卸载和重装。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [树莓派内网穿透方法大全](https://blog.csdn.net/concefly/article/details/115076359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [树莓派使用FRP实现内网穿透教程](https://blog.csdn.net/qq_41676577/article/details/112856618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [树莓派怎么实现内网穿透?](https://blog.csdn.net/weixin_47198051/article/details/122962247)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大初哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值