【问题标题】:Can't connect to local Machine IP through TCP From Arduino Uno using SIM900 Shield无法使用 SIM900 Shield 从 Arduino Uno 通过 TCP 连接到本地机器 IP
【发布时间】:2016-06-23 19:28:03
【问题描述】:

所以你对我使用的部件有一个基本的了解,我有:

这是我的问题: 我已经测试了与 GPRS shield 堆叠的 Arduino,它在通过 TCP 访问互联网、发送 SMS 等方面工作正常。但是,我的应用程序需要我将 GPS 数据从 adafruit GPS 发送到我的网络服务器已经用 Django 和 postgresql 编写过代码。后台设置好了。

我需要将数据从 Uno(客户端)发送到我用 python 编码的笔记本电脑(服务器)(这只是为了检查它是否正在创建连接):

#!/usr/bin/env python
import socket
# import postgres database functions 

TCP_IP = '192.168.1.112'
TCP_PORT = 10000
BUFFER_SIZE = 40

server_address = (TCP_IP,TCP_PORT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created.'

# Bind socket to TCP server and port
try:
    s.bind(server_address)
except socket.error as msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()
print 'Socket Bind Complete.'

# Start Listening on socket
s.listen(1)                                             # Puts socket into server mode
print 'Listening on port: ', TCP_PORT 

# Now Keep Talking with the client
while (1):
    # Wait to accept a connection
    conn, addr = s.accept()                                 # Wait for incoming connection with accept()
    print 'Connection address:', addr

    data = conn.recv(BUFFER_SIZE)

    if not data: break

    print "recieved data: data", data

    conn.send(data) #echo
conn.close()

我认为这没有问题。从这里我会将数据发布到我的 postgreSQL 数据库。但是,当我尝试在 SIM900 模块上使用 AT 指令通过 10000 端口连接到服务器时,我无法连接:

AT+CIPSHUT

SHUT OK
AT+CGATT?

+CGATT: 1

OK
AT+CIPMUX=0

OK
AT+CSTT="fast.t-mobile.com","",""

OK
AT+CIICR

OK
AT+CIFSR

6.60.94.49
AT+CIPSTART="TCP","192.168.1.112,"10000"

OK

STATE: TCP CLOSED

CONNECT FAIL

我已经尝试通过 TCP 连接,并用下面的语句替换了 AT+CIPSTART 行并且它有效,所以我知道 TCP 有效:

AT+CIPSTART="TCP","www.vishnusharma.com", "80"

我使用的 IP 是否错误?我对此很陌生,但如果它有所作为,我在我的 Mac OSX 上使用 Ubuntu 16.04 分区。我还检查了 T-mobile 的 APN,看起来还不错。

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python tcp arduino at-command gprs


    【解决方案1】:

    您使用的 IP 在 NAT 内,因为它以 192.168 开头。除非您与正在使用的移动运营商有私有 apn,否则您将无法从公共 IP 访问您的 Ubuntu。您的 ISP 为您提供了一个由您的路由器管理的公共 IP 地址,因此如果您希望它工作,您必须从您的路由器到您的 Ubuntu 执行port forwarding

    要进行端口转发,您必须进入路由器的配置页面(通常为 192.168.1.1,但取决于型号),然后您必须将端口 XXX 重定向到 192.168.1.112:10000。之后,您必须获取您的公共 IP (curl ifconfig.co) 并使用它从 SIM900 访问。

    【讨论】:

    • 谢谢你,这绝对是我需要的!
    • 对于任何寻求参考的人来说,我有两个问题:1) 我使用的 IP 在 NAT 内部,这意味着它使用的是我的路由器的 DHCP 提供的私有 IP。我必须使用端口转发连接到我的路由器公共 IP 地址,并使用我的路由器设置中指定的端口进行端口转发。 2)我必须通过使用命令摆脱防火墙阻止我的端口 - sudo ufw allow 10000/tcp。
    【解决方案2】:

    首先作为一个建议,您可以使用 SIM908 组合这两个盾牌(除非您的 GPS 盾牌越来越精确)。由于您的 TCP 连接正常,我敢打赌您的 ubuntu 上的端口 10000 被防火墙阻止了。您可以先尝试关闭防火墙,看看它是否有效。如果它没有工作它的其他东西。如果成功,请打开您的防火墙,然后使用以下命令解除对 tcp 端口的阻止:

    sudo ufw allow 10000/tcp
    

    【讨论】:

    • 感谢您的帖子,但禁用防火墙不起作用,还有其他想法吗?
    • 当您运行应用程序(python 代码)时,请尝试查看 tcp 端口是否处于活动状态并正在侦听。您可以使用以下命令执行此操作:netstat -nlp | grep 10000
    • 当我以管理员身份运行该命令时,我得到:tcp 0 0 192.168.1.112:10000 0.0.0.0:* LISTEN 5458/python。如果端口显示为 LISTEN,这是否意味着端口处于活动状态?
    • 是的,差不多就是这样,进程名称属于 python 脚本这一事实证实了该端口已由您的应用程序打开。抱歉,我暂时想不出其他解决方案!
    • 对于上面的命令,你如何反转它并重新阻塞端口?我在 ShieldsUP 上检查了我的端口,即使在关闭防火墙后,所有端口也显示为隐身。知道如何打开它们吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多