我刚刚从 Github 下载了最新的 Arduino 库代码,它破坏了我的 MQTT 客户端程序。我在 Arduino 上使用 PubSubClient 1.91,在 Mac OSX 上使用 Mosquitto 1.1.2 (Build 2013-03-07)。(我还在 Windows 7 上针对 Mosquitto 进行了测试,同样的问题。)
提供的 Mosquitto 客户端工作正常,(Mac 到 Windows,Windows 到 Mac)所以来自 Arduino 端的内容存在一些问题。Wireshark 跟踪显示 Arduino 客户端发送以下数据包:
10:15:ff:ff:4d:51:49:73:64:70:03:02:00:0f:00:07:41:72:64:75:69:6e:6f
Mosquitto 代理显示:来自 10.0.0.115 的新连接客户端上的套接字读取错误(空),断开连接。
在我开始浏览 MQTT 规范之前,任何人都可以看到正在发送的数据包有什么问题吗?这一定与新的 Arduino 库代码有关……
*更新经过进一步调查,这似乎是 avr-g++ 的代码生成问题,尽管生活经验告诉我事实并非如此。这是来自 PubSubClient.cpp 的代码片段
boolean PubSubClient::connect(char *id, char *user, char *pass, char* willTopic, uint8_t willQos, uint8_t willRetain, char* willMessage) {
if (!connected()) {
int result = 0;
if (domain != NULL) {
result = _client->connect(this->domain, this->port);
} else {
result = _client->connect(this->ip, this->port);
}
if (result) {
nextMsgId = 1;
uint8_t d[9] = { 0x00, 0x06, 'M','Q','I','s','d','p',MQTTPROTOCOLVERSION};
// d[0] = 0;
// d[1] = 6;
Serial.print("d[0]="); Serial.println(d[0],HEX);
现在,上面 Serial.print 的结果原来是 0xFF !!!因此, uint8_t 数组未正确初始化。@knoleary您指向坏FF字节的指针使我想到了这一点。
如果我现在取消上面两行的注释,并将前 2 个字节手动初始化为 0 和 6,一切正常,我的程序与 Mosquitto 愉快地通信。
我查看了生成的代码,但我不是 Atmel 专家。
有谁知道为什么会这样?
我在 Eclipse 中使用来自 Arduino 1.05 的 AVR-G++ 工具集进行编译。
我要去喝啤酒!