本文目錄一覽:
- 1、如何用ESP8266的JSON函數解析JSON數據
- 2、android中mqtt怎麼做
- 3、阿里雲物聯網平台 – 物模型
- 4、一鍵轉換訂閱免流參數
- 5、如何使用 NB-Iot + Arduino 通過MQTT協議上傳數據至阿里雲平台?
如何用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-hk/n/128959.html