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