我有一个Arduino Uno和一个WiFi盾牌;项目目标是从传感器获取数据并将其发送到通过WiFi在PC上运行的Processing sketch。
从我的各种官方例子中获取大部分代码,我设法使用WiFi屏蔽成功连接到WiFi(WPA)网络(根据主板和托管网络的智能手机)。
然而,当我尝试从电路板发送/接收数据时,我总是收到错误,而我不知道它来自何处。
我怀疑错误来自我的代码,因为它几乎只是复制和粘贴,但以下是相关部分:
启动:
char ssid[] = "MiniStepper"; // Network name
char pass[] = "Test1234"; // Network code
int keyIndex = 0; // Network key
int statut = WL_IDLE_STATUS;
WiFiServer server(80);
设置:
void beginWiFi(){ // called in setup()
// Connection to the network (working, so omitted)
//...
server.begin();
}
回答请求:
void connexionRead(){ // called in loop()
WiFiClient client = server.available();
if(!client) return;
Serial.println("New connexion !"); // This never prints, so I'm sure the problem is earlier
// ...code sending back a HTML file with the HTTP protocol
}
我正在使用Chrome进行访问(我尝试使用Firefox但没有结果),使用WiFi.localIP()
给出的IP地址(托管网络的智能手机也提供相同的内容):
返回" ERR_CONNECTION_REFUSED"。
我是物联网的新手,我猜它可能是配置问题(防火墙......); 我的电脑正在运行Ubuntu 15.10(Willy Werewolf)(我尝试使用Windows 7 PC获得相同的结果), 网络由WPA加密,由XPeria U托管(我尝试过与其他智能手机托管的WPA网络相同的结果), 带有Uno板的arduino WiFi屏蔽(不到3个月前购买,所以我猜测它是最新版本)。
我对Arduino论坛的研究或者这里只有#"这样的结果在Arduino 1.0.5中不起作用,请回到Arduino 1.0.3",但当前版本是1.8.2 ,所以我不确定回去这么多会有所帮助。
我错过了什么吗?
EDIT。 这是ping:
/home/ubuntu>ping 192.168.43.200
PING 192.168.43.200 (192.168.43.200) 56(84) bytes of data.
64 bytes from 192.168.43.200: icmp_seq=1 ttl=255 time=9.54 ms
64 bytes from 192.168.43.200: icmp_seq=2 ttl=255 time=6.01 ms
64 bytes from 192.168.43.200: icmp_seq=3 ttl=255 time=6.15 ms
64 bytes from 192.168.43.200: icmp_seq=4 ttl=255 time=7.23 ms
64 bytes from 192.168.43.200: icmp_seq=5 ttl=255 time=7.03 ms
<and more>
--- 192.168.43.200 ping statistics ---
31 packets transmitted, 31 received, 0% packet loss, time 30048ms
rtt min/avg/max/mdev = 4.112/6.415/11.377/1.706 ms
答案 0 :(得分:0)
如果错误是ERR_CONNECTION_REFUSED,则很可能是因为您没有在Arduino中打开端口。因此,您应该检查应用程序是否实际正在侦听该端口,或者是否Arduino正在运行任何阻止连接的防火墙(我怀疑是这种情况)。
同样,这是假设Arduino是地址为192.168.43.200的那个。 要调试此问题,您可以使用Wireshark,在PC中运行它以嗅探流量到192.168.43.200。您应该看到传出的TCP消息到192.168.43.200:80,然后返回TCP RST消息。
答案 1 :(得分:0)
经过一些更多的研究,我了解到构造函数显然构建了具有过时固件的WiFi Shields。新的升级(2012年之前发布,这就是为什么我从未想过会出现这种情况)解决了这个问题。
// Use this line in the Arduino code :
Serial.println(WiFi.firmwareVersion());
// If it doesn't print 1.1.0, you're outdated.
例如,以下是在linux下升级WiFi屏蔽的步骤(如果有人需要它,这与official page大致相同):
首先,安装包dfu-programmer
:
sudo apt-get install dfu-programmer
(上面链接的官方页面中有拼写错误)或
sudo aptitude install dfu-programmer
现在断开你的WiFi防护罩与Arduino防护板(在我的情况下是Uno),然后连接J3跳线:picture of the J3 jumper, called 'DFU programming jumper' here。
使用迷你USB线(仍然没有主板)直接将WiFi防护罩连接到计算机,然后按“复位”按钮。
假设您的Arduino IDE下载时间早于2012年(否则请按照官方页面上的步骤下载文件),然后转到安装位置,然后harware/arduino/avr/firmwares/wifishield/scripts
,您会看到一个名为{{1}的脚本}。只需在此文件夹中打开一个终端:
ArduinoWifiShield_upgrade.sh
如果它不起作用,请重试几次,对我来说,它在第4或第5次之后有效。
工作时,拔下mini-USB线,拔下J3跳线。下次当您尝试将某些代码上传到WiFi防护罩时,IDE中可能会出现错误,如果您这样做,请按下防护罩上的“重置”按钮。
这些步骤解决了我的问题。