无法使用 SIM900 Shield 从 Arduino Uno 通过 TCP 连接到本地机器 IP
Can't connect to local Machine IP through TCP From Arduino Uno using SIM900 Shield
所以你对我使用的部件有了基本的了解,我有:
Arduino Uno
Seeed Studio GPRS Shield v2.0 (http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0)
Adafruit V3.3 的终极 GPS (https://www.adafruit.com/products/746?gclid=Cj0KEQjw3-W5BRCymr_7r7SFt8cBEiQAsLtM8qn4SCfVWIvAwW-x9Mu-FLeB6hLmVd0PAPVU8IAXXPgaAtaC8P8HAQ)
这是我的问题:
我已经测试了与 GPRS 屏蔽堆叠的 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()
我认为这没有问题。由此我将 post 数据存入我的 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,看起来不错。
如有任何帮助,我们将不胜感激。谢谢!
首先作为一个建议,您可以使用 SIM908 将两个盾牌组合起来(除非您的 GPS 盾牌的精度更高)。由于您的 TCP 连接正常,我敢打赌您 ubuntu 上的端口 10000 被防火墙阻止了。您可以先尝试关闭防火墙,看看是否有效。如果它不起作用,那就是别的东西。如果有效,打开您的防火墙,然后使用以下命令取消阻止 tcp 端口:
sudo ufw allow 10000/tcp
您使用的 IP 在从路由器到 Ubuntu 的 NAT since it starts with 192.168. Unless you have a private apn with the mobile operator you're using, you won't be able to reach your Ubuntu from a public IP. Your ISP gives you a public IP address which ir administrated by your router, so if you want this to work, you'll have to do a port forwarding 内。
要进行端口转发,您必须进入路由器的配置页面(通常为 192.168.1.1,但取决于型号),在那里您必须将端口 XXX 重定向到 192.168.1.112:10000。之后你必须获得你的 public IP (curl ifconfig.co
) 并使用它从 SIM900 访问。
所以你对我使用的部件有了基本的了解,我有:
Arduino Uno
Seeed Studio GPRS Shield v2.0 (http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0)
Adafruit V3.3 的终极 GPS (https://www.adafruit.com/products/746?gclid=Cj0KEQjw3-W5BRCymr_7r7SFt8cBEiQAsLtM8qn4SCfVWIvAwW-x9Mu-FLeB6hLmVd0PAPVU8IAXXPgaAtaC8P8HAQ)
这是我的问题: 我已经测试了与 GPRS 屏蔽堆叠的 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()
我认为这没有问题。由此我将 post 数据存入我的 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,看起来不错。
如有任何帮助,我们将不胜感激。谢谢!
首先作为一个建议,您可以使用 SIM908 将两个盾牌组合起来(除非您的 GPS 盾牌的精度更高)。由于您的 TCP 连接正常,我敢打赌您 ubuntu 上的端口 10000 被防火墙阻止了。您可以先尝试关闭防火墙,看看是否有效。如果它不起作用,那就是别的东西。如果有效,打开您的防火墙,然后使用以下命令取消阻止 tcp 端口:
sudo ufw allow 10000/tcp
您使用的 IP 在从路由器到 Ubuntu 的 NAT since it starts with 192.168. Unless you have a private apn with the mobile operator you're using, you won't be able to reach your Ubuntu from a public IP. Your ISP gives you a public IP address which ir administrated by your router, so if you want this to work, you'll have to do a port forwarding 内。
要进行端口转发,您必须进入路由器的配置页面(通常为 192.168.1.1,但取决于型号),在那里您必须将端口 XXX 重定向到 192.168.1.112:10000。之后你必须获得你的 public IP (curl ifconfig.co
) 并使用它从 SIM900 访问。