通过服务器托管的webhook访问本地网络上的设备

时间:2017-12-27 14:21:25

标签: python networking flask iot

我有一个充当webhook的python脚本。其中一部分如下:

import json
import os
import urllib
import socket
import _thread
from flask import Flask
from flask import request
from flask import make_response
app=Flask(__name__)

ip = ('192.168.1.75', 9050)

@app.route('/webhook',methods=['GET','POST'])
    def webhook():
        _thread.start_new_thread(sendDataToDevice,(ip))
        req = request.get_json(silent=True,force=True)
        print("Request:")
        print(json.dumps(req,indent=4))
        res=makeWebHookResult(req)
        res=json.dumps(res,indent=4)
        r=make_response(res)
        r.headers['Content-Type']='application/json'
        return r

if __name__ == '__main__':
    app.run(port=8080,host='localhost')

脚本的功能是将一些数据发送到连接到本地网络的设备。 当我打开我的网络浏览器并在网址栏上输入以下内容时,它可以完美运行:

http://localhost:8080/webhook

我想在服务器上托管脚本,例如。 Heroku的。在这种情况下如何访问本地设备?

注意:我知道我可以在本地计算机上运行该脚本,并使用ngrok将其显示在互联网上,但即使我的计算机已关闭,我仍希望它可以访问。此外,想要一个固定的链接,并且ngrok给出的链接在每次运行时都会发生变化。

1 个答案:

答案 0 :(得分:1)

我在使用IoT之前遇到过类似的问题。遗憾的是,没有简单的方法可以让设备在线显示。这是我用过的一个简单的解决方案。它可能不是最好的,但它确实有效。

DDNS +端口转发+静态IP

如果您可以访问本地WiFi路由器,则可以设置称为DDNS(动态域名系统)的内容。然后,您的路由器将连接到DDNS服务提供商,如 no-ip (www.noip.com),它将在互联网上显示。您可以提供自定义网址,例如susmit-home.noip.com

但是susmit-home.noip.com现在只指向您的WiFi路由器,而不是您的WiFi网络。因此,如果您要访问本地device_ipdevice_port,例如“192.168.1.75”,9050。那么您可以在路由器上为该本地IP端口组合设置端口转发。通常设置如下:

  • 本地IP:device_ip(例如192.168.1.75)
  • 本地端口:device_port(例如9050)
  • 出站端口:any_port(例如9050)

确保您的device_ip是WiFi路由器上的静态IP,以便它不会发生变化。

最后,在您的代码中,您只需将ip = ('192.168.1.75', 9050)替换为ip = ('susmit-home.noip.com', 9050)

其他解决方案:

  1. 稍微复杂的解决方案是设置VPN,这样您的本地网络和远程服务器(例如Heroku)将彼此可用,就好像它们位于同一本地网络中一样。
  2. 如果您的设备是计算机或Raspberry Pi,则可以使用SSH远程端口转发从远程服务器访问本地设备。