cjsonmqtt的简单介绍

本文目录一览:

如何用ESP8266的JSON函数解析JSON数据

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全

独立于语言的文本格式,但是也使用了类似于C语言家族的**惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)

。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速

率)。

JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。

数据在键值对中

数据由逗号分隔

花括号保存对象

方括号保存数组

JSON 名称/值对

JSON 数据的书写格式是:名称/值对。

名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:

“firstName”:”John”

这很容易理解,等价于这条 JavaScript 语句:

firstName=”John”

JSON 值

JSON 值可以是:

数字(整数或浮点数)

字符串(在双引号中)

逻辑值(true 或 false)

数组(在方括号中)

对象(在花括号中)

null

JSON实战应用篇

由于项目需要,产品一直使用的ESP8266,为了更好的适应实时性控制项目的需求,重新设计了服务器的架构,使用了基

于消息订阅和**的MQTT架构,为了满足服务器同事更好的解析数据的需求,我很无奈的选择了使用JSON数据格式和服务

器交互(其实我还是很喜欢01的,可惜搞**机的更喜欢直接调用现成的API),所以我的WIFI必须支撑JSON,幸好WIFI集

成了JSON API,可惜文档特别不好理解,搞了很久才明白如何构建一个JSON树(我都打算直接在MCU里面用CJSON来实现了

),要构建的JSON树也挺简单的“device_info”:{ “sbtm”:”****0882****34″, “k”:”0001″, “v”:”0″ } sbtm是ID

属性名,K功能码属性名,v命令熟悉值(冒号后面的属性值)。具体代码如下:

/******************************************************************************

* FunctionName : device_get

* Description : set up the device information parmer as a JSON format

* Parameters : js_ctx — A pointer to a JSON set up

* Returns : result

*******************************************************************************/

LOCAL int ICACHE_FLASH_ATTR

device_get(struct jsontree_context *js_ctx)

{

const char *path = jsontree_path_name(js_ctx, js_ctx-depth – 1);

if (os_strncmp(path, “sbtm”, 4) == 0)

{

jsontree_write_string(js_ctx, “****0882****34”);

}

else if (os_strncmp(path, “k”,1) == 0)

{

jsontree_write_string(js_ctx, “0x0002”);

}

else if (os_strncmp(path, “v”,1) == 0)

{

jsontree_write_string(js_ctx,” 0″);

}

return 0;

}

LOCAL struct jsontree_callback device_callback =

JSONTREE_CALLBACK(device_get, NULL);

JSONTREE_OBJECT(device_tree,JSONTREE_PAIR(“sbtm”,device_callback),JSONTREE_PAIR

(“k”,device_callback),JSONTREE_PAIR(“v”,device_callback));

JSONTREE_OBJECT(deviceinfo_tree,JSONTREE_PAIR(“device_info”,device_tree));

其中宏定义JSONTREE_OBJECT是生成一个JSON数的对象,第一个参数是该对象的名称(device_tree),JSONTREE_PAIR是生

成一个键值对的宏。

JSONTREE_CALLBACL是生成一个回调指针的宏,该宏有两个参数,第一个参数是设置读取JSON树的值的函数,这里为

device_get函数,第二个参数是设置写入JSON树的值的函数,这里没有用到,为NULL。

device_get是读取JSON树的值的函数。其中用os_strncnp进行JSON属性名的判断,这里示例是:如果属性名为”sbtm”,则

获取的值为”****0882****34″。通过json_ws_send((struct jsontree_value *)deviceinfo_tree, “device_info”,

buf); 函数可以获得JSON树的内容,最后通过MQTT_Publish(mqttClient, “test/json”,buf ,os_strlen(buf), 0,0);将

JSON发送到MQTT测试服务器上面

接下来就是如何解析服务器下发的JSON树(对于JSON树如何解析,8266都没资料介绍,把百度谷歌找了一遍也没找到,最后还是自己搞定了,希望后来者少走些弯路)

首先需要初始化一颗JSON树并将你需要解析的JSON的JSON对象deviceinfo_tree填入到jsontree_setup第二个参数,最后调

用device_parse解析就行。

struct jsontree_context js;

jsontree_setup(js, (struct jsontree_value *)deviceinfo_tree, json_putchar);

json_parse(js, buffer);

LOCAL struct jsontree_callback device_callback =

JSONTREE_CALLBACK(device_get,device_parse);

/******************************************************************************

* FunctionName : device_parse

* Description : parse the device status parmer as a JSON format

* Parameters : js_ctx — A pointer to a JSON set up

* parser — A pointer to a JSON parser state

* Returns : result

*******************************************************************************/

LOCAL int ICACHE_FLASH_ATTR

device_parse(struct jsontree_context *js_ctx, struct jsonparse_state *parser)

{

int type;

uint8_t status,cmd;

while ((type = jsonparse_next(parser)) != 0)

{

if (type == JSON_TYPE_PAIR_NAME)

{

if (jsonparse_strcmp_value(parser, “k”) == 0)

{

jsonparse_next(parser);

jsonparse_next(parser);

cmd = jsonparse_get_value_as_int(parser);

os_printf(“cmd=%d”,cmd);

}

else if(jsonparse_strcmp_value(parser, “v”) == 0)

{

uint8 status;

jsonparse_next(parser);

jsonparse_next(parser);

status = jsonparse_get_value_as_int(parser);

os_printf(“status=%d”,status);

}

if(cmd== RO_STATE_CMD)

{

}

else if(cmd== POWR_CMD)

{

if(status==0x01)

{

os_printf(“power off”);

}

else

{

os_printf(“power on”);

}

}

else if(cmd== FILTER_CMD)

{

if(status==0x01)

{

os_printf(“filter on”);

}

else

{

os_printf(“filter off”);

}

}

}

}

return 0;

}

服务器下发的JSON命令解析成功~·`~~~~

android中mqtt怎么做

MQTT连接建立的代码(SSL方式)

[java] view plain copy

public static void connect(Driver driver) {

ServerConfig serverConfig = UserModule.Instance.getServerConfig();

MqttConnectOptions conOpt = new MqttConnectOptions();

try {

SSLContext sslContext;

KeyStore ts = KeyStore.getInstance(“BKS”);

ts.load(context.getResources().openRawResource(R.raw.test_cert),

“123456”.toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance(“X509”);

tmf.init(ts);

TrustManager[] tm = tmf.getTrustManagers();

sslContext = SSLContext.getInstance(“TLS”);

sslContext.init(null, tm, null);

SocketFactory factory = sslContext.getSocketFactory();

conOpt.setSocketFactory(factory);

} catch (Exception e) {

e.printStackTrace();

}

span style=”white-space:pre” /span

[java] view plain copy

span style=”white-space:pre” /span//paho库得

IteratorMap.EntryString, Connection it = Connections

.getInstance(context).getConnections().entrySet().iterator();

while (it.hasNext()) {

MqttClientAndroidService detectClient = it.next().getValue()

.getClient();

try {

detectClient.disconnect();

} catch (MqttException e) {

e.printStackTrace();

}

it.remove();

}

// The basic client information

MqttClientAndroidService client;

client = Connections.getInstance(context).createClient(context,

serverConfig.getUri(), serverConfig.clientId);

Integer qos = Integer.parseInt(context.getResources().getString(

R.string.qos));

Boolean retained = Boolean.parseBoolean(context.getResources()

.getString(R.string.retained));

// connection options

int timeout = Integer.parseInt(context.getResources().getString(

(R.string.timeout)));

int keepalive = Integer.parseInt(context.getResources().getString(

R.string.keepalive));

Connection connection = new Connection(serverConfig.getClientHandle(),

serverConfig.clientId, serverConfig.server,

Integer.parseInt(serverConfig.port), context, client,

serverConfig.ssl);

// connection.registerChangeListener(changeListener);

// connect client

String[] actionArgs = new String[1];

actionArgs[0] = serverConfig.clientId;

connection.changeConnectionStatus(ConnectionStatus.CONNECTING);

boolean cleanSession = false;

conOpt.setCleanSession(cleanSession);

conOpt.setConnectionTimeout(timeout);

conOpt.setKeepAliveInterval(keepalive);

if (!TextUtils.isEmpty(serverConfig.user)) {

conOpt.setUserName(serverConfig.user);

}

if (!TextUtils.isEmpty(serverConfig.pwd)) {

conOpt.setPassword(serverConfig.pwd.toCharArray());

}

// conOpt.setPassword(“1111”.toCharArray());

final ActionListener callback = new ActionListener(context,

ActionListener.Action.CONNECT, driver.getMqttUtilsCallback(),

serverConfig.getClientHandle(), actionArgs);

boolean doConnect = true;

String message = ActivityConstants.message;

String topic = ActivityConstants.topic;

if ((!TextUtils.isEmpty(message) || !TextUtils.isEmpty(topic))) {

// need to make a message since last will is set

try {

conOpt.setWill(topic, message.getBytes(), qos.intValue(),

retained.booleanValue());

} catch (Exception e) {

e.printStackTrace();

doConnect = false;

callback.onFailure(null, e);

}

}

client.setCallback(new MqttCallbackHandler(context, serverConfig

.getClientHandle(), driver));

connection.addConnectionOptions(conOpt);

Connections.getInstance(context).addConnection(connection);

if (doConnect) {

try {

client.connect(conOpt, null, callback);

} catch (MqttException e) {

Log.e(TAG, “MqttException Occured”, e);

}

}

}

发布(publish)代码

[java] view plain copy

public static void publish(String clientHandle, String topic,

JSONObject jsonObj, int qos) {

MqttClientAndroidService client = Connections.getInstance(context)

.getConnection(clientHandle).getClient();

if (!isConnected(context)) {

try {

client.connect();

} catch (MqttException e) {

e.printStackTrace();

}

Toast.makeText(context, “please try again”, Toast.LENGTH_SHORT)

.show();

return;

}

if (topic == null) {

Toast.makeText(context, “can not get other’s identity for now”,

Toast.LENGTH_SHORT).show();

return;

}

String[] args = new String[2];

if (jsonObj.optLong(“time”) != 0) {

args[0] = String.valueOf(jsonObj.optLong(“time”));

args[1] = topic;

}

Boolean retained = Boolean.parseBoolean(context.getResources()

.getString(R.string.retained));

try {

client.publish(topic, jsonObj.toString().getBytes(), qos, retained,

null, new ActionListener(context, Action.PUBLISH, null,

clientHandle, args));

} catch (MqttSecurityException e) {

Log.e(TAG,

“Failed to publish a messged from the client with the handle ”

+ clientHandle, e);

} catch (MqttException e) {

Log.e(TAG,

“Failed to publish a messged from the client with the handle ”

+ clientHandle, e);

}

}

订阅(subscribe)代码

[java] view plain copy

public static void subscribe(MqttUtilsCallback mqttUtilsCallback,

String clientHandle, String topic) {

MqttClientAndroidService client = Connections.getInstance(context)

.getConnection(clientHandle).getClient();

if (client == null || (client != null !client.isConnected())) {

Toast.makeText(context, “please connect to server first”,

Toast.LENGTH_SHORT).show();

return;

}

if (TextUtils.isEmpty(topic)) {

topic = “hello”;

}

String[] topics = new String[1];

topics[0] = topic;

try {

client.subscribe(topic, 1, null, new ActionListener(context,

ActionListener.Action.SUBSCRIBE, mqttUtilsCallback,

clientHandle, topics));

} catch (MqttSecurityException e) {

Log.e(TAG, “Failed to subscribe to” + topic

+ ” the client with the handle ” + clientHandle, e);

} catch (MqttException e) {

Log.e(TAG, “Failed to subscribe to” + topic

+ ” the client with the handle ” + clientHandle, e);

}

阿里云物联网平台 – 物模型

物模型是云平台为物联网产品定义的数据模型,用于描述产品的功能。将产品抽象成数据的集合,方便云端进行控制。

物模型从 属性 、 服务 和 事件 三个维度,分别描述了该实体是什么、能做什么、可以对外提供哪些信息。定义了物模型的这三个维度,即完成了产品功能的定义。

TSL 格式是一个 JSON 格式的文件,完整的 TSL 格式可以参考: 阿里云物模型 。

嵌入式端开发固件往往只需要关注少数几个参数,可以在产品的 功能定义 页面,单击 物模型TSL , 精简物模型 里面查看。

需要关注的有 “properties”,”events”,”services”,在 JSON 格式里,这三者都是数组,分别存储了该物模型的数据,事件和服务,在 C-SDK 里也就分别是 IOT_Linkkit_Report() 上报属性, IOT_Linkkit_TriggerEvent() 触发事件和注册为 ITE_SERVICE_REQUEST 的回调函数。

在上报属性时,只需要关注 “identifier” 名称对应的值(字符串),此时表示该属性在产品下的唯一标识。例如一个精简物模型属性为:

则上报的数据只需要为 {“count”:10} 即可,需满足 JSON 字符串的格式,字符串内有一个名称/值对,名称为 “count”(物模型里 “identifier” 的值),值对为 10(满足物模型里数据类型为 int 的要求)。

触发事件需要关注 “identifier” 名称对应的值(字符串),表示该事件在产品下的唯一标识;还需要关注 “outputData”,表示上报事件的输出值。一个精简物模型例子如下:

“outputData” 数组的使用与属性上报一致,这里就不介绍了。

服务调用需要同时关注 “identifier”,”inputData” 和 “outputData” 这三个名称,分别表示该服务在产品下的唯一标识,服务的输入参数,服务的输出参数。与函数调用有输入值和输出值类似,服务调用也有这些特征。

物模型数据校验方式目前有两种, 弱校验 和 免校验 。

也就是说,弱校验针对产品设备的上报数据,只要 idetifier 是一致的,且 dataType 字段满足要求,就接收该数据,并且在其他云端产品流转。

为什么云端可以设置和获取接入设备的属性呢?为什么接入设备可以上报事件给云端呢?又为什么云端可以调用接入设备提供的服务呢?这就是这一小节解释的内容。

物模型基于 MQTT 协议,MQTT 协议的介绍不在此处展开。

云端定义了一系列的 Topic,在设备接入云端时,C-SDK 向 MQTT broker 订阅了一些的 Topic,而云端需要与设备交互时,就向 MQTT broker 发布相应的 Topic,这样就完成了交互过程。同理,云端也会订阅一些 Topic,设备可以向这些 Topic 发布消息。

接入设备端订阅发布的 Topic 列表如下:

其中 ${productKey} 会替换为实际的产品名,${deviceName} 会替换为实际的设备名,${tsl.event.identifier} 是事件的标识符,${tsl.service.identifier} 是服务的标识符,最大限度地保证了 Topic 的唯一性。

这些 Topic 的作用在后面用时序来描述。

一键转换订阅免流参数

普通订阅转免流订阅 原理 将原来的订阅解析后添加免流host 使用方法 服务器域名/订阅链接免流host转换后服务器前缀 我这里已经在服务器上搭建好了 jttp://jklist.ml:888 白嫖党专属链接 解释 jklist.ml:888/ 为服务器域名 为订阅链接 m.iqiyi.com为免流host iqiyi 为转换后手机上显示的服务器名称前缀可为空则不修(如软件支持中文可使用中文) 更新记录 20210222 更新 鉴于有些订阅里面包含有一个符号 导致不可用 现更改为两个符号来进行分割 20210304 更新 端口筛选+后端http多线程处理 从订阅池或者机场的订阅里面筛选 、 多线程避免因某订阅链接响应过慢导致整个程序等待超时响应 白嫖链接 ws+443较多 适合电信不限端口 订阅池 什么都有 订阅池

你可能感兴趣的资源

newsletter_sub_svc:通讯订阅服务

项目:CN通讯订阅服务 2014-05-20 英里 Poindexter … 服务网址: 服务将接受 XML 或 JSON 格式的请求。… 如果您的 Content-Type 标头是 json,则响应将采用 JSON。… 订阅/取消订阅服务: URL: 获取新订阅的 xml

subconverter-vercel:在vercel上部署订阅转换

subconverter-vercel 本项目核心是tindy2013的。 本项目只是提供一个自动、免费、无需额外设备的脚本运行方式。 项目说明 利用github action实现每隔7天或在修改项目时获取最新版本的subconverter,并在vercel上进行部署。 需要设置personal access tokens(名称为GITHUB_TOKEN 需要设置 repo、 admin:repo_hook、 workflow)

w3_MRI_clean_sub_list:为主题列表清洗w3 MRI完整列表以进行预处理

w3_MRI_clean_sub_list:为主题列表清洗w3 MRI完整列表以进行预处理

qtcreator_sub_dir_example:具有多个子目录的QT Creator项目的示例项目

qtcreator_sub_dir_example:具有多个子目录的QT Creator项目的示例项目

…机器人,它将通过简单HTTP调用发送的推送消息转换为您可以订阅…

TeleTelegram机器人,它将通过简单HTTP调用发送的推送消息转换为您可以订阅的Telegram消息。-Golang开发 我将简单的JSONHTTP请求转换为Telegram推送消息,您将getelegram-middleman-bot我是@MiddleMan机器人! 我坐在您想发送的任何消息和电报之间…

clash-conf:在您的冲突订阅中创建组、负载平衡、自动服务器选择…

本项目将解析vmess、ss、trojan订阅链接,并将其内容转换为clash配置文件config.yaml 所有代码均为python 使用环境 python 3.0 需额外安装的库:requests 使用方法 打开并运行 按提示输入相关信息即可 文件介绍 log… …

Study-SUB:网络和数据库:middle_finger_light_skin_tone:

Study-SUB-master.zip,Study-SUB-master,README.md,Study-NetWork,Day1 :: IP에 대하여.md,Day1 :: NetWork 기본용어.md,Day6 :: 프로토콜에 대하여 .md,Day5 :: Network 토폴로지 lan wan 순서.md,Day2 :: 계층별 …

SubConfig:subconverter外部配置以及利用动作自动更新订阅转换

子配置 subconverter外部配置以及利用动作自动更新订阅转换 重点在利用动作更新订阅转换并发布到自己的服务器, 入门 fork后点击右上角的Star星星按钮即可试用,需要使用发布功能的话需要配置几个秘密 SUBSCRIBE订阅链接,一行一个订阅,支持tg格式的http代理socks5代理, tg://http?server=1.2.3.4port=233user=userpass=passremarks=Example UPLOAD_SECRET配置生成打包压缩后加密时用的aes密钥,由如下命令生成的单行的base64字符串, head -c 32 /dev/urandom | base64 upload_secret DEPLOY_URL发布的上传地址,脚本目录中有php写的接收端,作用是接收加密的配置解密解压后发布到内部服务器上,

TeleTelegram机器人,它将通过简单HTTP调用发送的推送消息转换为您…

webhook2telegram:Tele一个Telegram机器人,它将通过简单HTTP调用的推送消息转换为您可以订阅的Telegram消息 webhook2电报 (以前是电报-中间人-机器人) 可将简单的JSONHTTP请求转换为Telegram推送消息,您将在智能手机,PC或任何拥有的Telegram客…

mqttwarn:订阅MQTT主题(带有通配符)和可通知的可插拔服务

关于 mqttwarn-订阅MQTT主题并通知可插拔服务。 描述 mqttwarn订阅任意数量的MQTT主题,并在可选地应用复杂的转换之后将接收到的有效负载发布到一个或多个通知服务。 它带有70多个通知处理程序插件,可用于各种通知服务,并且对进一步的贡献…

联通安卓免流

联通安卓免流

免流专用移动电信联通免费流量

来自承诺的更新:免流多线程工具 v2.0 (去除更新优化版) 这款工具的最大亮点在于扫描的速度非常之快,相信大家会喜欢的。

Menu_Sub_Menu_Template:Menu Sub菜单控制台应用程序系统。 在C ++中

Menu_Sub_Menu_Template:Menu Sub菜单控制台应用程序系统。 在C ++中

提取均值信号特征的matlab代码-CHALL_21_SUB_A1B:CHALL_21_SUB_A1B

CHALL_21_SUB_A1B-main.zip,CHALL_21_SUB_A1B-main,cre_TAB_labels.m,my_test_model.m,test_model.m,train_model.m,NEW_NET_06L.mat,my_train_model.m,extract_data_from_header.m,last_ECG_preproc.m,get_12ECG_…

MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainod

MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainodl_INDUCTIONGENERATOR_源码.rar.rar

sub_1.rar_1X18″SUB_sub_vhdl

sub_1 subtractor 1 bit xxxxxxxxxxxx

MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainodl_INDUCTIONGENERATOR_源

MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainodl_INDUCTIONGENERATOR_源码.zip

sub_circuit_test_sub_sub-circuit_proteus_

proteus project file to create sub circuit

adder_sub_struct.rar_adder_adder_sub_struct_sub_vhd_vhdl

adder sub struct by vhdl

ClashToV2:把Clash的订阅转换为一行一个分享链接

ClashToV2 把Clash的订阅转换为一行一个分享链接 使用

子转换器:在各种订阅格式之间转换的实用程序

子转换器:在各种订阅格式之间转换的实用程序

手机订阅问题

根据测试用例整理出来的测试问题.大首页与所有留学国家频道公告区,NEW的标志去掉,城市名称与第一排对齐 测试

AutoLabel:网络威胁情报自动标注系统

10:“ counter_measure”, 11:“ sub_activity”, 12:“ IP_evil”, 13:“ IP”, 14:“ domain_evil”, 15:“域”, 16:“ attack_goal”, 17:“时间”, 18:“工具”, 19:“功能”, 20:“ …

Exploratory_data_analysis_week1:第1周的作业

Exploratory_data_analysis_week1 第1周的作业 介绍 该分配使用来自数据, 库是机器学习数据集的流行存储库。 特别是,我们将使用我在课程网站上提供的“个人家庭… Sub_metering_1 :能量子计量1号(以有功电能的瓦

Exploratory_Data_Analysis_week1:Coursera Hopkins探索性数据分析课程工作的回购(第1周)

*此文件是从rdpeng的README.md复制而来的介绍该…电压:分钟平均电压(伏特) Global_intensity :家庭全球分钟平均电流强度(以安培为单位) Sub_metering_1 :1号能量子计量表(有功电能的瓦特小时)。 它对应于厨房

博客园安卓客户端

这是一款博客园安卓客户端,能帮助喜欢用博客园的用户更快捷的使用博客员。

一个注册码的算法反编

Sub cmdReg_Click() ‘N * ref: __vbaExceptHandler ‘N * ref: __vbaObjSet ‘N * ref: __vbaHresultCheckObj ‘N * ref: __vbaFreeObj ‘N * ref: __vbaObjSet ‘N * ref: __vbaHresultCheckObj ‘N * ref: __vbaFreeObj …

乐曲演奏器vhdl设计

q = sub_wire0(3 DOWNTO 0); lpm_rom_component : lpm_rom GENERIC MAP ( intended_device_family = “ACEX1K”, lpm_address_control = “REGISTERED”, lpm_file = “music.hex”, lpm_outdata = …

网站banner图轮播效果 js

.sub_nav{width:663px; height:25px; bottom:0px; position:absolute; color:#999999; z-index:200;} .sub_no{height:25px; float:right;} .sub_no li{display:block; width:25px; height:25px; float:left; …

ZeroMQ-XOP:ZeroMQ XOP使Igor Pro可以使用ZeroMQ消息传递层和JSON作为消息格式通过网络进行接口

:cpp:func:zeromq_sub_add_filter :cpp:func:`zeromq_sub_connect` :cpp:func:zeromq_sub_recv :cpp:func:zeromq_sub_remove_filter 安装 视窗 退出Igor Pro 将vcredist软件包安装在“ output / …

评论

立即下载 vip 低至0.43元/次送3个月+抽豪礼

如何使用 NB-Iot + Arduino 通过MQTT协议上传数据至阿里云平台?

有很多通信模块只有TCP功能,没有MQTT功能,比如WIFI,W5500等模块,还有一些NBIOT模块,但是又想连接阿里云物联网平台,官方提供了操作系统,需要自己移植,很麻烦,比较难看得懂。就在想有没有一些简单一定的方法。

心想MQTT是基于TCP的,能否使用TCP转MQTT?因此就想使用TCP协议然后转MQTT协议连接阿里云物联网平台,经过试验证明是可以的。

首先我们先分析一下如何登陆接入Onenet平台。

先从它数据格式开始分析。首先我们要从后台取出三个信息,我们以这个为例。

我们把产品ID,设备名称,设备秘钥,简称三要素 (具体是什么看你自己的设备)

其实阿里云物联网平台的MQTT协议用的就是标准的,不过它加入了自己的认证方式。

MQTT协议需要上传四个参数,报活时间,clientID,用户名,密码。

那么阿里云的就在clientID,用户名,密码做了手脚。

clientID比较长,按照一定的格式

用户名:设备名和秘钥组成

密码:使用了加密串进行了加密,有sha1或者MD5加密方式

下面我们来介绍一下

MQTT接入都是发十六进制的数据。

么我们发送的时候就是这样子的一串数据

0x74 0x00 0x04 0x4d 0x51 0x54 0x54 0x04 0xC0 0078 0033 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x67

0x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c 0009

0x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34 0028 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36

十六进制解释

数据长度:0x74

协议数据长度 0x00 0x04

协议类型: 0x4d 0x51 0x54 0x54

协议数据: 0x04 0xC0

keepAlive数据:0078

ClientID长度:0033

ClientID: 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x67 0x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c

用户名:0009

用户名: 0x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34

密码长度:0028

密码: 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36复制代码上面的就是连接服务器的连接包

下面呢,我们来做个发布包(上传数据到服务器)

0x30 0x1D 0009 2f7379732f706f7374 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d

十六进制数据解释

数据头:0x30

数据长度:0x1D

TopicName数据长度:0009

TopicName数据内容:2f7379732f706f7374

主体json数据: 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d复制代码以上就是连接阿里云的数据包格式及发布数据的格式,由于时间问题没有做订阅的数据包分析,下一次更新订阅的内容。

原创文章,作者:DQVIX,如若转载,请注明出处:https://www.506064.com/n/128959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
DQVIX的头像DQVIX
上一篇 2024-10-03 23:25
下一篇 2024-10-03 23:25

相关推荐

  • Python简单数学计算

    本文将从多个方面介绍Python的简单数学计算,包括基础运算符、函数、库以及实际应用场景。 一、基础运算符 Python提供了基础的算术运算符,包括加(+)、减(-)、乘(*)、除…

    编程 2025-04-29
  • Python满天星代码:让编程变得更加简单

    本文将从多个方面详细阐述Python满天星代码,为大家介绍它的优点以及如何在编程中使用。无论是刚刚接触编程还是资深程序员,都能从中获得一定的收获。 一、简介 Python满天星代码…

    编程 2025-04-29
  • Python海龟代码简单画图

    本文将介绍如何使用Python的海龟库进行简单画图,并提供相关示例代码。 一、基础用法 使用Python的海龟库,我们可以控制一个小海龟在窗口中移动,并利用它的“画笔”在窗口中绘制…

    编程 2025-04-29
  • Python樱花树代码简单

    本文将对Python樱花树代码进行详细的阐述和讲解,帮助读者更好地理解该代码的实现方法。 一、简介 樱花树是一种图形效果,它的实现方法比较简单。Python中可以通过turtle这…

    编程 2025-04-28
  • Python大神作品:让编程变得更加简单

    Python作为一种高级的解释性编程语言,一直被广泛地运用于各个领域,从Web开发、游戏开发到人工智能,Python都扮演着重要的角色。Python的代码简洁明了,易于阅读和维护,…

    编程 2025-04-28
  • 用Python实现简单爬虫程序

    在当今时代,互联网上的信息量是爆炸式增长的,其中很多信息可以被利用。对于数据分析、数据挖掘或者其他一些需要大量数据的任务,我们可以使用爬虫技术从各个网站获取需要的信息。而Pytho…

    编程 2025-04-28
  • 如何制作一个简单的换装游戏

    本文将从以下几个方面,为大家介绍如何制作一个简单的换装游戏: 1. 游戏需求和界面设计 2. 使用HTML、CSS和JavaScript开发游戏 3. 实现游戏的基本功能:拖拽交互…

    编程 2025-04-27
  • Guava Limiter——限流器的简单易用

    本文将从多个维度对Guava Limiter进行详细阐述,介绍其定义、使用方法、工作原理和案例应用等方面,并给出完整的代码示例,希望能够帮助读者更好地了解和使用该库。 一、定义 G…

    编程 2025-04-27
  • 2的32次方-1:一个看似简单却又复杂的数字

    对于计算机领域的人来说,2的32次方-1(也就是十进制下的4294967295)这个数字并不陌生。它经常被用来表示IPv4地址或者无符号32位整数的最大值。但实际上,这个数字却包含…

    编程 2025-04-27
  • 制作一个简单的管理系统的成本及实现

    想要制作一个简单的管理系统,需要进行技术选型、开发、测试等过程,那么这个过程会花费多少钱呢?我们将从多个方面来阐述制作一个简单的管理系统的成本及实现。 一、技术选型 当我们开始思考…

    编程 2025-04-27

发表回复

登录后才能评论