source: rtos_arduino/trunk/arduino_lib/libraries/Milkcocoa_Arduino_SDK/Milkcocoa.cpp@ 180

Last change on this file since 180 was 180, checked in by ertl-honda, 8 years ago

ESP8266のライブラリの更新に伴う変更

File size: 6.7 KB
Line 
1/*
2The MIT License (MIT)
3
4Copyright (c) 2015 Technical Rockstars
5Copyright (C) 2015 Embedded and Real-Time Systems Laboratory
6 Graduate School of Information Science, Nagoya Univ., JAPAN
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23SOFTWARE.
24*/
25#include "Milkcocoa.h"
26#include "stdio.h"
27
28
29DataElement::DataElement() {
30 params = aJson.createObject();
31 paJsonObj = aJson.createObject();
32 aJson.addItemToObject(paJsonObj, "params", params);
33}
34
35DataElement::DataElement(char *json_string) {
36 paJsonObj = aJson.parse(json_string);
37 params = aJson.getObjectItem(paJsonObj, "params");
38}
39
40DataElement::~DataElement() {
41 aJson.deleteItem(paJsonObj);
42 paJsonObj = NULL;
43 params = NULL;
44}
45
46void DataElement::setValue(const char *key, const char *v) {
47 aJson.addStringToObject(params, key, v);
48}
49
50void DataElement::setValue(const char *key, int v) {
51 aJson.addNumberToObject(params, key, v);
52}
53
54void DataElement::setValue(const char *key, double v) {
55 aJson.addNumberToObject(params, key, v);
56}
57
58bool DataElement::getString(const char *key, char **pdata) {
59 aJsonObject* obj = aJson.getObjectItem(params, key);
60 if((obj == NULL) || (obj->type != aJson_String)) {return false;}
61 *pdata = obj->valuestring;
62 return true;
63}
64
65bool DataElement::getInt(const char *key, int *pdata) {
66 aJsonObject* obj = aJson.getObjectItem(params, key);
67 if((obj == NULL) || (obj->type != aJson_Int)) {return false;}
68 *pdata = obj->valueint;
69 return true;
70}
71
72bool DataElement::getFloat(const char *key, float *pdata) {
73 aJsonObject* obj = aJson.getObjectItem(params, key);
74 if((obj == NULL) || (obj->type != aJson_Float)) {return false;}
75 *pdata = obj->valuefloat;
76 return true;
77}
78
79char *DataElement::toCharArray() {
80 return aJson.print(paJsonObj);
81}
82
83Milkcocoa::Milkcocoa(Client *client, const char *host, uint16_t port, const char *_app_id, const char *client_id) {
84 app_id = _app_id;
85 mqtt = new Adafruit_MQTT_Client(client, host, port, client_id, "sdammy", app_id);
86
87 for (uint8_t i=0; i<MILKCOCOA_SUBSCRIBERS; i++) {
88 milkcocoaSubscribers[i] = 0;
89 }
90
91}
92
93Milkcocoa::Milkcocoa(Client *client, const char *host, uint16_t port, const char *_app_id, const char *client_id, const char *_session) {
94 sprintf(session, "%s", _session);
95 app_id = _app_id;
96 mqtt = new Adafruit_MQTT_Client(client, host, port, client_id, session, app_id);
97
98 for (uint8_t i=0; i<MILKCOCOA_SUBSCRIBERS; i++) {
99 milkcocoaSubscribers[i] = 0;
100 }
101
102}
103
104Milkcocoa* Milkcocoa::createWithApiKey(Client *client, const char *host, uint16_t port, const char *app_id, const char *client_id, const char *key, const char *secret)
105{
106 char session[60];
107 sprintf(session, "k%s:%s", key, secret);
108 return new Milkcocoa(client, host, port, app_id, client_id, session);
109}
110
111/*
112 * tmout
113 * 1- : Connect try time.
114 * 0 : retry Forever
115 * Return code
116 * 0 : Success
117 * other : Error code (see Adafruit_MQTT::connectErrorString())
118 */
119int8_t Milkcocoa::connect(int32_t tmout) {
120 int8_t ret;
121 int32_t retry = 0;
122
123 if (mqtt->connected()) {
124 return 0;
125 }
126
127 MILKCOCOA_DEBUG_PRINTLN("Connecting to MQTT... ");
128
129 while ((ret = mqtt->connect()) != 0) { // connect will return 0 for connected
130 mqtt->disconnect();
131 // Timeout
132 if ((tmout != 0) && (++retry == tmout)) {
133 return ret;
134 }
135 delay(MILKCOCOA_CONNECT_DELAY_MS);
136 }
137 MILKCOCOA_DEBUG_PRINTLN("MQTT Connected!");
138
139 return 0;
140}
141
142int8_t Milkcocoa::push(const char *path, DataElement *pdataelement, uint16_t timeout) {
143 char topic[100];
144 int8_t ret;
145 char *send_array;
146
147 if((ret = connect(timeout)) != 0){return ret;}
148
149 sprintf(topic, "%s/%s/push", app_id, path);
150 Adafruit_MQTT_Publish pushPublisher = Adafruit_MQTT_Publish(mqtt, topic);
151 send_array = pdataelement->toCharArray();
152 ret = (pushPublisher.publish(send_array))? 0 : MILKCOCOA_PUSH_ERRORNO;
153 free(send_array);
154 return ret;
155}
156
157int8_t Milkcocoa::send(const char *path, DataElement *pdataelement, uint16_t timeout) {
158 char topic[100];
159 int8_t ret;
160 char *send_array;
161
162 if((ret = connect(timeout)) != 0){return ret;}
163
164 sprintf(topic, "%s/%s/send", app_id, path);
165 Adafruit_MQTT_Publish pushPublisher = Adafruit_MQTT_Publish(mqtt, topic);
166 send_array = pdataelement->toCharArray();
167 ret = (pushPublisher.publish(send_array))? 0 : MILKCOCOA_PUSH_ERRORNO;
168 free(send_array);
169 return ret;
170}
171
172/*
173 * Return code
174 * 0 : Success
175 * other : Error code
176 * -1,1-6 : see Adafruit_MQTT::connectErrorString()
177 */
178int8_t Milkcocoa::loop(uint16_t timeout) {
179 int8_t ret;
180
181 if((ret = connect(timeout)) != 0){return ret;}
182
183 Adafruit_MQTT_Subscribe *subscription;
184 while ((subscription = mqtt->readSubscription(1000))) {
185 for (uint8_t i=0; i<MILKCOCOA_SUBSCRIBERS; i++) {
186 if(milkcocoaSubscribers[i] == 0) continue;
187 if (subscription == (milkcocoaSubscribers[i]->mqtt_sub) ) {
188 DataElement de = DataElement((char *)milkcocoaSubscribers[i]->mqtt_sub->lastread);
189 milkcocoaSubscribers[i]->cb( &de );
190 }
191 }
192 }
193
194 return 0;
195}
196
197bool Milkcocoa::on(const char *path, const char *event, GeneralFunction cb) {
198 MilkcocoaSubscriber *sub = new MilkcocoaSubscriber(cb);
199 sprintf(sub->topic, "%s/%s/%s", app_id, path, event);
200
201 uint8_t i;
202 Adafruit_MQTT_Subscribe *mqtt_sub = new Adafruit_MQTT_Subscribe(mqtt, sub->topic);
203 sub->set_mqtt_sub(mqtt_sub);
204 if(!mqtt->subscribe(mqtt_sub)) {
205 return false;
206 }
207 for (i=0; i<MILKCOCOA_SUBSCRIBERS; i++) {
208 if (milkcocoaSubscribers[i] == sub) {
209 return false;
210 }
211 }
212 for (i=0; i<MILKCOCOA_SUBSCRIBERS; i++) {
213 if (milkcocoaSubscribers[i] == 0) {
214 milkcocoaSubscribers[i] = sub;
215 return true;
216 }
217 }
218 return false;
219}
220
221MilkcocoaSubscriber::MilkcocoaSubscriber(GeneralFunction _cb) {
222 cb = _cb;
223}
224
225void MilkcocoaSubscriber::set_mqtt_sub(Adafruit_MQTT_Subscribe *_mqtt_sub) {
226 mqtt_sub = _mqtt_sub;
227}
228
229
Note: See TracBrowser for help on using the repository browser.