1 /*
2 Copyright (C) 2024 HiHope Open Source Organization .
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 */
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include "ohos_init.h"
20 #include "cmsis_os2.h"
21 #include "unistd.h"
22
23 #include "MQTTClient.h" // MQTTClient-C库接口文件
24 #include "mqtt_ohos.h" // OHOS适配接口文件
25
26 #include "iot_gpio.h"
27 #include "iot_gpio_ex.h"
28
29 //要连接热点的名称,根据实际情况修改
30 #define SSID "WIFI-0A02"
31
32 //要连接热点的密码,根据实际情况修改
33 #define PSK "1234567890"
34
35 // MQTT服务器IP地址(默认是电脑的地址),请根据实际情况修改
36 #define MQTT_SERVER_IP "192.168.100.198"
37
38 // MQTT服务器端口,请根据实际情况修改
39 #define MQTT_SERVER_PORT "1888"
40
41 //交通板红色LED
42 #define RED_GPIO 7
43
44 // MQTT客户端
45 static MQTTClient client = {0};
46
47 // MQTT网络连接
48 static Network network = {0};
49
50 // 发送和接收的数据缓冲区
51 static unsigned char sendbuf[100], readbuf[100];
52
53 //MQTT消息
54 MQTTMessage message;
55
56
57 /// 初始化交通灯板红色LED的引脚
InitLED(void)58 void InitLED(void)
59 {
60 usleep(1000000);
61 // 初始化GPIO模块
62 IoTGpioInit(RED_GPIO);
63 // 设置GPIO7为GPIO功能。
64 IoSetFunc(RED_GPIO, IOT_IO_FUNC_GPIO_7_GPIO);
65 // 设置GPIO7为输出模式(引脚方向为输出)。
66 IoTGpioSetDir(RED_GPIO, IOT_GPIO_DIR_OUT);
67 }
68
69 // uint16_t state;
70 // uint16_t param;
71 // 接收订阅消息的回调函数
OnMessageArrived(MessageData * data)72 static void OnMessageArrived(MessageData *data)
73 {
74
75
76 printf("Message form \r\n%s\r\n",
77 data->topicName->lenstring.data);
78 char* ret = strstr(data->message->payload, "state");
79 char *ptr;
80 uint8_t i = 0;
81 if (ret != NULL){
82
83 while (ret[i] != '1'&&ret[i] != '0')
84 {
85 i++;
86 if (ret[i] == '1')
87 {
88 printf("LED_ON!!\r\n");
89 IoTGpioSetOutputVal(RED_GPIO,1);
90 }
91 else if(ret[i] == '0'){
92 printf("LED_OFF!!\r\n");
93 IoTGpioSetOutputVal(RED_GPIO,0);
94 }
95
96 }
97 }
98 else printf("can not find state\n");
99
100
101
102 }
103
MqttTask(void * arg)104 static void MqttTask(void *arg)
105 {
106 MQTTClient *c = (MQTTClient *)arg;
107 while (c)
108 {
109 mqttMutexLock(&c->mutex);
110 if (c->isconnected)
111 {
112 //接收订阅的数据
113 MQTTYield(c, 1);
114 }
115 mqttMutexUnlock(&c->mutex);
116
117 osDelay(100);
118 }
119 }
120
mqttDemoTask(void * arg)121 static void mqttDemoTask(void *arg)
122 {
123 (void)arg;
124
125 InitLED();
126 // 连接到热点
127 if (ConnectToHotspot(SSID, PSK) != 0)
128 {
129 // 连接到热点失败
130 printf("Connect to AP failed\r\n");
131 return;
132 }
133
134 // 等待TCP连接完成
135 osDelay(100);
136
137 //初始化MQTT相关的参数和回调
138 NetworkInit(&network);
139 // 初始化MQTT客户端
140 MQTTClientInit(&client, &network, 200, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf));
141
142 const char *host = MQTT_SERVER_IP; // MQTT服务器IP地址
143 unsigned short port = atoi(MQTT_SERVER_PORT); // MQTT服务器端口
144 const char *clientId = "client_test"; // MQTT客户端ID
145 const char *username = NULL; // MQTT服务器用户名
146 const char *passwords = NULL; // MQTT服务器密码
147
148 // 初始化MQTT连接信息
149 MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
150 // 用于接收接口返回值
151 int ret = NetworkConnect(&network, (char *)host, port);
152
153 if(ret != 0){
154 printf("TCP Connect failed!,ret = %d\r\n",ret);
155 return;
156 }
157
158 // 设置用户名和密码
159 if (username != NULL && passwords != NULL)
160 {
161 connectData.username.cstring = (char *)username;
162 connectData.password.cstring = (char *)passwords;
163 }
164
165 /* 设置MQTT版本*/
166 // 3 = 3.1
167 // 4 = 3.1.1
168 connectData.MQTTVersion = 3;
169
170 // 设置MQTT客户端ID
171 connectData.clientID.cstring = (char *)clientId;
172
173 // 发送MQTT连接包
174 if ((ret = MQTTConnect(&client, &connectData)) != 0)
175 {
176 // 连接失败
177 printf("Connect MQTT Broker failed!,ret = %d\r\n",ret);
178 return;
179 }else{
180 // 成功连接到MQTT服务器
181 printf("MQTT Connected!\r\n");
182 }
183
184 char *topic = "control_led_topic"; // 订阅主题
185
186 if ((ret = MQTTSubscribe(&client, topic, QOS2, OnMessageArrived)) != 0)
187 {
188 // 订阅失败
189 printf("MQTTSubscribe failed: %d\r\n", ret);
190 return;
191 }else{
192 // 输出订阅成功信息
193 printf("MQTT Subscribe OK\r\n");
194 }
195
196 // 创建MQTT任务线程,接收订阅主题的消息
197 ret = ThreadStart(&client.thread, MqttTask, &client);
198 }
199
200 // 入口函数
mqttDemoEntry(void)201 static void mqttDemoEntry(void)
202 {
203 // 定义线程属性
204 osThreadAttr_t attr;
205 attr.name = "mqttDemoTask";
206 attr.attr_bits = 0U;
207 attr.cb_mem = NULL;
208 attr.cb_size = 0U;
209 attr.stack_mem = NULL;
210 attr.stack_size = 0x1000;
211 attr.priority = osPriorityNormal;
212
213 // 创建线程
214 if (osThreadNew(mqttDemoTask, NULL, &attr) == NULL)
215 {
216 printf("[mqttDemoEntry] Falied to create mqttDemoTask!\n");
217 }
218 }
219
220 // 运行入口函数
221 APP_FEATURE_INIT(mqttDemoEntry);
222