Arduino NBduino Library  0.12.0
NBduinoLibrary.cpp
Go to the documentation of this file.
1 
12 #include <arduino.h>
13 #include <NBduinoLibrary.h>
14 
15 static SoftwareSerial mySerial(10, 11); //RX, TX
16 static char outword[1000];
17 static const char hexdigit[] = "0123456789ABCDEF";
18 static char hexnum[7];
19 
20 void(* Reset)(void) = 0;
21 
22 
23 char* int2hex(int number){
24  hexnum[0]=hexdigit[(number>>4)&0xF];
25  hexnum[1]=hexdigit[number&0xF];
26  hexnum[3]=0;
27  return hexnum;
28 }
29 
30 clean()
31 {
32  char buffer[200];
33  int len;
34  mySerial.setTimeout(1000);
35  while(1)
36  {
37  len=mySerial.readBytes(buffer,100);
38  if(len == 0) return;
39  }
40 }
41 
42 bool getIMEI(char* imei)
43 {
44  char buffer[100];
45  int len;
46  int i,j=0;
47  imei[0]=0;
48  mySerial.setTimeout(1000);
49  while(1)
50  {
51  len=mySerial.readBytesUntil('\n', buffer, sizeof(buffer));
52  if(len != 0)
53  {
54  for(i=0; i<len; i++) if((buffer[i] >= '0') && (buffer[i] <= '9')) imei[j++]=buffer[i];
55  if(strstr(buffer,"OK") != NULL)
56  {
57  imei[j]=0;
58  return true;
59  }
60  }
61  else return false;
62  };
63 }
64 
65 bool sync()
66 {
67  char buffer[200];
68  int len;
69  mySerial.setTimeout(1000);
70  while(1)
71  {
72  len=mySerial.readBytesUntil('\n', buffer, 100);
73  if(len == 0) return false;
74  if(strstr(buffer,"OK") != NULL) return true;
75  if(strstr(buffer,"ERROR") != NULL) return false;
76  };
77 }
78 
79 void sendCommand(char* command)
80 {
81  int i=0;
82  while(1)
83  {
84  clean();
85  mySerial.println(command);
86  if(sync()) return;
87  if(i++ > 3) Reset();
88  }
89 }
90 
91 void sendCommand(char* command, char* imei)
92 {
93  int i=0;
94  while(1)
95  {
96  clean();
97  mySerial.println(command);
98  if(getIMEI(imei)) return;
99  if(i++ > 3) Reset();
100  }
101 }
102 
103 
110 {
111 }
112 
122 NBduino::NBduino(const char * mqttServer, const int mqttPort, const char * mqttUser, const char * mqttPassword)
123 {
124  _mqttServer=mqttServer;
125  _mqttPort=mqttPort;
126  _mqttUser=mqttUser;
127  _mqttPassword=mqttPassword;
128  _timeToConn=120000;
129 }
130 
141 NBduino::NBduino(const char * mqttServer, const int mqttPort, const char * mqttUser, const char * mqttPassword, unsigned long timeToConn)
142 {
143  _mqttServer=mqttServer;
144  _mqttPort=mqttPort;
145  _mqttUser=mqttUser;
146  _mqttPassword=mqttPassword;
147  _timeToConn=timeToConn;
148 }
149 
156 NBduino::setAPN(const char * APN)
157 {
158  mySerial.print("AT*MCGDEFCONT=");
159  mySerial.print("\"");
160  mySerial.print("IP");
161  mySerial.print("\"");
162  mySerial.print(",");
163  mySerial.print("\"");
164  mySerial.print(APN);
165  mySerial.println("\"");
166  delay(500);
167  mySerial.print("AT+CGDCONT=1,");
168  mySerial.print("\"");
169  mySerial.print("IP");
170  mySerial.print("\"");
171  mySerial.print(",");
172  mySerial.print("\"");
173  mySerial.print(APN);
174  mySerial.print("\"");
175  mySerial.print(",");
176  mySerial.print("\"");
177  mySerial.print("\"");
178  mySerial.println(",0,0,0,,,,,,0,,0");
179  delay(500);
180  mySerial.println("AT+CEREG=5");
181  delay(500);
182  mySerial.println("AT+COPS=?");
183 }
184 
191 {
192  wakeup();
193  mySerial.begin(4800);
194  sendCommand("ATZ");
195  sendCommand("ATE0");
196  sendCommand("AT+CPIN?");
197  sendCommand("AT+CSQ");
198  sendCommand("AT+CGREG?");
199  sendCommand("AT+CGACT?");
200  sendCommand("AT+COPS?");
201  sendCommand("AT+CGCONTRDP");
202 }
203 
210 {
211  digitalWrite(_reset, LOW);
212  digitalWrite(_pwrkey, HIGH);
213  delay(2000);
214  digitalWrite(_pwrkey, LOW);
215 }
216 
223 {
224  digitalWrite(_pwrkey, HIGH);
225  delay(2000);
226  digitalWrite(_pwrkey, LOW);
227 }
228 
236 NBduino::publish(const char* topic, const char* value)
237 {
238  char command[200];
239  char outcode[10];
240  unsigned int len, i;
241  len = strlen(value);
242  sprintf(command,"AT+CMQPUB=0,\"%s\",1,0,0,%d,\"",topic, len*2);
243  clean();
244  mySerial.print(command);
245  for(i = 0; i<len; i++) {
246  mySerial.print(int2hex(value[i]));
247  }
248  mySerial.println("\"");
249  sync();
250 }
251 
258 NBduino::connect(const char* clientname)
259 {
260  char command[200];
261  sprintf(command,"AT+CMQNEW=\"%s\",\"%d\",12000,1024",_mqttServer,_mqttPort);
262  sendCommand(command);
263  sprintf(command,"AT+CMQCON=0,3,\"%s\",20000,0,0,\"%s\",\"%s\"", clientname, _mqttUser, _mqttPassword);
264  sendCommand(command);
265  sendCommand("AT+CREVHEX=1");
266  digitalWrite(_led, HIGH); //LED OFF
267 }
268 
275 {
276  sendCommand("AT+CMQDISCON=0");
277  digitalWrite(_led, LOW); //LED OFF
278 }
279 
286 bool NBduino::reqIMEI(char* imei)
287 {
288  sendCommand("AT+GSN", imei);
289 }
bool begin()
setAPN(const char *APN)
connect(const char *clientname)
contains the NBduino class definition and the include file that the class implementation needs...
bool reqIMEI(char *imei)
publish(const char *topic, const char *value)