データの保存、更新、取得ができるWebサービス「milkcocoa」に接続し、データのプッシュ、送信、取得ができるライブラリです。 https://mlkcca.com/

Dependencies:   MQTT

Dependents:   MilkcocoaSample MilkcocoaSampleESP8266_LED MilkcocoaSampleESP8266 MilkcocoaSample_3G ... more

Committer:
jksoft
Date:
Tue Dec 15 09:56:32 2015 +0000
Revision:
0:23e533c4b1ec
Child:
1:4a634c06c5dc
??; Subscribe?1?????; ?Milkcocoa::on???????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:23e533c4b1ec 1 #include "Milkcocoa.h"
jksoft 0:23e533c4b1ec 2
jksoft 0:23e533c4b1ec 3 #if 1
jksoft 0:23e533c4b1ec 4 #include "SoftSerialSendOnry.h"
jksoft 0:23e533c4b1ec 5 extern SoftSerialSendOnry pc;
jksoft 0:23e533c4b1ec 6 #define DBG(x) x
jksoft 0:23e533c4b1ec 7 #else
jksoft 0:23e533c4b1ec 8 #define DBG(x)
jksoft 0:23e533c4b1ec 9 #endif
jksoft 0:23e533c4b1ec 10
jksoft 0:23e533c4b1ec 11 DataElement::DataElement() {
jksoft 0:23e533c4b1ec 12 json_msg[0] = '\0';
jksoft 0:23e533c4b1ec 13 strcpy(json_msg,"{\"params\":{");
jksoft 0:23e533c4b1ec 14 }
jksoft 0:23e533c4b1ec 15
jksoft 0:23e533c4b1ec 16 DataElement::DataElement(char *json_string) {
jksoft 0:23e533c4b1ec 17 json_msg[0] = '\0';
jksoft 0:23e533c4b1ec 18 strcpy(json_msg,json_string);
jksoft 0:23e533c4b1ec 19 }
jksoft 0:23e533c4b1ec 20
jksoft 0:23e533c4b1ec 21 void DataElement::setValue(const char *key, const char *v) {
jksoft 0:23e533c4b1ec 22 char json_string[64];
jksoft 0:23e533c4b1ec 23 if( json_msg[strlen(json_msg)-1] != '{' )
jksoft 0:23e533c4b1ec 24 {
jksoft 0:23e533c4b1ec 25 strcat(json_msg,",");
jksoft 0:23e533c4b1ec 26 }
jksoft 0:23e533c4b1ec 27 sprintf(json_string,"\"%s\":\"%s\"",key,v);
jksoft 0:23e533c4b1ec 28 strcat(json_msg,json_string);
jksoft 0:23e533c4b1ec 29 }
jksoft 0:23e533c4b1ec 30
jksoft 0:23e533c4b1ec 31 void DataElement::setValue(const char *key, int v) {
jksoft 0:23e533c4b1ec 32 char json_string[64];
jksoft 0:23e533c4b1ec 33 if( json_msg[strlen(json_msg)-1] != '{' )
jksoft 0:23e533c4b1ec 34 {
jksoft 0:23e533c4b1ec 35 strcat(json_msg,",");
jksoft 0:23e533c4b1ec 36 }
jksoft 0:23e533c4b1ec 37 sprintf(json_string,"\"%s\":\"%d\"",key,v);
jksoft 0:23e533c4b1ec 38 strcat(json_msg,json_string);
jksoft 0:23e533c4b1ec 39 }
jksoft 0:23e533c4b1ec 40
jksoft 0:23e533c4b1ec 41 void DataElement::setValue(const char *key, double v) {
jksoft 0:23e533c4b1ec 42 char json_string[64];
jksoft 0:23e533c4b1ec 43 if( json_msg[strlen(json_msg)-1] != '{' )
jksoft 0:23e533c4b1ec 44 {
jksoft 0:23e533c4b1ec 45 strcat(json_msg,",");
jksoft 0:23e533c4b1ec 46 }
jksoft 0:23e533c4b1ec 47 sprintf(json_string,"\"%s\":\"%f\"",key,v);
jksoft 0:23e533c4b1ec 48 strcat(json_msg,json_string);
jksoft 0:23e533c4b1ec 49 }
jksoft 0:23e533c4b1ec 50
jksoft 0:23e533c4b1ec 51 char *DataElement::getString(const char *key) {
jksoft 0:23e533c4b1ec 52 static char _word[64];
jksoft 0:23e533c4b1ec 53 char *p;
jksoft 0:23e533c4b1ec 54 int i=0;
jksoft 0:23e533c4b1ec 55
jksoft 0:23e533c4b1ec 56 strcpy(_word , "\"\0");
jksoft 0:23e533c4b1ec 57 strcat(_word , key );
jksoft 0:23e533c4b1ec 58 strcat(_word , "\"" );
jksoft 0:23e533c4b1ec 59
jksoft 0:23e533c4b1ec 60 p = strstr( (char*)json_msg , _word ) + 2 + strlen(_word);
jksoft 0:23e533c4b1ec 61
jksoft 0:23e533c4b1ec 62 while( (p[i] != ',')&&(p[i] != '\n')&&(p[i] != '\"') )
jksoft 0:23e533c4b1ec 63 {
jksoft 0:23e533c4b1ec 64 _word[i] = p[i];
jksoft 0:23e533c4b1ec 65 i++;
jksoft 0:23e533c4b1ec 66 }
jksoft 0:23e533c4b1ec 67 _word[i] = '\0';
jksoft 0:23e533c4b1ec 68
jksoft 0:23e533c4b1ec 69 return _word;
jksoft 0:23e533c4b1ec 70 }
jksoft 0:23e533c4b1ec 71
jksoft 0:23e533c4b1ec 72 int DataElement::getInt(const char *key) {
jksoft 0:23e533c4b1ec 73 return atoi(getString(key));
jksoft 0:23e533c4b1ec 74 }
jksoft 0:23e533c4b1ec 75
jksoft 0:23e533c4b1ec 76 float DataElement::getFloat(const char *key) {
jksoft 0:23e533c4b1ec 77 return atof(getString(key));
jksoft 0:23e533c4b1ec 78 }
jksoft 0:23e533c4b1ec 79
jksoft 0:23e533c4b1ec 80 char *DataElement::toCharArray() {
jksoft 0:23e533c4b1ec 81 if( json_msg[strlen(json_msg)-1] != '{' )
jksoft 0:23e533c4b1ec 82 {
jksoft 0:23e533c4b1ec 83 strcat(json_msg,"}");
jksoft 0:23e533c4b1ec 84 }
jksoft 0:23e533c4b1ec 85 strcat(json_msg,"}");
jksoft 0:23e533c4b1ec 86
jksoft 0:23e533c4b1ec 87 return(json_msg);
jksoft 0:23e533c4b1ec 88 }
jksoft 0:23e533c4b1ec 89
jksoft 0:23e533c4b1ec 90 Milkcocoa::Milkcocoa(MQTTESP8266 *ipstack, const char *host, uint16_t port, const char *_app_id, const char *client_id) : client(MQTT::Client<MQTTESP8266, Countdown>(*ipstack)) {
jksoft 0:23e533c4b1ec 91
jksoft 0:23e533c4b1ec 92 _ipstack = ipstack;
jksoft 0:23e533c4b1ec 93 strcpy(servername,host);
jksoft 0:23e533c4b1ec 94 portnum = port;
jksoft 0:23e533c4b1ec 95 app_id = _app_id;
jksoft 0:23e533c4b1ec 96 strcpy(_clientid,client_id);
jksoft 0:23e533c4b1ec 97 strcpy(username,"sdammy");
jksoft 0:23e533c4b1ec 98 strcpy(password,app_id);
jksoft 0:23e533c4b1ec 99
jksoft 0:23e533c4b1ec 100 }
jksoft 0:23e533c4b1ec 101
jksoft 0:23e533c4b1ec 102 Milkcocoa::Milkcocoa(MQTTESP8266 *ipstack, const char *host, uint16_t port, const char *_app_id, const char *client_id, char *_session) : client(MQTT::Client<MQTTESP8266, Countdown>(*ipstack)) {
jksoft 0:23e533c4b1ec 103
jksoft 0:23e533c4b1ec 104 _ipstack = ipstack;
jksoft 0:23e533c4b1ec 105 strcpy(servername,host);
jksoft 0:23e533c4b1ec 106 portnum = port;
jksoft 0:23e533c4b1ec 107 app_id = _app_id;
jksoft 0:23e533c4b1ec 108 strcpy(_clientid,client_id);
jksoft 0:23e533c4b1ec 109 strcpy(username,_session);
jksoft 0:23e533c4b1ec 110 strcpy(password,app_id);
jksoft 0:23e533c4b1ec 111
jksoft 0:23e533c4b1ec 112 }
jksoft 0:23e533c4b1ec 113
jksoft 0:23e533c4b1ec 114 Milkcocoa* Milkcocoa::createWithApiKey(MQTTESP8266 *ipstack, const char *host, uint16_t port, const char *_app_id, const char *client_id, char *key, char *secret) {
jksoft 0:23e533c4b1ec 115 char session[60];
jksoft 0:23e533c4b1ec 116 sprintf(session, "k%s:%s", key, secret);
jksoft 0:23e533c4b1ec 117 return new Milkcocoa(ipstack, host, port, _app_id, client_id, session);
jksoft 0:23e533c4b1ec 118 }
jksoft 0:23e533c4b1ec 119
jksoft 0:23e533c4b1ec 120 void Milkcocoa::connect() {
jksoft 0:23e533c4b1ec 121
jksoft 0:23e533c4b1ec 122 if(client.isConnected())
jksoft 0:23e533c4b1ec 123 return;
jksoft 0:23e533c4b1ec 124
jksoft 0:23e533c4b1ec 125 if(_ipstack->connect(servername, portnum)!=0) {
jksoft 0:23e533c4b1ec 126 DBG(pc.printf("Network connect err\r\n");)
jksoft 0:23e533c4b1ec 127 return;
jksoft 0:23e533c4b1ec 128 }
jksoft 0:23e533c4b1ec 129
jksoft 0:23e533c4b1ec 130 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
jksoft 0:23e533c4b1ec 131 data.keepAliveInterval = 20;
jksoft 0:23e533c4b1ec 132 data.cleansession = 1;
jksoft 0:23e533c4b1ec 133 data.MQTTVersion = 4;
jksoft 0:23e533c4b1ec 134 data.clientID.cstring = _clientid;
jksoft 0:23e533c4b1ec 135 data.username.cstring = username;
jksoft 0:23e533c4b1ec 136 data.password.cstring = password;
jksoft 0:23e533c4b1ec 137
jksoft 0:23e533c4b1ec 138 if (client.connect(data) != 0) {
jksoft 0:23e533c4b1ec 139 DBG(pc.printf("Milkcocoa connect err\r\n");)
jksoft 0:23e533c4b1ec 140 return;
jksoft 0:23e533c4b1ec 141 }
jksoft 0:23e533c4b1ec 142 }
jksoft 0:23e533c4b1ec 143
jksoft 0:23e533c4b1ec 144 bool Milkcocoa::push(const char *path, DataElement dataelement) {
jksoft 0:23e533c4b1ec 145 char topic[100];
jksoft 0:23e533c4b1ec 146 char *buf;
jksoft 0:23e533c4b1ec 147 MQTT::Message message;
jksoft 0:23e533c4b1ec 148
jksoft 0:23e533c4b1ec 149 sprintf(topic, "%s/%s/push", app_id, path);
jksoft 0:23e533c4b1ec 150
jksoft 0:23e533c4b1ec 151 message.qos = MQTT::QOS0;
jksoft 0:23e533c4b1ec 152 message.retained = 0;
jksoft 0:23e533c4b1ec 153 message.dup = false;
jksoft 0:23e533c4b1ec 154 buf = dataelement.toCharArray();
jksoft 0:23e533c4b1ec 155 message.payload = (void*)buf;
jksoft 0:23e533c4b1ec 156 message.payloadlen = strlen(buf);
jksoft 0:23e533c4b1ec 157 if(client.publish(topic, message)!=0)
jksoft 0:23e533c4b1ec 158 return(false);
jksoft 0:23e533c4b1ec 159
jksoft 0:23e533c4b1ec 160 return true;
jksoft 0:23e533c4b1ec 161 }
jksoft 0:23e533c4b1ec 162
jksoft 0:23e533c4b1ec 163 bool Milkcocoa::send(const char *path, DataElement dataelement) {
jksoft 0:23e533c4b1ec 164 char topic[100];
jksoft 0:23e533c4b1ec 165 char *buf;
jksoft 0:23e533c4b1ec 166 MQTT::Message message;
jksoft 0:23e533c4b1ec 167
jksoft 0:23e533c4b1ec 168 sprintf(topic, "%s/%s/send", app_id, path);
jksoft 0:23e533c4b1ec 169 message.qos = MQTT::QOS0;
jksoft 0:23e533c4b1ec 170 message.retained = 0;
jksoft 0:23e533c4b1ec 171 message.dup = false;
jksoft 0:23e533c4b1ec 172 buf = dataelement.toCharArray();
jksoft 0:23e533c4b1ec 173 message.payload = (void*)buf;
jksoft 0:23e533c4b1ec 174 message.payloadlen = strlen(buf);
jksoft 0:23e533c4b1ec 175 if(client.publish(topic, message)!=0)
jksoft 0:23e533c4b1ec 176 return false;
jksoft 0:23e533c4b1ec 177
jksoft 0:23e533c4b1ec 178 return true;
jksoft 0:23e533c4b1ec 179 }
jksoft 0:23e533c4b1ec 180
jksoft 0:23e533c4b1ec 181 void Milkcocoa::loop() {
jksoft 0:23e533c4b1ec 182 connect();
jksoft 0:23e533c4b1ec 183 client.yield(RECV_TIMEOUT);
jksoft 0:23e533c4b1ec 184 }
jksoft 0:23e533c4b1ec 185
jksoft 0:23e533c4b1ec 186 bool Milkcocoa::on(const char *path, const char *event, GeneralFunction cb) {
jksoft 0:23e533c4b1ec 187 static char topic[100];
jksoft 0:23e533c4b1ec 188
jksoft 0:23e533c4b1ec 189 sprintf(topic, "%s/%s/%s", app_id, path, event);
jksoft 0:23e533c4b1ec 190
jksoft 0:23e533c4b1ec 191 if (client.subscribe(topic, MQTT::QOS0, cb) != 0) {
jksoft 0:23e533c4b1ec 192 DBG(pc.printf("Milkcocoa subscribe err\r\n");)
jksoft 0:23e533c4b1ec 193 return false;
jksoft 0:23e533c4b1ec 194 }
jksoft 0:23e533c4b1ec 195 return true;
jksoft 0:23e533c4b1ec 196 }
jksoft 0:23e533c4b1ec 197