7/4继续mqtt

本文介绍了MQTT协议的基本概念及其实现方式,包括Broker和Client的角色定义,以及如何通过paho库在Android环境中实现简单的MQTT通信。还讨论了不同服务质量级别(QoS)的区别,以及如何使用JavaScript版本的MQTT接口进行web应用开发。

基于paho在android平台上实现MQTT Client间的简单通信

https://blog.youkuaiyun.com/daihuimaozideren/article/details/78118793

个人理解:

1、分为broker和client,broker是服务器相当于中转站,client1、2、3任何一个将消息推送到broker上,其他所有订阅了该topic的client都会收到推送。

2、thingsboard平台的服务器端有一个broker,broker可以使用mosquito,Apollo。。。,设备将数据推送到该主题:

v1/devices/me/telemetry

服务器端订阅该主题,就会实时把数据显示出来,就是说。。。做客户端的web应用时候,展现实时数据也可以用mqtt?,mqtt有JavaScript版的接口和包。

3、我的转发服务器,假设都采用mqtt收发data。

发数据:向TB的broker发送主题消息

MqttMessage msg=new MqttMessage();
String msgStr="Hello World";
msg.setPayload(msgStr.getBytes());//设置消息内容
msg.setQos(2);//设置消息发送质量,可为0,1,2.
msg.setRetained(false);//服务器是否保存最后一条消息,若保存,client再次上线时,将再次受到上次发送的最后一条消息。
mClient.publish("my topic",msg);//设置消息的topic,并发送。

这里需要对发送质量进行再次说明。 
(0)level0,最多一次的传输。不管消息是否到达broker,只要发出,client不再关心。 
(1)level1,至少一次的传输。若消息到达broker,broker会回复client一个PUBACK消息,若未收到该回复消息,或超时,client将再次发送,直至收到broker响应。 
(2)level2,这是最高级别的传输。在level1的基础上,保证重复消息不会被二次接收。

断开与broker的连接:

try {
    if(mClient!=null){
        mClient.disconnect();
    }
} catch (MqttException e) {
    e.printStackTrace();
}

接收推送:订阅broker的某个主题


subscribe订阅不成功的原因:

Topic只能写不包含通配符的,但是订阅时传进去的参数topicFilter需要包含通配符

https://blog.youkuaiyun.com/putiancaijunyu/article/details/78549834




ronglimin@ubuntu:~/code_work/mbedtls_test/CAMEOS$ git status On branch H600W_testing Your branch is ahead of 'origin/H600W_testing' by 7 commits. (use "git push" to publish your local commits) Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: platform/iplatform/private/libtpsocket/src/tpsocket_parser.c modified: platform/iplatform/private/libtpsocket/src/tpsocket_ssl.h Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: platform/iplatform/private/tddp-mmt/src/tddp_mmt.c modified: platform/iplatform/private/wlan-atbm-hub/Makefile modified: product_configs/H600W/iplatform.config Untracked files: (use "git add <file>..." to include in what will be committed) platform/dl/mbedtls-2.16.6-gpl.tgz product_configs/H600W/H600W.md "product_configs/H600W/H600W_\347\274\226\350\257\221.md" sdk/wlan/ 我之前commit、push过一次,评审没入库,现在重新修改了 tpsocket_parser.c、tpsocket_ssl.h,想要commit --amend提交,但是输入这个amend命令以后出现qMerge branch 'H600W_testing' of ssh://gerrit-ce.tp-link.com:29418/IPC/CAMEOS into H600W_testing Change-Id: I5801eafe1f65f3cd526c794e88c306810f36067d # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Wed Nov 26 01:24:07 2025 -0800 # # On branch H600W_testing # Your branch is ahead of 'origin/H600W_testing' by 7 commits. # (use "git push" to publish your local commits) # # Changes to be committed: # modified: platform/iplatform/private/libtpsocket/src/tpsocket_parser.c # modified: platform/iplatform/private/libtpsocket/src/tpsocket_ssl.h # modified: platform/iplatform/private/mqtt-cloud/Makefile # modified: platform/iplatform/private/mqtt-cloud/src/mqtt_child_device.c # modified: platform/iplatform/private/mqtt-cloud/src/mqtt_cloud.c # modified: platform/iplatform/private/mqtt-cloud/src/mqtt_cloud.h # modified: platform/iplatform/private/mqtt-cloud/src/mqtt_ubus.c # # Changes not staged for commit: # modified: platform/iplatform/private/tddp-mmt/src/tddp_mmt.c # modified: platform/iplatform/private/wlan-atbm-hub/Makefile # modified: product_configs/H600W/iplatform.config # # Untracked files: # platform/dl/mbedtls-2.16.6-gpl.tgz # product_configs/H600W/H600W.md # "product_configs/H600W/H600W_\347\274\226\350\257\221.md" # sdk/wlan/ # ,为什么?
最新发布
11-29
char Aliyun_Iot(char *redata, char *return_buff) { char qos, dup, retain; int id; static char state = 0; // 当前状态 static int count; // 计数器 count++; // 每次调用Aliyun_Iot函数,count加1 printf("\n[Aliyun_Iot]计数器 %d \n", count); switch (state) { case 0: printf("\n[Aliyun_Iot]正在连接 WIFI \n"); wifi_state = 0; if (0 == WIFI_Connect()) { TIM4_Init(10 - 1, 7200 - 1); // 启动定时重传队列,支持QoS2等级 wifi_state = 1; // WiFi连接成功,将切换到环形队列接收服务器数据 count = 0; state = 1; Aliyun_Init(); // 初始化阿里云连接参数 printf("\n[Aliyun_Iot]WIFI 连接成功,发送 MQTT 连接报文\n"); } else wifi_state = 0; break; case 1: if (0 == MQTT_Connect(clientid, WILL_TOPIC, WILL_MESSAGE, username, password, USER_NAME_FLAG, PASS_WORD_FLAG, WILL_RETAIN, WILL_QOS, WILL_FLAG, CLEAN_SESSION, KEEP_ALIVE)) { state = STATE_MQTT_CONNACK; printf("\n[Aliyun_Iot]发送连接报文 \n"); } break; case 2: printf("\n[Aliyun_Iot]等待连接响应 \n"); if (count == CONNECT_TIME_OUT) { state = STATE_MQTT_CONNECT; // 只重试MQTT连接 } else if (count == WIFI_TIME_OUT) { count = 0; state = STATE_WIFI_CONNECT; // 彻底重连 } if (1 == MQTT_ConnAck(redata)) { state = STATE_MQTT_SUBSCRIBE; count = 0; printf("\n[Aliyun_Iot]连接成功 \n"); } break; case 3: if (0 == MQTT_Subscribe(SET_TOPIC, SUBSCRIBE_ID, 0, 1)) { count = 0; state = STATE_MQTT_SUBACK; // 转到消息接收状态 printf("\n[Aliyun_Iot]发送订阅报文 \n"); } break; case 4: // 等待订阅确认 printf("\n[Aliyun_Iot]等待订阅确认 \n"); if (count == SUBSCRIBE_TIME_OUT) { state = STATE_MQTT_CONNECT; // 只重试MQTT连接 } else if (count == WIFI_TIME_OUT) { count = 0; state = STATE_WIFI_CONNECT; // 彻底重连 } if (1 == MQTT_SubAck(redata)) { state = STATE_RECEIVE_MSG; // 转到消息接收状态 } break; // case 5: // 消息接收与处理 // switch (redata[0] >> 4) // { // case 3: // 接收PUBLISH消息 // if (MQTT_ReceivelPublish(&dup, &qos, &retain, &id, redata, return_buff, RETURN_BUFF_SIZE) == 0) // { // printf("\n* 解析 0x%02x 报文: dup = %d, qos = %d, retain = %d, id = %02X *\n", redata[0], dup, qos, retain, id); //// Iot_Control(return_buff); // 调用 Iot_Control 控制硬件 // if (qos == 1) // { // MQTT_SendPubAck(id); // QoS1需要回复PubAck // } // else if (qos == 2) // { // MQTT_SendPubRec(id); // QoS2需要回复PubRec // } // // 收到消息时重置保活计数器并禁用保活发送 // count = 0; // 重置计数器 // EnPingreq = 0; // 禁用本次保活 // } // break; // case 4: // 接收PUBACK消息 // id = MQTT_ReceivePubAck(redata); // if (id != 0) // { // remove_from_retry_list(id); // 移除重传链表中的QoS1报文 // count = 0; // 重置计数器 // EnPingreq = 0; // 禁用本次保活 // } // break; // case 5: // 接收PUBREC消息 // id = MQTT_ReceivePubRec(redata); // if (id != 0) // { // remove_from_retry_list(id); // 移除重传链表中的QoS2报文 // MQTT_SendPubRel(id); // 回复PUBREL // count = 0; // 重置计数器 // EnPingreq = 0; // 禁用本次保活 // } // break; // case 6: // 接收PUBREL消息 // id = MQTT_ReceivePubRel(redata); // if (id != 0) // { // MQTT_SendPubComp(id); // 回复PUBCOMP // count = 0; // 重置计数器 // EnPingreq = 0; // 禁用本次保活 // } // break; // case 7: // 接收PUBCOMP消息 // id = MQTT_ReceivePubComp(redata); // if (id != 0) // { // remove_from_retry_list(id); // 移除重传链表中的PUBREL报文 // count = 0; // 重置计数器 // EnPingreq = 0; // 禁用本次保活 // } // break; // case 11: // 接收UNSUBACK消息 // if (MQTT_UnSubAck(redata, SUBSCRIBE_ID) == 1) // { // state = STATE_KEEP_ALIVE; // 转到保活状态 // } // else // { // MQTT_Subscribe(SET_TOPIC, SUBSCRIBE_ID, 0, 0); // 重新尝试取消订阅 // count = 0; // 重置计数器 // EnPingreq = 0; // 禁用本次保活 // } // break; // case 13: // 接收PINGRESP消息 // if (MQTT_PingResp(redata) == 1) // { // printf("\n心跳响应已接收。正在重置保活计数器。\n"); // count = 0; // 收到响应重置计数器 // EnPingreq = 1; // 允许下次发送PINGREQ // } // break; // case 14: // 断开连接 // break; // default: // break; // } // break; // case STATE_KEEP_ALIVE: // 保活状态 // if(KEEP_ALIVE == count && 1 == EnPingreq) // { // MQTT_PingREQ(); // } // break; default: break; } return 0; } 在 case 2: printf("\n[Aliyun_Iot]等待连接响应 \n"); if (count == CONNECT_TIME_OUT) { state = STATE_MQTT_CONNECT; // 只重试MQTT连接 } else if (count == WIFI_TIME_OUT) { count = 0; state = STATE_WIFI_CONNECT; // 彻底重连 } if (1 == MQTT_ConnAck(redata)) { state = STATE_MQTT_SUBSCRIBE; count = 0; printf("\n[Aliyun_Iot]连接成功 \n"); } break; 阶段,没有数据会退出函数让给其他函数执行吗
07-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值