代码之家  ›  专栏  ›  技术社区  ›  Susmit Agrawal Sudip Bolakhe

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

  •  -1
  • Susmit Agrawal Sudip Bolakhe  · 技术社区  · 6 年前

    我有一个充当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')
    

    该脚本的功能是向连接到本地网络的设备发送一些数据。 当我打开web浏览器并在url栏上键入以下内容时,它可以完美地工作:

    http://localhost:8080/webhook
    

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

    注意:我知道我可以在本地计算机上运行脚本,并使用ngrok使其在internet上可见,但我希望即使在我的计算机关闭时也可以访问它。此外,想要一个固定的链接,ngrok提供的链接在每次跑步时都会发生变化。

    1 回复  |  直到 6 年前
        1
  •  1
  •   nitred    6 年前

    我以前在物联网方面也遇到过类似的问题。不幸的是,没有简单的方法可以使设备在线可见。这里有一个我使用过的简单解决方案。这可能不是最好的,但确实有效。

    DDNS+端口转发+静态IP

    如果您可以访问本地WiFi路由器,则可以设置DDNS(动态域名系统)。然后,您的路由器将连接到DDNS服务提供商,如 无ip (www.noip.com),并可在互联网上看到。您可以提供如下自定义URL susmit-home.noip.com .

    然而 susmit主页。没有。通用域名格式 现在将只指向您的WiFi路由器,而不是您的WiFi网络。所以如果你想访问本地 device_ip device_port 如“192.168.1.75”,9050。然后,您可以在路由器上为该本地IP端口组合设置端口转发。通常设置如下所示:

    • 本地IP: 设备\u ip (例如192.168.1.75)
    • 本地端口: device\u端口 (例如9050)
    • 出站端口: any_port (例如9050)

    确保您的 设备\u ip 是WiFi路由器上的静态IP,因此不会更改。

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

    其他解决方案:

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