MQTT协议接入OneNET (二)

本文详细介绍如何使用eclipse.paho库在Android设备上通过MQTT协议接入OneNet物联网平台,包括连接设置、主题订阅与发布、数据上传及常见问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、Android设备使用MQTT协议接入OneNet平台

1. 用到的MQTT库:eclipse.paho

直接在app的gradle内dependencies添加依赖

compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'

compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

 

注意:使用eclipse.paho一定记得要在AndroidManifest.xml中添加服务

<serviceandroid:name="org.eclipse.paho.android.service.MqttService"/>

否则没有办法正常使用

 

2. 连接上OneNet的服务器

需要设置

clientId为deviceId,即创建设备时的设备号

userName为productId,即创建产品的产品号

password为APIkey或者authInfo(即自己设置鉴权信息字符串)

因为APIkey太长不好记忆,所以我选择鉴权

 

1) 首先配置连接设置

MqttConnectOptions option = newMqttConnectOptions();

option.setUserName(productId);

option.setPassword(authInfo.toCharArray());

option.setCleanSession(false);

 

2) 调用mqttclient的连接方法

MqttAndroidClient mqttClient = newMqttAndroidClient(mContext, ("tcp://" + serverIP + ":" +serverPort), deviceId);

mqttClient.connet(option);

//OneNet的ip为183.230.40.39

//mqtt端口为6002

 

这样基本上就连接上OneNet的服务器了,ConnAck包这些是paho库帮我们完成的接收确认,我们只需要调用连接的这个函数即可,非常方便。

 

ps.当初看开发文档的时候一开始没有看到设置用户名这些,因为照着接入流程做,看到了服务器的ip和端口就直接跑去连接了,发现一直连接不上。直到再次看了一遍开发文档,拖到文档下面的常见问题才发现还需要设置这些。感觉这些重要的设置内容应该写在前面比较好,第一次没注意看,很尴尬。

 

3.发布及订阅自己的topic

这个很简单,之前用自己的服务器也是这样做的,

1) 订阅:

mqttClient.subscribe("topic",0); //参数一为topic字符串, 参数二为QoS级别

 

2) 发布:

MqttMessage msg = new MqttMessage();

msg.setPayload(payload.getBytes());  //发布内容

msg.setQos(1);                                 //设置发布级别

mqttClient.publish(topic, msg);          //发布

 

我们的项目是以topic来区别设备的

譬如,Android应用就订阅一个topic为Android/id,id为编号

底层设备就订阅一个topic为Device/id

然后发送指令直接向对应的topic发送就行

 

4.使用mqtt上传数据点/获取数据

OneNet为每一个产品提供了数据流,在平台上记录并且可以生成数据的曲线,要想让我们通过mqtt协议上传的数据能够保存在数据流上,就得向$dp这个topic发送一串规定格式的数据。

试了几次向$dp这个topic发送数据,在设备数据界面看都没有成功更新到数据,最让人疑惑的是,一旦发送了数据,设备就会掉线,需要重连。不太清楚OneNet平台是不是有什么发布数据就让你强制下线的机制。并且因为平台不允许订阅$打头的数据。

起初我以为是OneNet服务器的问题,不过其他的topic还是可以正常的使用,并且换用平台提供的官方客户端,又可以成功发送且对数据进行更新。

 

(使用OneNet提供的mqtt测试程序上传数据点,同时可以看到平台上显示设备的数据更新了)

于是我在想是不是发送的格式还是不正确,就发现了这个

决定还是通过wireshark软件对OneNet平台提供的客户端进行抓包,看看他究竟发送的是什么。

 

 

可以看到确实是向$dp这个topic发送了消息,7b是”{”转为16进制,那么前面的01 00 5e就是协议文档里面提到的发送类型、长度高位、长度低位了。

 

 

附上我之前的代码:

 

 

这样问题就显而易见了。

协议中的格式讲的是发送16进制的01 00 length,而通过之前编写的这段代码发送出去的是字符串”01 00 length”

 

故赶紧修改代码为:

 

 

这样就能成功地将数据库上传到OneNet平台了。

 

 

 

### MQTT协议接入ONENET平台的方法 #### 创建产品并获取必要参数 为了使设备能够成功连接到ONENET云平台,首先需要在平台上创建对应的产品。进入ONENET官方网站登录账号后,在控制台内新建一个产品实例[^1]。 对于每一个新建立的产品而言,都会分配唯一的Product Key以及Device Secret等信息用于鉴权认证过程中的身份验证环节。这些密钥将在后续配置阶段被广泛运用以确保安全可靠的通讯链路构建完成。 #### 设备端编程实现MQTT连接 针对不同硬件架构下的MCU模块比如ESP8266系列微控制器或是基于ARM Cortex-M3核心设计而成的STM32单片机来说,均可以采用标准版或轻量级版本的MQTT库来编写应用程序逻辑代码片段从而达成联网目的[^2]。 以下是利用Python语言编写的简单示例程序,展示了怎样借助`paho-mqtt`这个第三方扩展包快速搭建起与目标服务器之间的双向交互通道: ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") client = mqtt.Client() client.on_connect = on_connect # 替换成自己的三元组信息 product_key = "your_product_key" device_name = "your_device_name" device_secret = "your_device_secret" auth_info = f"{product_key},{device_name},{device_secret}" username = "" password = auth_info server_url = "mqtt.heclouds.com" port_num = 6002 client.username_pw_set(username=username,password=password) client.connect(server_url,port=port_num) try: client.loop_forever() except KeyboardInterrupt: pass finally: client.disconnect() ``` 上述脚本实现了基本的功能框架结构,实际项目开发过程中还需要进一步完善错误处理机制、消息订阅发布等功能特性,并参照具体应用场景调整优化性能表现指标等方面的内容。 #### 数据上报及命令接收流程解析 当建立起稳定有效的网络链接之后就可以着手准备向云端发送传感器采集得到的各种实时监测数值了;与此同时也可以监听来自远端管理后台下发的操作指令以便及时响应执行相应动作任务。整个业务流转过程涉及到的主题(Topic)命名规则遵循官方文档给出的标准格式定义。 例如要上传温度计读数至指定Topic路径下,则可按照如下方式编码操作: ```python topic_pub = "/%s/%s/data"%(product_key, device_name) payload = {"temperature": current_temperature} client.publish(topic_pub,json.dumps(payload)) ``` 而如果想要接收特定主题的消息通知则应该提前注册回调函数等待触发事件发生时调用该方法进行下一步骤的数据解析工作。 ```python def on_message(client,userdata,msg): payload_str=msg.payload.decode('utf-8') json_obj=json.loads(payload_str) handle_command(json_obj["command"]) client.subscribe("/%s/%s/commands"%(product_key, device_name)) client.on_message=on_message ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值