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/zh-tw/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

發表回復

登錄後才能評論