Bab ini menjelaskan cara mengirim dan menerima pesan melalui topik MQTT, serta cara mengimplementasikan perangkat dengan metode pemrograman Device-Modelling di Ubuntu.
Instal lingkungan pengembangan lokal.
Instal Ubuntu 16.04.
Lingkungan kompilasi untuk pengalaman cepat ini adalah Ubuntu 16.04 pada host 64-bit. Lingkungan ini belum diverifikasi pada versi Linux lainnya. Kami menyarankan Anda menginstal versi rilis yang konsisten dengan Alibaba untuk menghindari masalah kompatibilitas.
Jika Anda menggunakan sistem operasi Windows, kami sarankan Anda menginstal VMWare Virtualbox.
Kemudian, instal versi Desktop 64-bit dari Ubuntu 16.04.x LTS. Tautan Unduhan: http://releases.ubuntu.com/16.04.
Instal perangkat lunak prasyarat.
Lingkungan pengembangan dan kompilasi SDK ini menggunakan perangkat lunak berikut: make-4.1, git-2.7.4, gcc-5.4.0, gcov-5.4.0, lcov-1.12, bash-4.3.48, tar-1.28, mingw-5.3.1.
Anda dapat menggunakan perintah berikut untuk menginstal perangkat lunak yang diperlukan:
$ sudo apt-get install -y build-essential make git gccKembangkan melalui Hacklab Web IDE.
Jika Anda tidak berencana menginstal Ubuntu di PC atau laptop Anda, Anda juga dapat mengembangkan perangkat langsung melalui lingkungan Hacklab Web IDE yang disediakan oleh Platform IoT Alibaba Cloud. Hacklab Web IDE adalah lingkungan pengembangan Linux di cloud, yang sudah memiliki semua perangkat lunak yang diperlukan terinstal. Jika Anda memiliki akun Alibaba Cloud, Anda dapat masuk ke Hacklab Web IDE dan mulai pengembangan melalui browser.
Akses perangkat menggunakan topik MQTT
Buat produk dan perangkat.
Gunakan akun Alibaba Cloud Anda untuk masuk ke Platform IoT Alibaba Cloud untuk membuat produk. Karena Anda mengimplementasikan fungsi produk secara langsung melalui topik MQTT, pastikan untuk memilih “Versi Dasar” saat membuat produk.
Setelah membuat produk, Anda perlu membuat perangkat tertentu. Platform IoT Alibaba Cloud akan menghasilkan informasi identitas untuk perangkat tersebut.
Jika Anda tidak terbiasa dengan pembuatan produk di cloud, silakan pelajari cara membuat produk dan perangkat di Platform IoT Alibaba Cloud.
Implementasikan fungsi produk.
Pahami struktur direktori root dari SDK.
Setelah SDK Link Kit diunduh, struktur direktori tingkat atas adalah sebagai berikut:
$ ls
build-rules Config.in examples LICENSE make.settings project.mk sdk-c.mk win_board_conf.mk CMakeLists.txt Config.linkkit include makefile prebuilt README.txt src win.makefileUbah Identifikasi Perangkat.
Untuk mendapatkan ProductKey & Product Secret suatu produk dengan mengklik tombol ‘salin’ yang ditunjukkan pada gambar di bawah ini:
Untuk mendapatkan DeviceName & DeviceSecret suatu perangkat dengan mengklik tombol ‘salin’ yang ditunjukkan pada gambar di bawah ini:
Buka file ./examples/mqtt/mqtt-example.c, edit potongan kode berikut, untuk mengganti nilai PRODUCT_KEY/PRODUCT_SECRET/DEVICE_NAME/DEVICE_SECRET:
#include "iot_import.h"
#include "iot_export.h"
#include "app_entry.h"
#define PRODUCT_KEY "a1MZxOdcBnO"
#define PRODUCT_SECRET "h4I4dneEFp7EImTv"
#define DEVICE_NAME "test_01"
#define DEVICE_SECRET "t9GmMf2jb3LgWfXBaZD2r3aJrfVWBv56"Inisialisasi perangkat dan buat koneksi.
Potongan kode berikut secara singkat menjelaskan proses inisialisasi dan pembuatan koneksi perangkat:
int mqtt_client(void)
{
...
...
/* Masukkan informasi identitas perangkat sebelum mencoba membuat koneksi MQTT ke server*/
if (0 ! = IOT_SetupConnInfo(__product_key, __device_name, __device_secret, (void **)&pconn_info)) {
EXAMPLE_TRACE("Permintaan AUTH gagal!") ;
rc = -1;
goto do_exit;
}
/* Inisialisasi parameter MQTT */
...
...Coba buat koneksi MQTT ke server.
pclient = IOT_MQTT_Construct(&mqtt_params);
if (NULL == pclient) {
EXAMPLE_TRACE("Konstruksi MQTT gagal");
rc = -1;
goto do_exit;
}Laporkan data ke cloud.
Topik-topik berikut didefinisikan dalam file contoh:
#define TOPIC_UPDATE "/"PRODUCT_KEY"/"DEVICE_NAME"/update"
#define TOPIC_ERROR "/"PRODUCT_KEY"/"DEVICE_NAME"/update/error"
#define TOPIC_GET "/"PRODUCT_KEY"/"DEVICE_NAME"/get"
#define TOPIC_DATA "/"PRODUCT_KEY"/"DEVICE_NAME"/data"
/* definisi format topik*/
#define TOPIC_UPDATE_FMT "/%s/%s/update"
#define TOPIC_ERROR_FMT "/%s/%s/update/error"
#define TOPIC_GET_FMT "/%s/%s/get"
#define TOPIC_DATA_FMT "/%s/%s/data"Platform IoT Alibaba Cloud akan menghasilkan 3 topik berikut secara default untuk produk “Edisi Dasar”:
Potongan kode berikut menunjukkan cara mengirim data ke topik ‘UPDATE’:
/* Inisialisasi informasi topik */
memset(&topic_msg, 0x0, sizeof(iotx_mqtt_topic_info_t));
strcpy(msg_pub, "update: hello! start!") ;
topic_msg.qos = IOTX_MQTT_QOS1;
topic_msg.retain = 0;
topic_msg.dup = 0;
topic_msg.payload = (void *)msg_pub;
topic_msg.payload_len = strlen(msg_pub);
rc = IOT_MQTT_Publish(pclient, TOPIC_UPDATE, &topic_msg);
if (rc < 0) {
IOT_MQTT_Destroy(&pclient);
EXAMPLE_TRACE("terjadi kesalahan saat publikasi");
rc = -1;
goto do_exit;
}
EXAMPLE_TRACE("\n publikasi pesan: \n topik: %s\n payload: \%s\n rc = %d", TOPIC_UPDATE, topic_msg.payload, rc);Berlangganan dan proses data dari cloud.
Program contoh berlangganan ke topik TOPIC_DATA, dan menentukan penanganan saat menerima data dari topik:
rc = IOT_MQTT_Subscribe(pclient, TOPIC_DATA, IOTX_MQTT_QOS1, _demo_message_arrive, NULL);
if (rc < 0) {
IOT_MQTT_Destroy(&pclient);
EXAMPLE_TRACE("IOT_MQTT_Subscribe() gagal, rc = %d", rc);
rc = -1;
goto do_exit;
}
IOT_MQTT_Yield(pclient, 200);
HAL_SleepMs(2000);
...
...Dalam fungsi _demo_message_arrive(), cukup cetak data tersebut:
static void _demo_message_arrive(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
{
iotx_mqtt_topic_info_pt ptopic_info = (iotx_mqtt_topic_info_pt) msg->msg;
/* cetak nama topik dan pesan topik */
EXAMPLE_TRACE("----");
EXAMPLE_TRACE("packetId: %d", ptopic_info->packet_id);
EXAMPLE_TRACE("Topik: '%.*s' (Panjang: %d)",
ptopic_info->topic_len,
ptopic_info->ptopic,
ptopic_info->topic_len);
EXAMPLE_TRACE("Payload: '%.*s' (Panjang: %d)",
ptopic_info->payload_len,
ptopic_info->payload,
ptopic_info->payload_len);
EXAMPLE_TRACE("----");
}Potongan kode berikut mencoba mengirim data ke topik ini:
do {
cnt++;
msg_len = snprintf(msg_pub, sizeof(msg_pub), "{\"attr_name\":\"temperature\", \"attr_value\":\"%d\"}", cnt);
...
...
rc = IOT_MQTT_Publish(pclient, TOPIC_DATA, &topic_msg);
if (rc < 0) {
EXAMPLE_TRACE("terjadi kesalahan saat publikasi");
rc = -1;
break;
}
EXAMPLE_TRACE("packet-id=%u, publikasi pesan topik=%s", (uint32_t)rc, msg_pub);Karena contoh ini berlangganan ke topik TOPIC_DATA, maka akan menerima data kembali setelah mengirim data ke platform IoT.
Kompilasi program contoh.
Jalankan perintah berikut di direktori tingkat atas SDK:
make distclean
makeSetelah kompilasi berhasil diselesaikan, program contoh dihasilkan di direktori output/release/bin dari jalur saat ini:
$ tree output/release
output/release/
+-- bin
...
...
| +-- mqtt-example
...
...Amati data.
Jalankan perintah berikut:
$ ./output/release/bin/mqtt-exampleAnda dapat menemukan produk yang ditentukan di konsol Platform IoT Alibaba Cloud, dan melihat pesan yang dilaporkan dari perangkat di Log Service. Anda dapat klik di sini untuk mempelajari cara melihat data yang dilaporkan dari perangkat di cloud.
Anda juga dapat melihat data dari cloud yang dicetak oleh program contoh di konsol Linux:
_demo_message_arrive|166 :: ----
_demo_message_arrive|167 :: packetId: 35641
_demo_message_arrive|171 :: Topik: '/a1ExpAkj9Hi/Example1/data' (Panjang: 26)
_demo_message_arrive|175 :: Payload: '{"attr_name":"temperature", "attr_value":"1"}' (Panjang: 45)
_demo_message_arrive|176 :: ----Mengembangkan Produk dengan Pemodelan Perangkat
Buat produk dan perangkat.
Anda dapat membuat produk di Platform IoT Alibaba Cloud dan layanan-layanan yang disediakan di atasnya. Tautan bantuan untuk membuat produk di Platform IoT Alibaba Cloud adalah sebagai berikut:
Jika sebuah produk perlu dibuat di Platform IoT Kehidupan Cerdas (layanan terkait gaya hidup di Platform IoT Alibaba Cloud), Anda dapat masuk ke Platform IoT Kehidupan untuk membuat produk tersebut.
Dalam contoh ini, Anda perlu membuat produk yang mendukung fungsi:
Properti LightSwitch
Pengenal: LightSwitch
Tipe data: enum
Nilai: 0 dan 1
Tipe Baca/Tulis: baca dan tulis
Layanan Custom
Pengenal: Custom
Metode panggilan: Asinkron
Parameter input: {Pengenal: transparency, Tipe data: int32, Rentang nilai: 0 ~ 100}
Parameter output: {Pengenal: Contrastratio, Tipe data: int32, Rentang nilai: 0 ~ 100}
Peristiwa
Pengenal: Error
Tipe peristiwa: Informasi
Parameter output: {Pengenal: Errorcode, Tipe data: enum, Rentang nilai: 0, 1}
Setelah definisi produksi, platform IoT menghasilkan file deskripsi TSL dalam format JSON untuk produk ini.
Implementasikan fungsi produk.
Masukkan trituple perangkat ke dalam rutinitas.
Ganti sertifikat (ProductKey/ProductSecret/DeviceName/DeviceSecret) di ./examples/linkkit/linkkit_example_solo.c dengan yang dihasilkan di platform IoT.
#define PRODUCT_KEY "a1csED27mp7"
#define PRODUCT_SECRET "VuULINCrtTAzCSzp"
#define DEVICE_NAME "AdvExample1"
#define DEVICE_SECRET "3xGoxtWRscxPAoMxnJnjocZbNfmCTRi0"Kompilasi dan jalankan program.
Jalankan perintah berikut di direktori tingkat atas SDK:
$ make distclean
$ makeSetelah kompilasi berhasil diselesaikan, program contoh untuk produk Edisi-Pro dihasilkan di direktori output/release/bin dari jalur saat ini, dan namanya adalah linkkit-example-solo.
Jalankan perintah berikut di direktori tingkat atas SDK:
$ ./output/release/bin/linkkit-example-soloAmati data.
Program contoh secara berkala melaporkan nilai properti LightSwitch ke cloud, Anda dapat memeriksa properti tersebut di platform IoT.
Laporkan properti.
Program contoh ini memanggil fungsi user_post_property untuk melaporkan properti. Contoh siklus melalui pelaporan muatan berbagai situasi. Harap diperhatikan bahwa fungsi ini mencoba mengirim beberapa properti tidak valid ke platform IoT, tujuannya adalah untuk membiarkan pengembang terbiasa dengan kode kesalahan yang dikembalikan oleh platform IoT, Anda dapat menghapusnya saat mengimplementasikan logika Anda sendiri:
void user_post_property(void)
{
static int example_index = 0;
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
char *property_payload = "NULL";
if (example_index == 0) {Contoh pelaporan atribut tipikal
/* Contoh Tipikal */
property_payload = "{\"LightSwitch\":1}";
example_index++;
}else if(...) {
...
...
}
res = IOT_Linkkit_Report(user_example_ctx->master_devid, ITM_MSG_POST_PROPERTY,
(unsigned char *)property_payload, strlen(property_payload));
EXAMPLE_TRACE("ID Pesan Properti Terkirim: %d", res);
}Log yang dicetak selama pelaporan atribut tipikal adalah sebagai berikut:
[inf] dm_msg_request(218): DM Kirim Pesan, URI: /sys/a1csED27mp7/AdvExample1/thing/event/property/post, Payload: {"id":"1","version":"1.0","params":{"LightSwitch":1},"method":"thing.event.property.post"}
[dbg] MQTTPublish(319): ALLOC: (160) / [224] @ 0x1da41a0
[inf] MQTTPublish(378): Topik Hulu: '/sys/a1csED27mp7/AdvExample1/thing/event/property/post'
[inf] MQTTPublish(379): Payload Hulu:Pesan berikut dikirim ke cloud:
> {
> "id": "1",
> "version": "1.0",
> "params": {
> "LightSwitch": 1
> },
> "method": "thing.event.property.post"
> }
[inf] dm_client_publish(106): Hasil Publikasi: 0
[dbg] alcs_observe_notify(105): payload:{"id":"1","version":"1.0","params":{"LightSwitch":1},"method":"thing.event.property.post"}
[dbg] CoAPResourceByPath_get(176): Sumber daya ditemukan: /sys/a1csED27mp7/AdvExample1/thing/event/property/post
[inf] dm_server_send(76): Kirim Hasil Notifikasi Observasi 0
[dbg] dm_msg_cache_insert(79): ukuran daftar dmc: 0
user_post_property. 431: ID Pesan Properti Terkirim: 1
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Topik Hilir: '/sys/a1csED27mp7/AdvExample1/thing/event/property/post_reply'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Payload Hilir:Respon berikut diterima dari cloud:
< {
< "code": 200,
< "data": {
< },
< "id": "1",
< "message": "success",
< "method": "thing.event.property.post",
< "version": "1.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Identitas Paket : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Panjang Topik : 60
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Nama Topik : /sys/a1csED27mp7/AdvExample1/thing/event/property/post_reply
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Panjang Payload/Ruang : 104 / 4935
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Panjang Buffer Penerimaan : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): mengirimkan pesan ...
[dbg] iotx_mc_deliver_message(1291): topik cocok
[inf] dm_msg_proc_thing_event_post_reply(258): ID Peristiwa: property
[dbg] dm_msg_response_parse(167): ID Pesan Permintaan Saat Ini: 1
[dbg] dm_msg_response_parse(168): Kode Pesan Permintaan Saat Ini: 200
[dbg] dm_msg_response_parse(169): Data Pesan Permintaan Saat Ini: {}
[dbg] dm_msg_response_parse(174): Deskripsi Pesan Permintaan Saat Ini: success
[dbg] dm_ipc_msg_insert(87): ukuran daftar dm: 0, ukuran maks: 50
[dbg] dm_msg_cache_remove(142): Hapus ID Pesan: 1
[inf] _iotx_linkkit_event_callback(219): Jenis Pesan Diterima: 30
[inf] _iotx_linkkit_event_callback(221): Pesan Diterima: {"id":1,"code":200,"devid":0,"payload":{}}
[dbg] _iotx_linkkit_event_callback(476): ID Saat Ini: 1
[dbg] _iotx_linkkit_event_callback(477): Kode Saat Ini: 200
[dbg] _iotx_linkkit_event_callback(478): Devid Saat Ini: 0Log fungsi callback:
user_report_reply_event_handler. 300: Balasan Pesan Terkirim Diterima, Devid: 0, ID Pesan: 1, Kode: 200, Balasan: {}Proses permintaan pengaturan properti.
Saat permintaan pengaturan properti diterima dalam kode contoh, fungsi callback berikut akan dipanggil:
static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
{
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
EXAMPLE_TRACE("Properti Set Diterima, Devid: %d, Permintaan: %s", devid, request);Dalam fungsi tersebut, hanya mengirimkan nilai properti kembali ke platform IoT, yang akan memperbarui catatan properti perangkat:
res = IOT_Linkkit_Report(user_example_ctx->master_devid, ITM_MSG_POST_PROPERTY,
(unsigned char *)request, request_len);
EXAMPLE_TRACE("ID Pesan Properti Terkirim: %d", res);
return 0;
}Anda dapat melihat nilai yang diatur dari platform IoT di log perangkat:
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Topik Hilir: '/sys/a1csED27mp7/AdvExample1/thing/service/property/set'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Payload Hilir:Permintaan pengaturan properti yang diterima dari cloud adalah sebagai berikut:
< {
< "method": "thing.service.property.set",
< "id": "161430786",
< "params": {
< "LightSwitch": 1
< },
< "version": "1.0.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Identitas Paket : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Panjang Topik : 55
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Nama Topik : /sys/a1csED27mp7/AdvExample1/thing/service/property/set
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Panjang Payload/Ruang : 113 / 4940
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Panjang Buffer Penerimaan : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): mengirimkan pesan ...
[dbg] iotx_mc_deliver_message(1291): topik cocok
[inf] dm_msg_proc_thing_service_property_set(93): thing/service/property/set
[dbg] dm_msg_request_parse(142): ID Pesan Permintaan Saat Ini: 161430786
[dbg] dm_msg_request_parse(143): Versi Pesan Permintaan Saat Ini: 1.0.0
[dbg] dm_msg_request_parse(144): Metode Pesan Permintaan Saat Ini: thing.service.property.set
[dbg] dm_msg_request_parse(145): Parameter Pesan Permintaan Saat Ini: {"LightSwitch":1}
[dbg] dm_ipc_msg_insert(87): ukuran daftar dm: 0, ukuran maks: 50
[inf] dm_msg_response(274): Kirim URI: /sys/a1csED27mp7/AdvExample1/thing/service/property/set_reply, Payload: {"id":"161430786","code":200,"data":{}}
[dbg] MQTTPublish(319): ALLOC: (100) / [164] @ 0x154f1f0
[inf] MQTTPublish(378): Topik Hulu: '/sys/a1csED27mp7/AdvExample1/thing/service/property/set_reply'
[inf] MQTTPublish(379): Payload Hulu:The following log is printed when the user_property_set_event_handler menerima permintaan pengaturan atribut:
user_property_set_event_handler. 160: Properti Set Diterima, Devid: 0, Permintaan: {"LightSwitch":1}Catatan: Ketika produk aktual menerima pengaturan properti, pengembang harus menguraikan properti dan memprosesnya sesuai dengan itu, bukan hanya mengirimkan nilai kembali ke platform IoT.
Laporkan peristiwa.
Fungsi user_post_event() dalam program contoh adalah untuk mengirim peristiwa ke platform IoT, lagi-lagi ia menghasilkan beberapa peristiwa tidak valid dan mengirimkannya ke platform IoT, Anda perlumenghapusnya dan hanya mengirim peristiwa ke platform IoT hanya ketika peristiwa dipicu:
void user_post_event(void)
{
static int example_index = 0;
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
char *event_id = "Error";
char *event_payload = "NULL";
if (example_index == 0) {
...
//Laporkan peristiwa ke cloud
res = IOT_Linkkit_TriggerEvent(user_example_ctx->master_devid, event_id, strlen(event_id),
event_payload, strlen(event_payload));
EXAMPLE_TRACE("ID Pesan Peristiwa Terkirim: %d", res);
}Peristiwa yang dilaporkan ke cloud adalah sebagai berikut:
> {
> "id": "1",
> "version": "1.0",
> "params": {
> "ErrorCode": 0
> },
> "method": "thing.event.Error.post"
> }
[inf] dm_client_publish(106): Hasil Publikasi: 0
[dbg] alcs_observe_notify(105): payload:{"id":"1","version":"1.0","params":{"ErrorCode":0},"method":"thing.event.Error.post"}
[inf] dm_server_send(76): Kirim Hasil Notifikasi Observasi 0
[dbg] dm_msg_cache_insert(79): ukuran daftar dmc: 0
user_post_event. 470: ID Pesan Peristiwa Terkirim: 1
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Topik Hilir: '/sys/a1csED27mp7/AdvExample1/thing/event/Error/post_reply'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Payload Hilir:Respon yang diterima dari cloud adalah sebagai berikut:
< {
< "code": 200,
< "data": {
< },
< "id": "1",
< "message": "success",
< "method": "thing.event.Error.post",
< "version": "1.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Identitas Paket : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Panjang Topik : 57
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Nama Topik : /sys/a1csED27mp7/AdvExample1/thing/event/Error/post_reply
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Panjang Payload/Ruang : 101 / 4938
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Panjang Buffer Penerimaan : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): mengirimkan pesan ...
[dbg] iotx_mc_deliver_message(1291): topik cocok
[inf] dm_msg_proc_thing_event_post_reply(258): ID Peristiwa: Error
[dbg] dm_msg_response_parse(167): ID Pesan Permintaan Saat Ini: 1
[dbg] dm_msg_response_parse(168): Kode Pesan Permintaan Saat Ini: 200
[dbg] dm_msg_response_parse(169): Data Pesan Permintaan Saat Ini: {}
[dbg] dm_msg_response_parse(174): Deskripsi Pesan Permintaan Saat Ini: success
[dbg] dm_ipc_msg_insert(87): ukuran daftar dm: 0, ukuran maks: 50
[dbg] dm_msg_cache_remove(142): Hapus ID Pesan: 1
[inf] _iotx_linkkit_event_callback(219): Jenis Pesan Diterima: 31
[inf] _iotx_linkkit_event_callback(221): Pesan Diterima: {"id":1,"code":200,"devid":0,"eventid":"Error","payload":"success"}
[dbg] _iotx_linkkit_event_callback(513): ID Saat Ini: 1
[dbg] _iotx_linkkit_event_callback(514): Kode Saat Ini: 200
[dbg] _iotx_linkkit_event_callback(515): Devid Saat Ini: 0
[dbg] _iotx_linkkit_event_callback(516): EventID Saat Ini: Error
[dbg] _iotx_linkkit_event_callback(517): Pesan Saat Ini: successLog berikut dicetak untuk fungsi callback pengguna user_trigger_event_reply_event_handler:
user_trigger_event_reply_event_handler. 310: Balasan Peristiwa Terpicu Diterima, Devid: 0, ID Pesan: 1, Kode: 200, EventID: Error, Pesan: successPanggilan Layanan.
Dalam program contoh, ketika permintaan panggilan layanan diterima, fungsi callback berikut akan dipanggil:
static int user_service_request_event_handler(const int devid, const char *serviceid, const int serviceid_len,
const char *request, const int request_len,
char **response, int *response_len)
{
int contrastratio = 0, to_cloud = 0;
cJSON *root = NULL, *item_transparency = NULL, *item_from_cloud = NULL;
EXAMPLE_TRACE("Permintaan Layanan Diterima, Devid: %d, ID Layanan: %.*s, Payload: %s", devid, serviceid_len,
serviceid,
request);
/* Parse Root */
root = cJSON_Parse(request);
if (root == NULL || ! cJSON_IsObject(root)) {
EXAMPLE_TRACE("Kesalahan Parse JSON");
return -1;
}Anda perlu memproses layanan yang diterima dengan ID Layanan Custom, tetapkan nilai parameter input layanan +1 ke parameter output, dan kembalikan ke cloud.
if (strlen("Custom") == serviceid_len && memcmp("Custom", serviceid, serviceid_len) == 0) {
...
contrastratio = item_transparency->valueint + 1;
...
HAL_Snprintf(*response, *response_len, response_fmt, contrastratio);
*response_len = strlen(*response);
} else if (strlen("SyncService") == serviceid_len && memcmp("SyncService", serviceid, serviceid_len) == 0) {
...
...
}
cJSON_Delete(root);
return 0;
}Pada titik ini, Anda dapat melihat log berikut di sisi perangkat:
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Topik Hilir: '/sys/a1csED27mp7/AdvExample1/thing/service/Custom'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Payload Hilir:Permintaan pemanggilan layanan berikut diterima dari cloud, dengan parameter input transparency:
< {
< "method": "thing.service.Custom",
< "id": "161445548",
< "params": {
< "transparency": 5
< },
< "version": "1.0.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Identitas Paket : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Panjang Topik : 49
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Nama Topik : /sys/a1csED27mp7/AdvExample1/thing/service/Custom
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Panjang Payload/Ruang : 96 / 4946
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Panjang Buffer Penerimaan : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): mengirimkan pesan ...
[dbg] iotx_mc_deliver_message(1291): topik cocok
[inf] dm_msg_proc_thing_service_request(224): Pengenal Layanan: Custom
[dbg] dm_msg_request_parse(142): ID Pesan Permintaan Saat Ini: 161445548
[dbg] dm_msg_request_parse(143): Versi Pesan Permintaan Saat Ini: 1.0.0
[dbg] dm_msg_request_parse(144): Metode Pesan Permintaan Saat Ini: thing.service.Custom
[dbg] dm_msg_request_parse(145): Parameter Pesan Permintaan Saat Ini: {"transparency":5}
[dbg] dm_ipc_msg_insert(87): ukuran daftar dm: 0, ukuran maks: 50
[inf] _iotx_linkkit_event_callback(219): Jenis Pesan Diterima: 18
[inf] _iotx_linkkit_event_callback(221): Pesan Diterima: {"id":"161445548","devid":0,"serviceid":"Custom","payload":{"transparency":5}}
[dbg] _iotx_linkkit_event_callback(300): ID Saat Ini: 161445548
[dbg] _iotx_linkkit_event_callback(301): Devid Saat Ini: 0
[dbg] _iotx_linkkit_event_callback(302): ServiceID Saat Ini: Custom
[dbg] _iotx_linkkit_event_callback(303): Payload Saat Ini: {"transparency":5}Fungsi pemanggilan pengguna user_service_request_event_handler dipanggil:
user_service_request_event_handler. 99: Permintaan Layanan Diterima, Devid: 0, ID Layanan: Custom, Payload: {"transparency":5}
user_service_request_event_handler. 116: transparency: 5
[dbg] iotx_dm_send_service_response(280): Payload Respons Layanan Saat Ini, Panjang: 19, Payload: {"Contrastratio":6}
[dbg] dm_mgr_upstream_thing_service_response(1275): Nama Layanan Saat Ini: thing/service/Custom_reply
[inf] dm_msg_response(274): Kirim URI: /sys/a1csED27mp7/AdvExample1/thing/service/Custom_reply, Payload: {"id":"161445548","code":200,"data":{"Contrastratio":6}}
[dbg] MQTTPublish(319): ALLOC: (111) / [175] @ 0x85a1a0
[inf] MQTTPublish(378): Topik Hulu: '/sys/a1csED27mp7/AdvExample1/thing/service/Custom_reply'
[inf] MQTTPublish(379): Payload Hulu:Dalam fungsi callback, tambahkan 1 ke nilai transparency, tetapkan nilainya ke Contrastratio, dan kemudian laporkan ke cloud:
> {
> "id": "161445548",
> "code": 200,
> "data": {
> "Contrastratio": 6
> }
> }
[inf] dm_client_publish(106): Hasil Publikasi: 0
[dbg] alcs_observe_notify(105): payload:{"id":"161445548","code":200,"data":{"Contrastratio":6}}
[inf] dm_server_send(76): Kirim Hasil Notifikasi Observasi 0Itu menyimpulkan deskripsi layanan, atribut, dan peristiwa dalam rutinitas versi lanjutan satu item.