-
Notifications
You must be signed in to change notification settings - Fork 0
/
phantLoggerGSM.py
180 lines (153 loc) · 5.24 KB
/
phantLoggerGSM.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#! /usr/bin/python
####################################################################
# phant-loggerGSM.py
# Logs data to phant from a file
# Gopal Krishan Aggarwal
# April 23, 2016
# Contact: gopalkriagg@gmail.com
# Description: This piece of code reads data from a file
# from nth line and tries to write this data to cloud through GSM
# module. When succesful in writing this data it increments this number 'n'
# stored in a separate file named 'lineToBeUploadedNext.txt' and tries to
# now upload the n+1th line if it exists and goes so on.
# It also logs almost each action it takes into a file named log in the same folder.
########################################################################
import os
import urllib
import serial
import time
from bash import bash
script_dir = os.path.dirname(os.path.realpath(__file__)) #Get the directory where this script is located
log = open(script_dir + "/log", 'a', 1)
def gsmupload(privateKey, publicKey, params): #Tries to upload the data
#b = str(bash("ls /dev | grep ttyUSB | head -n 1").value())
#ser = serial.Serial('/dev/'+b,9600,timeout=1)
ser = serial.Serial('/dev/ttyO1', 9600, timeout = 1)
ser.flush()
ser.flushInput()
ser.flushInput()
ser.flushInput() #I feel there is need of more flushing as sometimes there is still data in buffer
ser.flushOutput()
time.sleep(1)
ser.write('AT+CIPSHUT\r\n')
time.sleep(1)
x = ser.read(50)
print x
log.write(x)
time.sleep(0.5)
ser.flushInput()
ser.write('AT+CSTT="airtelgprs.com","",""\r\n') #airtelgprs.com for airtel
time.sleep(1)
x = ser.read(50)
print x
log.write(x)
ser.flushInput()
ser.write('AT+CIICR\r\n')
time.sleep(1)
x = ser.read(50)
print x
log.write(x)
ser.flushInput()
time.sleep(5)
ser.write('AT+CIFSR\r\n')
time.sleep(0.1)
x = ser.read(50)
print x
log.write(x)
ser.flushInput()
ser.write('AT+CIPSTART="TCP","54.86.132.254","80"\r\n') #Sparkfun data.sparkfun.com: 54.86.132.254
time.sleep(3) #Sometimes it takes more time for connection (i.e. for "CONNECT OK" response)
x = ser.read(100)
print x
log.write(x)
ser.flushInput()
ser.write('AT+CIPSEND\r\n')
time.sleep(0.1)
x = ser.read(50)
print x
log.write(x)
ser.flushInput()
request = 'GET /input/' + publicKey + '?private_key=' + privateKey + '&' + params + ' HTTP/1.1\r\n\r\n'
print request
log.write(x)
ser.write(request)
time.sleep(1)
x = ser.read(50)
print x
log.write(x)
ser.flushInput()
ser.write(chr(26))
time.sleep(5) #Give time to send data
x = ser.read(200)
print x
log.write(x)
s = x
ser.flushInput()
time.sleep(1)
x = ser.read(300)
print x
log.write(x)
y = ser.read(300)
print y
z = ser.read(300)
print z
s = s + x + y + z
log.write(s)
if "1 success" in s or "200 OK" in s or "SEND OK" in s:
response = "success"
else:
response = "failure"
ser.flushInput()
ser.write('AT+CIPSHUT\r\n')
x = ser.read(50)
print x
log.write(x)
ser.flushInput()
time.sleep(20)
ser.flushInput()
ser.close()
return response
#Get the line to be uploaded next. If file not found lineToBeUploadedNext will be 0. (This line to be uploaded is located in another file named weatherLocalCopy.data)
lineToBeUploadedNextFile = os.path.join(script_dir, "lineToBeUploadedNext.txt")
if os.path.isfile(lineToBeUploadedNextFile) : #True if file exists
numberFile = open(lineToBeUploadedNextFile) #Default open mode is read
lineToBeUploadedNext = int(numberFile.read())
numberFile.close()
else :
lineToBeUploadedNext = 0
print "Line to be uploaded Next: " + str(lineToBeUploadedNext)
#################
## Phant Stuff ##
#################
server = "54.86.132.254" # This is the IP of data.sparkfun.com. Using IP instead of hostname may cause trouble in future if data.sparkfun.com changes their IP
publicKey = ""
privateKey = "" ##Enter private key here obtained from data.sparkfun.com
############################################
##Read sensor data from file and upload it##
############################################
data = {}
fields = ["hc", "i", "stock", "ts"] # Healthcenter fields
recordsFile = os.path.join(script_dir, "records")
f = open(recordsFile)
for i, line in enumerate(f):
if i >= lineToBeUploadedNext:
print "Value of i is: " + str(i)
array = line.split(',')
print array
for j in range(0, len(fields)):
data[fields[j]] = array[j] # In Phant all data is logged as String. Source: http://phant.io/docs/input/http/
params = urllib.urlencode(data)
print data
log.write(str(data))
print params
log.write(params)
response = gsmupload(privateKey, publicKey, params)
print response
log.write(response)
while not response == "success" :
response = gsmupload(privateKey, publicKey, params)
lineToBeUploadedNext += 1
fp = open(lineToBeUploadedNextFile, 'w', 0) #Update the line to be uploaded next
fp.write(str(lineToBeUploadedNext)) #Doubt as to what will happen when power goess off at this line
fp.close()
f.close()