首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将码头快速api与mqtt代理连接?

如何将码头快速api与mqtt代理连接?
EN

Stack Overflow用户
提问于 2022-02-21 04:58:40
回答 2查看 325关注 0票数 0

没有码头,我可以连接我的快速应用程序与mqtt经纪人。然而,与码头,我不能连接我的快速应用程序与码头mqtt经纪人。我明白错误-

代码语言:javascript
运行
复制
{"log":"    ', '.join(str(exc) for exc in exceptions)))\n","stream":"stderr","time":"2022-02-21T04:42:21.137558005Z"}
{"log":"OSError: Multiple exceptions: [Errno 111] Connect call failed ('127.0.0.1', 1883), [Errno 99] Cannot assign requested address\n","stream":"stderr","time":"2022-02-21T04:42:21.137562299Z"}
{"log":"\n","stream":"stderr","time":"2022-02-21T04:42:21.137566492Z"}
{"log":"ERROR:    Application startup failed. Exiting.\n","stream":"stderr","time":"2022-02-21T04:42:21.137570669Z"}

这是我的main.app

代码语言:javascript
运行
复制
from fastapi import FastAPI
from fastapi_mqtt import FastMQTT, MQTTConfig
from pydantic import BaseModel
from ipaddress import IPv4Address
import jsonpickle

app = FastAPI()


class Nmap(BaseModel):
    host: IPv4Address
    portRange: str

    class Config:
        schema_extra = {
            "example" : {
                "host": "10.0.2.15",
                 "portRange": "22-80",
                 "description": "Scan the port from 22 to 80 of the ip address 10.0.2.15"
            }
        }



mqtt_config = MQTTConfig()

mqtt = FastMQTT(config=mqtt_config)

mqtt.init_app(app)

@mqtt.on_connect()
def connect(client, flags, rc, properties):
    mqtt.client.subscribe("/mqtt/toModel/#") # subscribing mqtt topic wildcard- multi-level
    print("connected: ", client, flags, rc, properties)

@mqtt.on_message()
async def message(client, topic, payload, qos, properties):
    print("received message: ", topic, jsonpickle.decode(payload.decode()), qos, properties)
    return 0 


@mqtt.on_disconnect()
def disconnect(client, packet, exc=None):
    print("Disconnected")

@mqtt.on_subscribe()
def subscribe(client, mid, qos, properties):
    print("subscribed", client, mid, qos, properties)

@app.get("/")
async def func():
    mqtt.client.publish("/mqtt", "Hello from fastApi") 
    return {"result": True, "message": "Published"}

@app.post("/scan/{host}")
async def scan_host_port(nmap_details : Nmap):
    results = {"got_val" : nmap_details}
    print(type(nmap_details))
    mqtt.client.publish("/mqtt/fromModel/nmap", jsonpickle.encode(nmap_details)) 
    return results

这是我的应用程序停靠文件-

代码语言:javascript
运行
复制
FROM python:3.7

WORKDIR /code 


COPY ./requirements.txt /code/requirements.txt


RUN pip install -r /code/requirements.txt


COPY ./app /code/app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

对于MQTT,我用-

docker-compose.yml

代码语言:javascript
运行
复制
version: "3"
services:
 mqtt:
      image: toke/mosquitto
      network_mode: bridge
      container_name: mqtt
      expose:
        - 1883
      ports:
        - 1883:1883
      restart: unless-stopped

我确信这与我的停靠程序有关,但我不知道如何部署it.My,因为对接器是为运行单个进程而设计的。因此,一个进程用于代理,另一个用于简单地运行我的快速api,另一个进程用于nginx。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-21 07:01:12

127.0.0.1总是指向当前代码绑定到的TCP/IP堆栈。

每个Docker容器都有自己的TCP/IP堆栈。因此,如果您试图从python容器连接到127.0.0.1,那么在它自己的TCP/IP堆栈的端口1883上将不会有MQTT运行。

您应该让两个容器在同一个码头上使用同一个网络组成文件(如果需要,容器可以绑定到多个网络),然后可以用代理的三个服务名称替换IP地址,例如mqtt

票数 0
EN

Stack Overflow用户

发布于 2022-02-21 11:37:05

代码语言:javascript
运行
复制
version: '3.5'

services:
 mqtt:
      image: toke/mosquitto
      container_name: mqtt
      expose:
        - 1883
      ports:
        - 1883:1883
      restart: unless-stopped

      networks:
        - my_network

 fast:
     container_name: fast
     expose:
        - 8000
     networks:
       - my_network
    
     ports:
        - 8000:8000
     restart: unless-stopped
     build:
      context: .
      dockerfile: Dockerfile

     depends_on:
        - mqtt

networks:
  my_network:
    driver: bridge
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71201391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档