我刚刚从 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++ 工具集进行编译。
我要去喝啤酒了!